我正在为学校召集这个名为bomblab的装配项目。该项目是通过使用正确的输入来化解几个二进制“炸弹”。 该项目有6个阶段,目前我正处于第4阶段。 使用gdb我已经反汇编了这个函数的代码,我得出了4个结论。
这是反汇编的代码,注释可能不准确(但我希望它们是)
phase_4
0x0000000000401020 <+0>: sub $0x18,%rsp
0x0000000000401024 <+4>: lea 0x8(%rsp),%rcx
0x0000000000401029 <+9>: lea 0xc(%rsp),%rdx
0x000000000040102e <+14>: mov $0x4028c5,%esi
0x0000000000401033 <+19>: mov $0x0,%eax
0x0000000000401038 <+24>: callq 0x400c30 <__isoc99_sscanf@plt>
0x000000000040103d <+29>: cmp $0x2,%eax
0x0000000000401040 <+32>: jne 0x401049 <phase_4+41>
0x0000000000401042 <+34>: cmpl $0xe,0xc(%rsp)
0x0000000000401047 <+39>: jbe 0x40104e <phase_4+46>
0x0000000000401049 <+41>: callq 0x401574 <explode_bomb>
0x000000000040104e <+46>: mov $0xe,%edx
0x0000000000401053 <+51>: mov $0x0,%esi
0x0000000000401058 <+56>: mov 0xc(%rsp),%edi
0x000000000040105c <+60>: callq 0x400fe2 <func4>
0x0000000000401061 <+65>: cmp $0x6,%eax
0x0000000000401064 <+68>: jne 0x40106d <phase_4+77>
0x0000000000401066 <+70>: cmpl $0x6,0x8(%rsp)
0x000000000040106b <+75>: je 0x401072 <phase_4+82>
0x000000000040106d <+77>: callq 0x401574 <explode_bomb>
0x0000000000401072 <+82>: add $0x18,%rsp
0x0000000000401076 <+86>: retq
Dump of assembler code for function func4:
0x0000000000400fe2 <+0>: sub $0x8,%rsp //subtracks 8 from rsp
0x0000000000400fe6 <+4>: mov %edx,%eax
0x0000000000400fe8 <+6>: sub %esi,%eax
0x0000000000400fea <+8>: mov %eax,%ecx //rcx = rax
0x0000000000400fec <+10>: shr $0x1f,%ecx // shifts rcx to the right by 0x1f
0x0000000000400fef <+13>: add %ecx,%eax // ads rcx to rax
0x0000000000400ff1 <+15>: sar %eax //arithmetic shift to the right
0x0000000000400ff3 <+17>: lea (%rax,%rsi,1),%ecx //??
0x0000000000400ff6 <+20>: cmp %edi,%ecx // compares %edi & $ecx
0x0000000000400ff8 <+22>: jle 0x401006 <func4+36> // jump if ecx < edi
0x0000000000400ffa <+24>: lea -0x1(%rcx),%edx //edx = edx - rcx - 1
0x0000000000400ffd <+27>: callq 0x400fe2 <func4> // calls itself
0x0000000000401002 <+32>: add %eax,%eax //eax*2
0x0000000000401004 <+34>: jmp 0x40101b <func4+57>
0x0000000000401006 <+36>: mov $0x0,%eax
0x000000000040100b <+41>: cmp %edi,%ecx
0x000000000040100d <+43>: jge 0x40101b <func4+57>
0x000000000040100f <+45>: lea 0x1(%rcx),%esi
0x0000000000401012 <+48>: callq 0x400fe2 <func4>
0x0000000000401017 <+53>: lea 0x1(%rax,%rax,1),%eax
0x000000000040101b <+57>: add $0x8,%rsp // adds 8 to rsp
0x000000000040101f <+61>: retq
所以我想我的问题是函数4实际上做了什么? 或者更好的是我的输入必须是为了获得所需的8。 如果这个问题格式不正确并且我的低于英语,我很抱歉。 我花了好几个小时盯着这段代码,所以任何帮助都会非常感激。 提前谢谢大家。