二进制炸弹阶段4内存位置

时间:2014-06-30 00:20:45

标签: c assembly

我在二元炸弹任务中有点过了一点,我有点难过。这是功课。这是阶段4的转储:

Dump of assembler code for function phase_4:
0x08048cdd <+0>:    push   %ebp
0x08048cde <+1>:    mov    %esp,%ebp
0x08048ce0 <+3>:    sub    $0x28,%esp
0x08048ce3 <+6>:    lea    -0x10(%ebp),%eax
0x08048ce6 <+9>:    mov    %eax,0xc(%esp)
0x08048cea <+13>:   lea    -0xc(%ebp),%eax
0x08048ced <+16>:   mov    %eax,0x8(%esp)
0x08048cf1 <+20>:   movl   $0x804a537,0x4(%esp)
0x08048cf9 <+28>:   mov    0x8(%ebp),%eax
0x08048cfc <+31>:   mov    %eax,(%esp)
0x08048cff <+34>:   call   0x8048860 <__isoc99_sscanf@plt> <=== calls for "%d %d"
0x08048d04 <+39>:   cmp    $0x2,%eax
0x08048d07 <+42>:   jne    0x8048d14 <phase_4+55>
0x08048d09 <+44>:   mov    -0x10(%ebp),%eax
0x08048d0c <+47>:   sub    $0x2,%eax
0x08048d0f <+50>:   cmp    $0x2,%eax
0x08048d12 <+53>:   jbe    0x8048d19 <phase_4+60>
0x08048d14 <+55>:   call   0x804921d <explode_bomb>
0x08048d19 <+60>:   mov    -0x10(%ebp),%eax
0x08048d1c <+63>:   mov    %eax,0x4(%esp)
0x08048d20 <+67>:   movl   $0x5,(%esp)
0x08048d27 <+74>:   call   0x8048c91 <func4>
0x08048d2c <+79>:   cmp    -0xc(%ebp),%eax <=== this is where I am stumped
0x08048d2f <+82>:   je     0x8048d36 <phase_4+89>
0x08048d31 <+84>:   call   0x804921d <explode_bomb>
0x08048d36 <+89>:   leave  
0x08048d37 <+90>:   ret    
End of assembler dump.

这是func4的转储

0x08048c91 <+0>:    push   %ebp
0x08048c92 <+1>:    mov    %esp,%ebp
0x08048c94 <+3>:    push   %edi
0x08048c95 <+4>:    push   %esi
0x08048c96 <+5>:    push   %ebx
0x08048c97 <+6>:    sub    $0x1c,%esp
0x08048c9a <+9>:    mov    0x8(%ebp),%ebx
0x08048c9d <+12>:   mov    0xc(%ebp),%esi
0x08048ca0 <+15>:   test   %ebx,%ebx
0x08048ca2 <+17>:   jle    0x8048cd0 <func4+63>
0x08048ca4 <+19>:   mov    %esi,%eax
0x08048ca6 <+21>:   cmp    $0x1,%ebx
0x08048ca9 <+24>:   je     0x8048cd5 <func4+68>
0x08048cab <+26>:   mov    %esi,0x4(%esp)
0x08048caf <+30>:   lea    -0x1(%ebx),%eax
0x08048cb2 <+33>:   mov    %eax,(%esp)
0x08048cb5 <+36>:   call   0x8048c91 <func4>
0x08048cba <+41>:   lea    (%eax,%esi,1),%edi
0x08048cbd <+44>:   mov    %esi,0x4(%esp)
0x08048cc1 <+48>:   sub    $0x2,%ebx
0x08048cc4 <+51>:   mov    %ebx,(%esp)
0x08048cc7 <+54>:   call   0x8048c91 <func4>
0x08048ccc <+59>:   add    %edi,%eax
0x08048cce <+61>:   jmp    0x8048cd5 <func4+68>
0x08048cd0 <+63>:   mov    $0x0,%eax
0x08048cd5 <+68>:   add    $0x1c,%esp
0x08048cd8 <+71>:   pop    %ebx
0x08048cd9 <+72>:   pop    %esi
0x08048cda <+73>:   pop    %edi
0x08048cdb <+74>:   pop    %ebp
0x08048cdc <+75>:   ret   

我通过猜测得到了+79:“2 3”但我在+79输了。如何访问-0xc(%ebp)的值以查找与%eax相关联的内容?我知道我需要设置猜测,使得func4返回一个等于的值。任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:0)

见上面的评论。 &#34;这非常简单,它是您输入的第一个号码。因为scanf将该地址作为参数传递。见第+ 13行。&#34;

以3作为第二个数字,func4输出36,所以输入猜测,&#34; 36 3&#34;化解炸弹。