bomb炸弹实验
首先对bomb这个文件进行反汇编,得到一个1000+的汇编程序,看的头大。
phase_1:
0000000000400ef0 <phase_1>:
400ef0: 48 83 ec 08 sub $0x8,%rsp
400ef4: be 18 1b 40 00 mov $0x401b18,%esi
400ef9: e8 10 04 00 00 callq 40130e <strings_not_equal>
400efe: 85 c0 test %eax,%eax
400f00: 74 05 je 400f07 <phase_1+0x17>
400f02: e8 dc 07 00 00 callq 4016e3 <explode_bomb>
400f07: 48 83 c4 08 add $0x8,%rsp
400f0b: c3 retq
这个是炸弹一的汇编程序。可以看到,在程序里面,首先注意到了:
callq 40130e <strings_not_equal>
strings_not_equal这个函数应该就是对字符串是否相等进行了判断,所以要找到原来系统设定的字符串。
这是看到前面那句:mov $0x401b18,%esi
感觉有问题,后来去查了一下,发现esi这个寄存器主要进行串操作,嗯,那字符串应该藏在0x401b18里面了。
用gdb调试,
果然在哪个地址里面。
phase_2:
400f0c: 55 push %rbp
400f0d: 53 push %rbx
400f0e: 48 83 ec 28 sub $0x28,%rsp
400f12: 48 89 e6 mov %rsp,%rsi
400f15: e8 eb 07 00 00 callq 401705 <read_six_numbers>
400f1a: 83 3c 24 01 cmpl $0x1,(%rsp)
400f1e: 74 25 je 400f45 <phase_2+0x39>
400f20: e8 be 07 00 00 callq 4016e3 <explode_bomb>
400f25: eb 1e jmp 400f45 <phase_2+0x39>
400f27: 83 c3 01 add $0x1,%ebx
400f2a: 89 d8 mov %ebx,%eax
400f2c: 0f af 45 fc imul -0x4(%rbp),%eax
400f30: 39 45 00 cmp %eax,0x0(%rbp)
400f33: 74 05 je 400f3a <phase_2+0x2e>
400f35: e8 a9 07 00 00 callq 4016e3 <explode_bomb>
400f3a: 48 83 c5 04 add $0x4,%rbp
400f3e: 83 fb 06 cmp $0x6,%ebx
400f41: 75 e4 jne 400f27 <phase_2+0x1b>
400f43: eb 0c jmp 400f51 <phase_2+0x45>
400f45: 48 8d 6c 24 04 lea 0x4(%rsp),%rbp
400f4a: bb 01 00 00 00 mov $0x1,%ebx
400f4f: eb d6 jmp 400f27 <phase_2+0x1b>
400f51: 48 83 c4 28 add $0x28,%rsp
400f55: 5b pop %rbx
400f56: 5d pop %rbp
400f57: c3 retq
callq 401705<read_six_numbers>
应该是要输入6个数字。
然后接下来按照下面的几行的步骤一步一步看下去,可以知道ebx这个寄存器是一个计数器,rbp这个寄存器用来指向当前比较的数字的地址,经过分析,每个数字的计算方法是:%ebx*(-4(%rbp)).即当前的数字的编号(1,2,3,4,5,6,第几个数字就是第几号)和上一个数字的乘积,第一个数字为1.
所以最后6个数字就是:1 2 6 24 120 720
phase_3:
400f58: 48 83 ec 18 sub $0x18,%rsp
400f5c: 4c 8d 44 24 08 lea 0x8(%rsp),%
1844




被折叠的 条评论
为什么被折叠?



