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

Assembly 二进制炸弹阶段4,进入func4调用,assembly,gdb,x86-64,Assembly,Gdb,X86 64,因此,我在汇编代码方面遇到了一些问题,并找出了两位数字的答案。我只知道输入应该是两个用空格分隔的数字,根据最后一次比较,最后一个数字应该等于0x6b,这是十进制的107。Func4对eax值做了一些修改,使其为107,但我不是很确定。那么,哪两个数字将作为输入?。任何帮助都将不胜感激 0x000000000040135a <+0>: sub $0x18,%rsp 0x000000000040135e <+4>: lea 0x8(%rsp),%rcx

因此,我在汇编代码方面遇到了一些问题,并找出了两位数字的答案。我只知道输入应该是两个用空格分隔的数字,根据最后一次比较,最后一个数字应该等于0x6b,这是十进制的107。Func4对eax值做了一些修改,使其为107,但我不是很确定。那么,哪两个数字将作为输入?。任何帮助都将不胜感激

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 <__isoc99_sscanf@plt>
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   
进入功能4

 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   

答案是33107。根据主代码中的最后一个比较语句,我们可以看到第二个数字必须等于0x6b,即十进制的107,否则它将爆炸。为了得到第一个数字,我只检查了func4的转储代码,发现它正在进行二进制搜索。由于我们从主代码中知道,根据两次比较,第一个数字的值必须介于19和35之间,因此我们可以选择27作为第一个猜测,并看到该数字需要高于27。在代码的不同阶段浏览寄存器有帮助

为什么不使用gdb逐步完成组装说明?使用gdb tui模式和寄存器视图在逐步执行汇编指令时帮助查看寄存器。您的问题到底是什么?@AmeyaVS,我已经尝试了很多次,但就是看不到func4中%eax中的值会发生什么。@Cody Gray,我试图找出作为输入的两个数字。在汇编代码中有没有一行是你100%不理解的?我们可以为您指出CSAPP的相应部分或手册。