Assembly 用GDB解码汇编语言

Assembly 用GDB解码汇编语言,assembly,gdb,Assembly,Gdb,好的,我已经尝试遵循这个汇编代码很长一段时间了,我似乎无法理解它产生的模式。下面是代码及其初始值 0x08048c74 <+0>: push %esi 0x08048c75 <+1>: push %ebx => 0x08048c76 <+2>: sub $0x34,%esp 0x08048c79 <+5>: lea 0x18(%esp),%eax 0x08048c7d <+9>: mov

好的,我已经尝试遵循这个汇编代码很长一段时间了,我似乎无法理解它产生的模式。下面是代码及其初始值

   0x08048c74 <+0>: push   %esi
   0x08048c75 <+1>: push   %ebx
=> 0x08048c76 <+2>: sub    $0x34,%esp
   0x08048c79 <+5>: lea    0x18(%esp),%eax
   0x08048c7d <+9>: mov    %eax,0x4(%esp)
   0x08048c81 <+13>:    mov    0x40(%esp),%eax
   0x08048c85 <+17>:    mov    %eax,(%esp)
   0x08048c88 <+20>:    call   0x80494d4 <read_six_numbers>
   0x08048c8d <+25>:    cmpl   $0x0,0x18(%esp)
   0x08048c92 <+30>:    jne    0x8048c9b <phase_2+39>
   0x08048c94 <+32>:    cmpl   $0x1,0x1c(%esp)
   0x08048c99 <+37>:    je     0x8048cba <phase_2+70>
   0x08048c9b <+39>:    call   0x8049495 <explode_bomb>
   0x08048ca0 <+44>:    jmp    0x8048cba <phase_2+70>
   0x08048ca2 <+46>:    mov    -0x8(%ebx),%eax
   0x08048ca5 <+49>:    add    -0x4(%ebx),%eax
   0x08048ca8 <+52>:    cmp    %eax,(%ebx)
   0x08048caa <+54>:    je     0x8048cb1 <phase_2+61>
   0x08048cac <+56>:    call   0x8049495 <explode_bomb>
   0x08048cb1 <+61>:    add    $0x4,%ebx
   0x08048cb4 <+64>:    cmp    %esi,%ebx
   0x08048cb6 <+66>:    jne    0x8048ca2 <phase_2+46>
---Type <return> to continue, or q <return> to quit---
   0x08048cb8 <+68>:    jmp    0x8048cc4 <phase_2+80>
   0x08048cba <+70>:    lea    0x20(%esp),%ebx
   0x08048cbe <+74>:    lea    0x30(%esp),%esi
   0x08048cc2 <+78>:    jmp    0x8048ca2 <phase_2+46>
   0x08048cc4 <+80>:    add    $0x34,%esp
   0x08048cc7 <+83>:    pop    %ebx
   0x08048cc8 <+84>:    pop    %esi
   0x08048cc9 <+85>:    ret    
End of assembler dump.
(gdb) i r
eax            0x804c870    134531184
ecx            0xc  12
edx            0x2  2
ebx            0x2  2
esp            0xffffd054   0xffffd054
ebp            0xffffd078   0xffffd078
esi            0xffffd114   -12012
edi            0x0  0
eip            0x8048c76    0x8048c76 <phase_2+2>
eflags         0x286    [ PF SF IF ]
cs             0x23 35
ss             0x2b 43
ds             0x2b 43
es             0x2b 43
fs             0x0  0
gs             0x63 99
(gdb) x/d $esp
0xffffd054: 2
(gdb) 
据我所知,检查esp寄存器是否等于零。如果不是,炸弹就会爆炸。因为这是第一次比较,这是否意味着第一个数字应该是零

其他行,例如:

add    -0x4(%ebx),%eax

我觉得我需要注意,因为它们会改变寄存器中数字的值。我知道有一个假设是一个模式的数字,如*3或+3等,但我认为模式必须与4有关,因为两者都增加或改变了4的值。我已经设法获得了ODA上的代码,以帮助可视化跳跃。以下是链接:

只需单击符号部分中的阶段2。我只需要知道如何得到前两个数字,因为从那里第三个数字应该是直截了当的,模式应该是明确的。如果这是一篇很长的帖子,我真的很抱歉,但是我已经试着理解这一点很长一段时间了,我一直在努力寻找泄露模式的线索。任何帮助都将不胜感激!提前谢谢

cmpl   $0x0,0x18(%esp)
据我所知,检查esp寄存器是否等于零

否,它比较地址
%esp+0x18
处的内存值

这是否意味着第一个数字应该是零

但这恰好是真的:)

然而,我认为模式与4有关,因为两者都添加或 将值更改为4

否。请注意
4
适用于内存地址,而不是值。这是因为整数是4字节<代码>添加-0x4(%ebx),%eax将把地址
%ebx-4
处的内存中的数字添加到
%eax

我只需要知道如何得到前两个数字

你已经知道第一个必须是零。由于这些数字是从地址
%esp+0x18
存储在内存中的,每个数字是4个字节,因此指令
cmpl$0x1,0x1c(%esp)
检查第二个数字


你应该重温你所拥有的任何材料,以获得一些基本的东西。否则,您将很难完成后续阶段。

由于某些原因,第一个数字不是0。当我单步执行并输入0作为第一个数字时,它只是执行cmpl$0x0,0x18(%esp)并说它不等于炸掉炸弹,我如何才能得到0x18(%esp)的值呢?
读取六个数字
将地址
0x18(%esp)
作为参数,因此您输入的第一个数字应该在那里。你做错了什么。无论如何,你可以使用
x$esp+0x18
进行检查。你是对的,它是0,然后是1,然后再加上数字。我刚刚拿了另一个炸弹,解决了它的模式,我正在进入其他阶段,谢谢你的回答!)
add    $0x4,%ebx
cmpl   $0x0,0x18(%esp)