吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 3061|回复: 6
收起左侧

[转贴] 【转帖】反-反汇编patch学习(二)

[复制链接]
默小白 发表于 2019-4-10 17:55

转自:https://xz.aliyun.com/t/4721

上一篇文章中主要是一种花指令的思路

  1. 把当前的RIP的值pop到寄存器中,比如rax
  2. 调整rax的值,使之处于反汇编引擎的解析的某条指令中间,让反汇编引擎出错,但实际上可以正确跳转,解决方法是帮助IDA正确识别数据和代码

这篇文章主要是在子函数中劫持父函数的流程

使用的测试文件在附件中

栈上相关背景

在函数调用时,call xxx会将下一条指令的地址压栈,再前往要跳转的指令

当子函数调用结束,retn会将之前保存的指令地址置为RIP的值,也就是说,retn == pop rip

子函数调用时,一开始可能会把RBP压栈,并把RSP的值赋给RBP,在退出函数时进行逆操作

无论是哪种情况,可以发现,父函数的返回地址也只是栈上保存的一个数据而已,也没有保护机制:比如子函数只能把RSP的值控制在一定范围内

也就是说,我们可以在子函数中获得父函数的ret addr,将其pop到寄存器中,再修改这个寄存器的值,当子函数retn时,父函数的返回地址也就被劫持了

实例

伪造子函数

我们还是拿上一篇文章中的nothing-patched.exe做演示,在附件中

这是正常的原程序流程

img

最后一行的call sub_140001031是我改成nop后加上的

img

可以认为我们在这边伪造一个子函数

修改retaddr

此时rbx就是父函数的返回地址,而现在只是add rbx,0,并没有改变返回地址,只要把这个0改一下,就可以劫持流程了

img

可以看到,当前执行到retn,在堆栈窗口正好会回到...102E,它也就是原本call指令的下一条指令的地址

记为patched1,在附件中

如果这时我们将add rbx,0改成add rbx,46,那么就会跳转到源程序流程了

img

加花

我们通过动态调试,让返回地址加上0x19,也就是跳转到下一个jmp指令上,记作patched2

img

重新打开可以发现IDA已经识别错误了

这是因为在...1047处的jmp指令的前一个byte改成了如0xEB,这样就会让静态的反汇编引擎分析成错误jmp

img

上图为动态调试时的场景

同样的,F5的结果也已经飞了

img

去花

加上0xEB的这个技巧在上一篇文章已经说过了,去花也只是需要帮助IDA正确识别代码和数据等

补充

最后,因为本文只是介绍一下反-反汇编的小技巧,单一的技巧会显得比较单薄,但是如果把这些技巧组合起来,加上反调试等技术,会让代码变得很"难看",破解的难度也是指数级上升

免费评分

参与人数 1吾爱币 +1 收起 理由
lookerJ + 1 热心回复!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

ts0001 发表于 2019-4-11 13:21
学习了 非常有用、辛苦了
ts0001 发表于 2019-4-11 13:23
seatofish 发表于 2019-4-11 14:40
Misscitel 发表于 2019-4-11 18:24
学习了 楼主辛苦
w668 发表于 2019-4-11 20:37
楼主辛苦了
yagamma 发表于 2019-5-6 03:30
感谢楼主分享
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止灌水或回复与主题无关内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-4-20 23:04

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表