【问题标题】:Binary Bomb Phase 4, Stepping into func4 call二进制炸弹第 4 阶段,进入 func4 调用
【发布时间】:2017-07-06 02:38:26
【问题描述】:

所以我在使用这个汇编代码时遇到了一些问题,并找出答案是哪两个数字。我所知道的是输入应该是由空格分隔的两位数字,并且根据最后一个比较,最后一个数字应该等于 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   

进入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   

【问题讨论】:

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

标签: assembly gdb x86-64


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2017-03-04
    • 2013-11-07
    • 2020-06-04
    • 2018-04-02
    • 2014-04-06
    • 2016-08-13
    • 2016-09-05
    • 2018-03-09
    相关资源
    最近更新 更多