用 GDB 解码汇编语言
Decoding Assembly Language with GDB
好吧,我已经尝试遵循这段汇编代码很长时间了,但我似乎无法理解它产生的模式。这是代码及其初始值。
0x08048c74 <+0>: push %esi
0x08048c75 <+1>: push %ebx
=> 0x08048c76 <+2>: sub [=10=]x34,%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 [=10=]x0,0x18(%esp)
0x08048c92 <+30>: jne 0x8048c9b <phase_2+39>
0x08048c94 <+32>: cmpl [=10=]x1,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 [=10=]x4,%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 [=10=]x34,%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)
我插入的原始值是:1 2 3 4 5 6
read_six_numbers 只是一个检查您是否有 6 个数字的函数,但是有些行我想仔细检查我是否理解正确。例如:
cmpl [=11=]x0,0x18(%esp)
据我所知,检查 esp 寄存器是否为零。如果不是,那么炸弹就会爆炸。由于这是第一次比较,是否意味着第一个数字应该为零?
其他行如:
add -0x4(%ebx),%eax
和
add [=13=]x4,%ebx
我觉得我需要注意,因为他们改变了寄存器中数字的值。我知道假设数字有一个模式,例如 *3 或 +3 等。但是我认为该模式与 4 有关,因为将值增加或更改为 4。我已经设法得到ODA 上的代码有助于可视化这里的跳跃 link:
http://www2.onlinedisassembler.com/odaweb/J0tDzn/0
只需单击符号部分中的 phase_2。我只需要知道如何获得前 2 个数字,因为从那里第三个数字应该是直截了当的,模式应该是清晰的。如果这是一个很长的 post,我深表歉意,但我已经尝试理解这一点已经有一段时间了,并且在试图找到泄露模式的线索时陷入困境。任何帮助将不胜感激!提前致谢!
cmpl [=10=]x0,0x18(%esp)
From what I know checks to see if esp register is equal to zero.
不,它比较内存中地址%esp+0x18
的值。
does that mean the first number should be zero?
但这恰好是真的:)
However I think the pattern has to do with 4 since both the adds or
changing the value by 4.
没有。请注意,4
适用于内存地址,而不是值。那是因为整数是 4 个字节。 add -0x4(%ebx),%eax
会将内存中地址 %ebx-4
的数字添加到 %eax
.
I only need to know how to get to get the first 2 numbers
嗯,您已经知道第一个必须为零。由于数字在内存中的地址为 %esp+0x18
,并且每个都是 4 个字节,因此指令 cmpl [=17=]x1,0x1c(%esp)
检查第二个数字。
你应该重新审视你必须做的任何事情 material 以正确处理一些基本问题。否则后面的阶段你会很吃力。
好吧,我已经尝试遵循这段汇编代码很长时间了,但我似乎无法理解它产生的模式。这是代码及其初始值。
0x08048c74 <+0>: push %esi
0x08048c75 <+1>: push %ebx
=> 0x08048c76 <+2>: sub [=10=]x34,%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 [=10=]x0,0x18(%esp)
0x08048c92 <+30>: jne 0x8048c9b <phase_2+39>
0x08048c94 <+32>: cmpl [=10=]x1,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 [=10=]x4,%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 [=10=]x34,%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)
我插入的原始值是:1 2 3 4 5 6
read_six_numbers 只是一个检查您是否有 6 个数字的函数,但是有些行我想仔细检查我是否理解正确。例如:
cmpl [=11=]x0,0x18(%esp)
据我所知,检查 esp 寄存器是否为零。如果不是,那么炸弹就会爆炸。由于这是第一次比较,是否意味着第一个数字应该为零?
其他行如:
add -0x4(%ebx),%eax
和
add [=13=]x4,%ebx
我觉得我需要注意,因为他们改变了寄存器中数字的值。我知道假设数字有一个模式,例如 *3 或 +3 等。但是我认为该模式与 4 有关,因为将值增加或更改为 4。我已经设法得到ODA 上的代码有助于可视化这里的跳跃 link: http://www2.onlinedisassembler.com/odaweb/J0tDzn/0
只需单击符号部分中的 phase_2。我只需要知道如何获得前 2 个数字,因为从那里第三个数字应该是直截了当的,模式应该是清晰的。如果这是一个很长的 post,我深表歉意,但我已经尝试理解这一点已经有一段时间了,并且在试图找到泄露模式的线索时陷入困境。任何帮助将不胜感激!提前致谢!
cmpl [=10=]x0,0x18(%esp)
From what I know checks to see if esp register is equal to zero.
不,它比较内存中地址%esp+0x18
的值。
does that mean the first number should be zero?
但这恰好是真的:)
However I think the pattern has to do with 4 since both the adds or changing the value by 4.
没有。请注意,4
适用于内存地址,而不是值。那是因为整数是 4 个字节。 add -0x4(%ebx),%eax
会将内存中地址 %ebx-4
的数字添加到 %eax
.
I only need to know how to get to get the first 2 numbers
嗯,您已经知道第一个必须为零。由于数字在内存中的地址为 %esp+0x18
,并且每个都是 4 个字节,因此指令 cmpl [=17=]x1,0x1c(%esp)
检查第二个数字。
你应该重新审视你必须做的任何事情 material 以正确处理一些基本问题。否则后面的阶段你会很吃力。