二进制炸弹第4阶段,进入func4调用

问题描述:

所以我遇到了这个汇编代码的一些麻烦,找出两个数字是答案。我所知道的是输入应该是由空格隔开的两位数字,并且基于最后一次比较,最后一位数字应该等于0x6b,即十进制数为107。 Func4对eax的值做了一些改变,使其成为107,但我并不确定。那么,两个数字将作为输入?任何帮助,将不胜感激。二进制炸弹第4阶段,进入func4调用

0x000000000040135a <+0>: sub $0x18,%rsp 
0x000000000040135e <+4>: lea 0x8(%rsp),%rcx 
0x0000000000401363 <+9>: lea 0xc(%rsp),%rdx 
0x0000000000401368 <+14>: mov $0x402e78,%esi 
0x000000000040136d <+19>: mov $0x0,%eax 
0x0000000000401372 <+24>: callq 0x400d60 <[email protected]> 
0x0000000000401377 <+29>: cmp $0x2,%eax 
0x000000000040137a <+32>: jne 0x40138a <phase_4+48> 
0x000000000040137c <+34>: mov 0xc(%rsp),%eax 
0x0000000000401380 <+38>: cmp $0x13,%eax 
0x0000000000401383 <+41>: jle 0x40138a <phase_4+48> 
0x0000000000401385 <+43>: cmp $0x23,%eax 
0x0000000000401388 <+46>: jle 0x401395 <phase_4+59> 
0x000000000040138a <+48>: mov $0x0,%eax 
0x000000000040138f <+53>: callq *0x20340b(%rip) <explode_bomb> 
0x0000000000401395 <+59>: mov $0x23,%edx 
0x000000000040139a <+64>: mov $0x0,%esi 
0x000000000040139f <+69>: mov 0xc(%rsp),%edi 
0x00000000004013a3 <+73>: callq 0x4010bc <func4> 
0x00000000004013a8 <+78>: cmp $0x6b,%eax 
0x00000000004013ab <+81>: jne 0x4013b4 <phase_4+90> 
0x00000000004013ad <+83>: cmpl $0x6b,0x8(%rsp) 
0x00000000004013b2 <+88>: je  0x4013bf <phase_4+101> 
0x00000000004013b4 <+90>: mov $0x0,%eax 
0x00000000004013b9 <+95>: callq *0x2033e1(%rip)  <explode_bomb> 
0x00000000004013bf <+101>: add $0x18,%rsp 
0x00000000004013c3 <+105>: retq 

步骤进FUNC4

0x00000000004010bc <+0>: push %rbx 
0x00000000004010bd <+1>: mov %edx,%eax 
0x00000000004010bf <+3>: sub %esi,%eax 
0x00000000004010c1 <+5>: mov %eax,%ebx 
0x00000000004010c3 <+7>: shr $0x1f,%ebx 
0x00000000004010c6 <+10>: lea (%rbx,%rax,1),%eax 
0x00000000004010c9 <+13>: sar %eax 
0x00000000004010cb <+15>: lea (%rax,%rsi,1),%ebx 
0x00000000004010ce <+18>: cmp %edi,%ebx 
0x00000000004010d0 <+20>: jle 0x4010de <func4+34> 
0x00000000004010d2 <+22>: lea -0x1(%rbx),%edx 
0x00000000004010d5 <+25>: callq 0x4010bc <func4> 
0x00000000004010da <+30>: add %eax,%ebx 
0x00000000004010dc <+32>: jmp 0x4010ec <func4+48> 
0x00000000004010de <+34>: cmp %edi,%ebx 
0x00000000004010e0 <+36>: jge 0x4010ec <func4+48> 
0x00000000004010e2 <+38>: lea 0x1(%rbx),%esi 
0x00000000004010e5 <+41>: callq 0x4010bc <func4> 
0x00000000004010ea <+46>: add %eax,%ebx 
0x00000000004010ec <+48>: mov %ebx,%eax 
0x00000000004010ee <+50>: pop %rbx 
0x00000000004010ef <+51>: retq 
+0

为什么不使用gdb单步执行汇编指令?使用gdb tui模式并注册视图以帮助查看寄存器,同时逐步完成汇编指令。 – AmeyaVS

+1

确切地说,你的问题是什么? –

+0

@AmeyaVS,我已经尝试了很多次,但只是不能看到func4中%eax的值会发生什么。 – user181421

这个问题的答案是33 107.根据关闭在主代码的最后比较语句我们可以看出,该第二数目必须等于0x6b这是否则107会爆炸。为了获得第一个数字,我简单地检查了func4的转储代码,并看到它正在进行二分搜索。由于我们从主代码中知道,根据两次比较,第一个数字的值必须介于19到35之间,因此我们可以选择27作为第一次猜测,并且看到该数字需要高于27.通过在整个代码的不同阶段注册帮助!