一个简单LINUX程序的逆向

开始之前的准备:

反汇编:IDA

十六进制编辑器: Hexworkshop

LINUX环境: KALI LINUX

调试: EDB (KALI自带的)

 

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

 

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

 

一个简单LINUX程序的逆向_第1张图片

 

 

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

 

一个简单LINUX程序的逆向_第2张图片

 

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

下面说下我的做法吧:

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

 

把这个CM3扔到IDA中静态分析一个简单LINUX程序的逆向_第3张图片

 

 

 

 

 

 

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

 

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

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

 

 

一个简单LINUX程序的逆向_第4张图片 

 

 

 

 

 

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

 

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

一个简单LINUX程序的逆向_第5张图片

 

 

 

 

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

用EDB 载入

一个简单LINUX程序的逆向_第6张图片

 

 

一路F8来到关键CALL

一个简单LINUX程序的逆向_第7张图片

 

前面的赋值对应于

一个简单LINUX程序的逆向_第8张图片

 

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

一个简单LINUX程序的逆向_第9张图片

 

 

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

 

 

一个简单LINUX程序的逆向_第10张图片

TEST EAX,EAX  

JNZ 。。。。

验证密码是否正确。

 

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

一个简单LINUX程序的逆向_第11张图片

 

 

 

 

一个简单LINUX程序的逆向_第12张图片

 

就搞定了……

一个简单LINUX程序的逆向_第13张图片

你可能感兴趣的:(linux)