Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Binary 二元炸弹阶段3——对使用跳转表感到困惑_Binary_System_Jump Table - Fatal编程技术网

Binary 二元炸弹阶段3——对使用跳转表感到困惑

Binary 二元炸弹阶段3——对使用跳转表感到困惑,binary,system,jump-table,Binary,System,Jump Table,我正在试图找出正确的输入,以便在二元炸弹实验室的第三阶段拆除炸弹。我已经计算出输入必须是两个整数,第一个整数必须小于7。我一直在使用一个任意的第一个值(1),试图通过使用跳转表计算出第二个值,但我似乎无法得到答案。具体来说,我一直在这一行之后引爆炸弹0x0000000000400ffc:cmp0x8(%rsp),%eax 任何帮助或指导都将不胜感激 功能阶段_3的汇编程序代码转储: 0x0000000000400f57 <+0>: sub $0x18,%rsp

我正在试图找出正确的输入,以便在二元炸弹实验室的第三阶段拆除炸弹。我已经计算出输入必须是两个整数,第一个整数必须小于7。我一直在使用一个任意的第一个值(1),试图通过使用跳转表计算出第二个值,但我似乎无法得到答案。具体来说,我一直在这一行之后引爆炸弹
0x0000000000400ffc:cmp0x8(%rsp),%eax

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

功能阶段_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 
0x0000000000400f57:sub$0x18,%rsp
0x0000000000400f5b:lea 0x8(%rsp),%rcx
0x0000000000400f60:lea 0xc(%rsp),%rdx
0x0000000000400f65:mov$0x4027ed,%esi
0x0000000000400f6a:mov$0x0,%eax
0x0000000000400f6f:callq 0x400c30
0x0000000000400f74:cmp$0x1,%eax
0x0000000000400f77:jg 0x400f7e
0x0000000000400f79:callq 0x401574
0x0000000000400f7e:cmpl$0x7,0xc(%rsp)
0x0000000000400f83:ja 0x400feb
0x0000000000400f85:mov 0xc(%rsp),%eax
0x0000000000400f89:jmpq*0x402520(,%rax,8)
0x0000000000400f90:mov$0x0,%eax
0x0000000000400f95:jmp 0x400f9c
0x0000000000400f97:mov$0x3a0,%eax
0x0000000000400f9c:子$0x3c2,%eax
0x0000000000400fa1:jmp 0x400fa8
0x0000000000400fa3:mov$0x0,%eax
0x0000000000400fa8:添加$0x23d,%eax
0x0000000000400fad:jmp 0x400fb4
0x0000000000400faf:mov$0x0,%eax
0x0000000000400fb4:sub$0x3e6,%eax
0x0000000000400fb9:jmp 0x400fc0
0x0000000000400fbb:mov$0x0,%eax
0x0000000000400fc0:添加$0x3e6,%eax
0x0000000000400fc5:jmp 0x400fcc
0x0000000000400fc7:mov$0x0,%eax
0x0000000000400fcc:sub$0x3e6,%eax
0x0000000000400fd1:jmp 0x400fd8
0x0000000000400fd3:mov$0x0,%eax
0x0000000000400fd8:添加$0x3e6,%eax
0x0000000000400fdd:jmp 0x400fe4
0x0000000000400fdf:mov$0x0,%eax
0x0000000000400fe4:sub$0x3e6,%eax
0x0000000000400fe9:jmp 0x400ff5
0x0000000000400feb:callq 0x401574
0x0000000000400ff0:mov$0x0,%eax
0x0000000000400ff5:cmpl$0x5,0xc(%rsp)
0x0000000000400ffa:jg 0x401002
=>0x0000000000400ffc:cmp 0x8(%rsp),%eax
0x0000000000401000:je 0x401007
0x0000000000401002:callq 0x401574
0x0000000000401007:添加$0x18,%rsp
0x000000000040100b:retq
在线比较寄存器%eax和0x8(%rsp)中的值,如果这两个值相等,则炸弹未引爆

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

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


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

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

在线

(gdb)i r rsp

rsp 0x7fffffffde00 0x7fffffffde00

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

0x7FFFFFDE08:2(我之前随机写入的数字)

(gdb)i r eax

eax 0xfffffc78-904

(gdb)打印/d 0xFFFC78

$1=4294966392