【发布时间】:2013-10-27 14:00:27
【问题描述】:
我在看一个程序的gdb反汇编
...
0x8048085: cmp eax,ecx
0x8048087: je 0x804809f
0x8048089: mov DWORD PTR [esp+0x4],0x21
0x8048091: mov DWORD PTR [esp],0x8048160
0x8048098: jmp 0x8048157
0x804809d: mov esi,0x115e8ba
0x80480a2: add BYTE PTR [eax],al
...
在第二条指令中,有一个跳转到地址 0x...9f,它是在之后的两条指令之间。我知道理论上一切都是可能的,因为只要我们向他提供要执行的内容的地址,处理器就不应该关心,但仍然......如果有人可以解释,谢谢
更新:好的,地址似乎有问题。但这是更大代码(200 行)的 sn-p 部分。我查看了“调用 0x ...”的位置,并用标签替换了它们,代码如下所示:
func1:
...
asm
...
call func2
...
ret
func2:
...
asm
...
ret
...
尽管我很想购买反汇编在某个时候在地址中被绊倒的事实,但这与它所说的任何地方都调用 0x...,即 0x 之前的指令这一事实无关。 ..是一个“ret”。如果地址在某处有偏移,这将是不正确的
【问题讨论】:
-
地址 A2 的指令也是垃圾。您的反汇编程序只是被 JMP 之后的两个额外的垃圾字节绊倒了。为什么它们在那里是不可猜测的,填充字节绝对不是不寻常的,但对于未对齐的分支目标地址来说却不是。
-
我更新了问题
标签: assembly