一个简单LINUX程序的逆向

开始之前的准备:

反汇编:IDA

十六进制编辑器: Hexworkshop

LINUX环境: KALI LINUX

调试: EDB (KALI自带的)

 

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

 

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

 

image

 

 

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

 

image

 

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

下面说下我的做法吧:

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

 

把这个CM3扔到IDA中静态分析image

 

 

 

 

 

 

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

 

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

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

 

 

image 

 

 

 

 

 

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

 

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

image

 

 

 

 

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

用EDB 载入

image

 

 

一路F8来到关键CALL

image

 

前面的赋值对应于

image

 

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

image

 

 

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

 

 

image

TEST EAX,EAX  

JNZ 。。。。

验证密码是否正确。

 

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

image

 

 

 

 

image

 

就搞定了……

image

posted @ 2014-03-21 18:51  wu-yan  阅读(6003)  评论(0编辑  收藏  举报