开始之前的准备:
反汇编:IDA
十六进制编辑器: Hexworkshop
LINUX环境: KALI LINUX
调试: EDB (KALI自带的)
用16进制打开看看,前面有个明显的ELF标志
然后运行下看是啥样的……
额。。。 一个输入密码 然后验证的程序
下面说下我的做法吧:
主要是 静态分析(IDA) 和动态调试 (EDB)
把这个CM3扔到IDA中去 , 可以得到:
在它调用的函数名称表里可以看到 GETS,MEMCMP等函数。。。。 然后可以自己脑补一下这个程序的运作了。。。。
用IDA的反编译功能, 在主界面F5一下 就能得到 接近源码的东西
(算法看起来很复杂的样子)
前面还有一大堆赋值语句暂时先不管。。
然后这里是关键点,拿 2个字符串进行 比较, 正确就出答案 …… 而在IDA分析中 这2个字符串的值都是未定义, 所以可以想到应该是在动态调试中生成的。
然后进入第2部分 :动态调试阶段
用EDB 载入
用EDB 载入, 一路F8来到关键CALL
前面的赋值对应于
继续F8可以看到一堆CALL, 于IDA分析的 PUTS()等函数对应
密码是经过算法动态生成的, 通过分析源码中有一个CALL (MEMCMP) ,对应的反汇编也会有,所以我们一路跟至程序末尾,找到这个CALL , 此时内存中也会有相应的密码。
TEST EAX,EAX
JNZ 。。。。
验证密码是否正确。
此时栈中也有了对应的密码….
就搞定了……