一个简单LINUX程序的逆向

时间:2021-05-18 01:42:27

开始之前的准备:

反汇编:IDA

十六进制编辑器: Hexworkshop

LINUX环境: KALI LINUX

调试: EDB (KALI自带的)

  一个简单的动态追码, 大牛们就略过吧……

用16进制打开看看,前面有个明显的ELF标志

一个简单LINUX程序的逆向

然后运行下看是啥样的……

一个简单LINUX程序的逆向

额。。。  一个输入密码   然后验证的程序

下面说下我的做法吧:

主要是    静态分析(IDA)    和动态调试  (EDB)

把这个CM3扔到IDA中静态分析一个简单LINUX程序的逆向

在它调用的函数名称表里可以看到   GETS,MEMCMP等函数。。。。       然后可以自己脑补一下这个程序的运作了。。。。

用IDA的反编译功能,      在主界面F5一下 就能得到  接近源码的东西

(算法看起来很复杂的样子)

一个简单LINUX程序的逆向

前面还有一大堆赋值语句暂时先不管。。

然后这里是关键点,拿 2个字符串进行 比较,  正确就出答案   ……  而在IDA分析中  这2个字符串的值都是未定义,  所以可以想到应该是在动态调试中生成的。

一个简单LINUX程序的逆向

然后进入第2部分  :动态调试阶段

用EDB 载入

一个简单LINUX程序的逆向

一路F8来到关键CALL

一个简单LINUX程序的逆向

前面的赋值对应于

一个简单LINUX程序的逆向

继续F8可以看到一堆CALL,   于IDA分析的  PUTS()等函数对应

一个简单LINUX程序的逆向

密码是经过算法动态生成的, 通过分析源码中有一个CALL (MEMCMP) ,对应的反汇编也会有,所以我们一路跟至程序末尾,找到这个CALL  , 此时内存中也会有相应的密码。

一个简单LINUX程序的逆向

TEST EAX,EAX

JNZ 。。。。

验证密码是否正确。

此时栈中也有了对应的密码….

一个简单LINUX程序的逆向

一个简单LINUX程序的逆向

就搞定了……

一个简单LINUX程序的逆向