【问题标题】:Binary Bomb Phase 3 -- Confused about using jump tableBinary Bomb Phase 3 - 对使用跳转表感到困惑
【发布时间】:2018-08-01 11:20:32
【问题描述】:

我正在尝试找出在二元炸弹实验室第 3 阶段拆除炸弹的正确输入。我发现输入必须是两个整数,并且第一个整数必须小于 7。我一直在使用任意第一个值 (1) 来尝试使用跳转表找出第二个值,但我似乎无法得到答案。具体来说,我在0x0000000000400ffc <+165>: cmp 0x8(%rsp),%eax 这一行之后不断引爆炸弹。

任何帮助或指导将不胜感激。

函数phase_3的汇编代码转储:

    0x0000000000400f57 <+0>:    sub    $0x18,%rsp
    0x0000000000400f5b <+4>:    lea    0x8(%rsp),%rcx
    0x0000000000400f60 <+9>:    lea    0xc(%rsp),%rdx
    0x0000000000400f65 <+14>:   mov    $0x4027ed,%esi
    0x0000000000400f6a <+19>:   mov    $0x0,%eax
    0x0000000000400f6f <+24>:   callq  0x400c30 <__isoc99_sscanf@plt>
    0x0000000000400f74 <+29>:   cmp    $0x1,%eax
    0x0000000000400f77 <+32>:   jg     0x400f7e <phase_3+39>
    0x0000000000400f79 <+34>:   callq  0x401574 <explode_bomb>
    0x0000000000400f7e <+39>:   cmpl   $0x7,0xc(%rsp)
    0x0000000000400f83 <+44>:   ja     0x400feb <phase_3+148>
    0x0000000000400f85 <+46>:   mov    0xc(%rsp),%eax
    0x0000000000400f89 <+50>:   jmpq   *0x402520(,%rax,8)
    0x0000000000400f90 <+57>:   mov    $0x0,%eax
    0x0000000000400f95 <+62>:   jmp    0x400f9c <phase_3+69>
    0x0000000000400f97 <+64>:   mov    $0x3a0,%eax
    0x0000000000400f9c <+69>:   sub    $0x3c2,%eax
    0x0000000000400fa1 <+74>:   jmp    0x400fa8 <phase_3+81>
    0x0000000000400fa3 <+76>:   mov    $0x0,%eax
    0x0000000000400fa8 <+81>:   add    $0x23d,%eax
    0x0000000000400fad <+86>:   jmp    0x400fb4 <phase_3+93>
    0x0000000000400faf <+88>:   mov    $0x0,%eax
    0x0000000000400fb4 <+93>:   sub    $0x3e6,%eax
    0x0000000000400fb9 <+98>:   jmp    0x400fc0 <phase_3+105>
    0x0000000000400fbb <+100>:  mov    $0x0,%eax
    0x0000000000400fc0 <+105>:  add    $0x3e6,%eax
    0x0000000000400fc5 <+110>:  jmp    0x400fcc <phase_3+117>
    0x0000000000400fc7 <+112>:  mov    $0x0,%eax
    0x0000000000400fcc <+117>:  sub    $0x3e6,%eax
    0x0000000000400fd1 <+122>:  jmp    0x400fd8 <phase_3+129>
    0x0000000000400fd3 <+124>:  mov    $0x0,%eax
    0x0000000000400fd8 <+129>:  add    $0x3e6,%eax
    0x0000000000400fdd <+134>:  jmp    0x400fe4 <phase_3+141>
    0x0000000000400fdf <+136>:  mov    $0x0,%eax
    0x0000000000400fe4 <+141>:  sub    $0x3e6,%eax
    0x0000000000400fe9 <+146>:  jmp    0x400ff5 <phase_3+158>
    0x0000000000400feb <+148>:  callq  0x401574 <explode_bomb>
    0x0000000000400ff0 <+153>:  mov    $0x0,%eax
    0x0000000000400ff5 <+158>:  cmpl   $0x5,0xc(%rsp)
    0x0000000000400ffa <+163>:  jg     0x401002 <phase_3+171>
 => 0x0000000000400ffc <+165>:  cmp    0x8(%rsp),%eax
    0x0000000000401000 <+169>:  je     0x401007 <phase_3+176>
    0x0000000000401002 <+171>:  callq  0x401574 <explode_bomb>
    0x0000000000401007 <+176>:  add    $0x18,%rsp
    0x000000000040100b <+180>:  retq 

【问题讨论】:

    标签: binary system jump-table


    【解决方案1】:

    我的作业中有相同的阶段 3,这就是我得到解决方案的方式

    上线

    (gdb) i r rsp

    rsp 0x7fffffffde00 0x7fffffffde00

    (gdb) x/d (0x7fffffffde00 + 0x8)

    0x7fffffffde08:2(我之前随便写的数字)

    (gdb) i r eax

    eax 0xfffffc78 -904

    (gdb) 打印/d 0xfffffc78

    $1 = 4294966392

    【讨论】:

      【解决方案2】:

      在 行比较寄存器 %eax 和 0x8(%rsp) 中的值,如果两者相等,则炸弹不会引爆

      考虑到对 0x8(%rsp) 所做的唯一更改是在 处,其中 %rcx 的有效地址被加载到 0x8(%rsp),您可能很容易尝试和 sub 在多个值来检查哪个值在开始时以 %rcx 结尾,最终在 0x8(%rsp)。尝试使用 gdb 指令,例如

      i r
      

      在您进行过程中检查寄存器中的值。你甚至可以确定你想要检查的确切位置(甚至是 0x8(%rsp)),只是我不记得确切的 gdb 指令了。

      %eax 在此处访问,然后在 之前访问,因此您可能想尝试从那时起在代码中向后走,以检查哪个值最终会出现在 &eax 中。这比听起来容易,因为代码只涉及使用 %eax 的 mov、sub 或 add。当你得到这个值时,适当地输入这个值,这样一开始它会以%rcx结尾,在之后你就可以通过炸弹了。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-11-28
        • 2013-01-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多