在 http://csapp.cs.cmu.edu/public/labs.html 下了个32位的bomb文件。。
使用
-objdump -d bomb
得到反汇编的代码
= =一大坨的完全被吓到了有木有
然后看到有main函数还有6个phase,于是抓住重点开始研究
call <phase_x> 之后如果ret出来再调用<phase_defused>就表示拆蛋。。!弹成功了
不然就会爆炸。
所以我们深入到每个phase_x里面研究。
先来看phase_1
08048b20 <phase_1>:
8048b20: 55 push %ebp
8048b21: 89 e5 mov %esp,%ebp
8048b23: 83 ec 08 sub $0x8,%esp
8048b26: 8b 45 08 mov 0x8(%ebp),%eax
8048b29: 83 c4 f8 add $0xfffffff8,%esp
8048b2c: 68 c0 97 04 08 push $0x80497c0
8048b31: 50 push %eax
8048b32: e8 f9 04 00 00 call 8049030 <strings_not_equal> ;这个函数改变了%eax的值
8048b37: 83 c4 10 add $0x10,%esp
8048b3a: 85 c0 test %eax,%eax
8048b3c: 74 05 je 8048b43 <phase_1+0x23> ;如果eax不为0,那么字符串正确
8048b3e: e8 b9 09 00 00 call 80494fc <explode_bomb>
8048b43: 89 ec mov %ebp,%esp
8048b45: 5d pop %ebp
8048b46: c3 ret
8048b47: 90 nop
我们看到,
其中会调用<strings_not_equal>函数,之后再判断寄存器%eax是否为0,如果为0的话,phase_1正常ret,不然就调用explode_bomb引爆炸弹
所以关键就是strings_not_equal函数,部分代码见下面:
08049030 <strings_not_equal>:
8049030: 55 push %ebp
8049031: 89 e5 mov %esp,%ebp
8049033: 83 ec 0c sub $0xc,%esp
8049036: 57 push %edi
8049037: 56 push %esi
8049038: 53 push %ebx
8049039: 8b 75 08 mov 0x8(%ebp),%esi
804903c: 8b 7d 0c mov 0xc(%ebp),%edi
804903f: 83 c4 f4 add $0xfffffff4,%esp
8049039: 8b 75 08 mov 0x8(%ebp),%esi
804903c: 8b 7d 0c mov 0xc(%ebp),%edi
这两行可以看出strings_not_equal有两个参数,那么是哪两个呢?我们回到phase_1里面,看到再调用之前的两个进栈命令
进栈的分别是%eax和$0x80497c0,猜测比较两个字符串的函数的参数必然是两个指向char类型的指针,所以继续猜想eax是我们输入的字符串,而0x80497c0就是系统给定的字符串了,然后从整个文件里搜0x80497c0.发现什么都没有= =怎么办好zhaoji!!!。。。。
不过我们好像忘了什么东西!!gdb!!以前调试C的时候用过,发现不方便就再也不用了!没想到它在逆向工程的时候这么逆天!
好了我们 gdb comb
设断点:b *0x8048b2c
查看字符串内容:p (char*) 0x80497c0
出现了!
“Public speaking is very easy.” ,nice 第一关pass
接着看phase_2
08048b48 <phase_2>:
8048b48: 55 push %ebp
8048b49: 89 e5 mov %esp,%ebp
8048b4b: 83 ec 20 sub $0x20,%esp
8048b4e: 56 push %esi
8048b4f: 53 push %ebx
8048b50: 8b 55 08 mov 0x8(%ebp),%edx ;phase_2的参数
8048b53: 83 c4 f8 add $0xfffffff8,%esp
8048b56: 8d 45 e8 lea -0x18(%ebp),%eax
8048b59: 50 push %eax ;
8048b5a: 52 push %edx ;read_six_numbers的参数
8048b5b: e8 78 04 00 00 call 8048fd8 <read_six_numbers>
8048b60: 83 c4 10