IDA动态调试-ELF

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

hero

程序流程

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

hero

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

  1. 正常运行,慢慢升级,直至通关;
  2. 静态修改ELF文件中的特定值,如coins、Combat等;
  3. 动态调试,将逻辑判断nop掉。

这里选择通过IDA进行动态调试进行pass。

静态分析

使用IDA打开该文件,可以发现几个关键函数:decrypt1、decrypt2、decrypt3、outflag、slime、boss、store等

ida

由于已经知道需要打怪才能获取flag,那么直接查看boss函数的伪代码(F5)

ida

可以看到需要打三次boss才能成功获取flag,那么只需要将三次的if判断语句跳过即可。

动态调试

在IDA视图跳转至main函数之后,在main函数下一个断点,然后启动debug,这里选择Remote Linux debugger,之后需要配置程序目录、hostname、password等。

ida

在Linux虚拟机中运行ifconfig获取IP地址,之后运行./linux_server64。Ps:该文件来自IDA dbgsrv目录。之后将ip填入hostname,将Linux用户密码填入Password,并将程序放置Linux虚拟机中指定位置,如/root/桌面,最后将信息填入对应文本框

ida

启动debug,可以看到程序被成功断在刚刚下断点的位置,之后通过单步或者直接查看boss函数的地址,将断点设在boss函数入口

ida

在Linux中输入2,使其运行至boss函数,在IDA中单步运行至4015FE地址,发现会jle至401628地址,通过【Edit】-【Patch program】-【Patch Bytes】将第一位字节修改成74,使其不跳转。之后可以看到程序会运行至第一个解密函数decrypt1

1
2
jle 是指有符号小于等于则跳转
jz 是指为 0 则跳转

ida

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

hero