老伙计,别太相信返回地址
有些朋友曾经问过这么个问题
“通过Microsoft编译器扩展指令ReturnAddress , 我可以轻易的知道代码执行流返回到调用者后的下一条指令的地址 。 那么 , 我怎样才能通过返回地址来确定它属于哪个DLL呢?”
要小心了
即使你知道这个返回地址属于哪个DLL(使用GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS) , 那也不一定是那个实际调用的DLL 。
我可以想到的一个小技巧是:在一个”可信的”DLL里对某些特定的字节进行搜索 , 根据搜索到的结果 , 你(攻击者)就可以决定是否执行它 。
我们可以简单的使用”retd”这条指令实现这个功能点 。 然后攻击者可以创建如下图所示的一个栈帧(StackFrame) , 例如 , 一个带有两个参数的函数:

文章图片
构建完上述的栈帧之后 , 攻击者可以通过指令跳转到那个被攻击的函数上 。
【老伙计,别太相信返回地址】这个被攻击的函数查看了返回地址并观察到了一个指向可信DLL的地址trusted_retd , 然后它就信任了调用者并使用攻击者构造的2个参数进行了不安全的操作 。
紧接着 , 被攻击函数执行了一条”retd8″来返回并清理参数 。 这个操作将导致控制流转移到trusted_retd , 这条指令只是简单的一条retd指令 , 这将会把控制权转移到hacker_code_addr这个位置 , 然后攻击者就可以使用这个结果进行后续的攻击流程 。
这就是为什么当你听到有人说”我的代码对调用者进行了身份验证 , 确保调用者是可信的”时需要保持警惕的原因 。 因为 , 他们怎么知道调用者是谁呢?
最后
RaymondChen的《TheOldNewThing》是我非常喜欢的博客之一 , 里面有很多关于Windows的小知识 , 对于广大Windows平台开发者来说 , 确实十分有帮助 。
本文来自:《Don’ttrustthereturnaddress》

文章图片
推荐阅读
- 养老金|2021年上半年办理退休,养老金核算的这些知识要把握
- 晒晒我家一周的晚餐,每天3个菜,每天都不重样,老公直夸真贤惠
- 虾别再煮着吃了,我换种做法外酥里嫩,老公一口气干掉一盘,佩服
- 医生|65岁老汉突然昏迷,三小时后离世,医生遗憾:这玩物害了不少老年人
- 家常炖老母鸡,不用炖3小时,教你一妙招,40分钟鸡肉软嫩入味
- 好吃不贵的解馋下饭菜,常做给老人孩子吃,强壮骨骼,保护视力!
- 成本3块钱的早餐饼,不放面粉,软糯香甜,老人孩子吃到回味无穷
- 红薯要多吃,排毒通便抗衰老,教你几种红薯做法,吃一口就爱上
- 2元买一块,春天多给家人吃,高蛋白高钙易吸收,老人孩子要多吃
- 自从学会做这个,我家隔三差五吃,拌一拌上锅一蒸,蘸着料吃,老香了
