前言
该文内容是作者在学习逆向时遇到有关动态调试的内容总结,希望能够帮助到各位有该方面学习需求的友友。
简介
先来了解一下下面的几个问题:
1.什么是动态调试和静态调试?
静态调试
静态分析是一种调试方法,通过自动检查源代码来完成,而无需执行程序。简单来说就是通过肉眼输入在大脑中执行程序的过程。
动态调试
动态调试是指软件作者利用集成环境(IDE)自带的调试器跟踪自己软件的运行,来协助解决自己软件的错误。 要成为一位优秀的软件工程师,调试能力是不可或缺的。
2.怎么动态调试?
一般的话我们可以使用IDA和ollydbg实现动态调试,(注:早期的ollydbg只能运行32位程序,不过后面吾爱有大佬写出了64位的,有需要的话可以去找找)
下面是我们在做题中可能遇到的动态调试相关使用问题,并有例题作为讲解,有些题目是可以在nssctf平台上直接搜索找到原题,方便各位对照上手学习。
技巧一:调用未引用函数
使用情况:
一般当静态分析无法解决问题时,可以考虑使用动态调试。
例:[[BJDCTF 2020]Easy]
在静态分析之后找到关键函数,但是发现这个函数并没有被引用,因此有两种思路来调用函数,
方法一是我们可以在IDA中通过修改eip来使其跳转到ques函数;
步骤:
1.先记下ques的引用地址,此处为0x00401520;
2.之后主主函数运行的途中随便下一个断点:
3.选择调试器后进行动调,然后将对应的EIP修改成ques函数的地址即可:
4.继续运行,即可看到ques中的内容
方法二是在OD中直接将函数设置成新的EIP然后运行;
步骤:
1.先在IDA中找到函数的入口地址:
2.在此处push处可知地址为0x00401520,然后打开OD找到该地址:
3.然后将这里设置新的EIP
4.然后f9运行即可:
技巧二:获取进程内容数据
当发现题目中涉及到的程序内部值无法查看和获取时,可以通过动调获取内容数值。
例:[HUBUCTF 2022 新生赛]help
迷宫题,找迷宫,
拿不到,在程序运行处下断点,然后运行:
进去随便输:
之后再点击map即可看到地图:
技巧三:匹配绕过
当发现有if判断比对时,可通过动调加载获取匹配值
例:[HNCTF 2022 Week1]CrackMe
进入函数后看到有个循环,然后有string1和string2的子串比对,进而输出判断结果;
经分析可知string1为输入值,string2为所需的注册码,故在判断结束的地方下断点然后运行可获得匹配值,这里依旧用IDA调试和OD调试两种办法;
2.1 IDA调试:
之后即可获得匹配值:
2.2 OD调试
在IDA中我们已经知道了程序的判断条件,故直接f9运行之后跟随到上一条指令:
条件跳转到上个函数口:
之后即可在上个窗口发现匹配值:
技巧四:修改判断函数跳转值
例:game
反编译查看getflag函数
下一个断点调试
f8调试,将zf标志位处更改为0x1 (这里是因为zf是条件判断的符号标志位,1代表真,0代表假)
修改完成后f8运行即可看见flag
技巧五:SMC解密
例:[羊城杯 2021]BabySmc
这里可以参考一个大佬的WP,写得非常好!
https://blog.csdn.net/weixin_61154173/article/details/128695474
关于SMC:
SMC,即Self Modifying Code,动态代码加密技术,指通过修改代码或数据,阻止别人直接静态分析,然后在动态运行程序时对代码进行解密,达到程序正常运行的效果。
而计算机病毒通常也会采用SMC技术动态修改内存中的可执行代码来达到变形或对代码加密的目的,从而躲过杀毒软件的查杀或者迷惑反病毒工作者对代码进行分析。
判断特征:
1.VirtualProtect()
参数
lpAddress是要改变属性的内存起始地址, dwSize是要改变属性的内存区域大小, flAllocationType是内存新的属性类型, lpflOldProtect内存原始属性类型保存地址
2.mprotect()
技巧六:elf文件远程调试
具体步骤:
Linux:
chmod + x linux_server64 chmod +x 你的待调试文件名
./linux_server64