IDA 动态调试 - ELF
使用 IDA 对 ELF 文件进行简单的动态调试。
程序流程
将文件下载到本地之后使用编辑器打开,可以看到是一个 ELF 文件。放在 Linux 下运行,可知道是一个” 打怪” 的一个小程序:需要通过打怪提高战斗力,最后杀死巨龙。
根据信息可得知需要 Combat 超过一定数值才行,思路大概可分为以下几种:
- 正常运行,慢慢升级,直至通关;
- 静态修改 ELF 文件中的特定值,如 coins、Combat 等;
- 动态调试,将逻辑判断 nop 掉。
这里选择通过 IDA 进行动态调试进行 pass。
静态分析
使用 IDA 打开该文件,可以发现几个关键函数:decrypt1、decrypt2、decrypt3、outflag、slime、boss、store 等
由于已经知道需要打怪才能获取 flag,那么直接查看 boss 函数的伪代码 (F5)
可以看到需要打三次 boss 才能成功获取 flag,那么只需要将三次的 if 判断语句跳过即可。
动态调试
在 IDA 视图跳转至 main 函数之后,在 main 函数下一个断点,然后启动 debug,这里选择 Remote Linux debugger,之后需要配置程序目录、hostname、password 等。
在 Linux 虚拟机中运行 ifconfig
获取 IP 地址,之后运行./linux_server64
。Ps:该文件来自 IDA dbgsrv 目录。之后将 ip 填入 hostname,将 Linux 用户密码填入 Password,并将程序放置 Linux 虚拟机中指定位置,如 /root/ 桌面,最后将信息填入对应文本框
启动 debug,可以看到程序被成功断在刚刚下断点的位置,之后通过单步或者直接查看 boss 函数的地址,将断点设在 boss 函数入口
在 Linux 中输入 2,使其运行至 boss 函数,在 IDA 中单步运行至 4015FE 地址,发现会 jle 至 401628 地址,通过【Edit】-【Patch program】-【Patch Bytes】将第一位字节修改成 74,使其不跳转。之后可以看到程序会运行至第一个解密函数 decrypt1
1 | jle 是指有符号小于等于则跳转 |
之后再重复两次该操作即可获取 flag