IDA 动态调试 - ELF

使用 IDA 对 ELF 文件进行简单的动态调试。

程序流程

将文件下载到本地之后使用编辑器打开,可以看到是一个 ELF 文件。放在 Linux 下运行,可知道是一个” 打怪” 的一个小程序:需要通过打怪提高战斗力,最后杀死巨龙。

根据信息可得知需要 Combat 超过一定数值才行,思路大概可分为以下几种:

  1. 正常运行,慢慢升级,直至通关;
  2. 静态修改 ELF 文件中的特定值,如 coins、Combat 等;
  3. 动态调试,将逻辑判断 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
2
jle 是指有符号小于等于则跳转
jz 是指为 0 则跳转

之后再重复两次该操作即可获取 flag