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

标签 c assembly binary-bomb

我的二元炸弹作业已经完成一半了,我有点困惑。这是家庭作业。这是第 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   

我的猜测是“2 3”,但我在+79 时迷失了方向。如何访问 -0xc(%ebp) 处的值以查找与 %eax 比较的内容?我知道我需要设置猜测,以便 func4 返回等于该值的值。任何帮助表示赞赏。

最佳答案

请参阅上面的评论。 “这很简单,它是您输入的第一个数字。因为 scanf 将该地址作为参数传递。请参阅第 +13 行。”

以3作为第二个数字,func4输出36,因此输入猜测,“36 3”拆除了炸弹。

关于c - 二进制炸弹阶段 4 内存位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24481468/

相关文章:

visual-c++ - 为什么VC++编译器MOV + PUSH args不仅仅是PUSH它们? x86

c - 二元炸弹第三阶段问题

c - 二进制炸弹阶段 5 - 寻找两个整数作为输入

c - system() 和 execve() 有什么区别

c - movl 的左操作数有 3 个子操作数?

c - 特殊字 rune 字

无法从 MSR 读回

c - 了解二进制炸弹第二阶段的汇编代码

c - 从文件中获取数据并在每次新行开始时打印出来

c - 当我想跟踪守护进程 SSHD 时,为什么 ptrace 会产生僵尸进程