我正在安全方面学习,几天后我发现了一个锻炼方法。
这是关于一些具有反汇编技术的x86汇编代码。 我真的是x86汇编代码的新手。目前,我无法阅读并理解代码,有人可以解释吗?
080486ce <foobar>:
80486ce: 55 push %ebp ;save previous value.
80486cf: 89 e5 mov %esp,%ebp ;create new stack frame.
80486d1: 83 ec 28 sub $0x28,%esp
80486d4: 68 7d 86 04 08 push $0x804867d
80486d9: 75 04 jne 80486df <L1+0x2>
80486db: 74 02 je 80486df <L1+0x2>
080486dd <L1>:
80486dd: e8 42 58 89 45 call 4d8ddf24 <_e+0x45893ebc>
80486e2: f4 hlt
80486e3: 8b 45 f4 mov -0xc(%ebp),%eax
80486e6: 8b 55 08 mov 0x8(%ebp),%edx
80486e9: 89 14 24 mov %edx,(%esp)
80486ec: ff d0 call *%eax
80486ee: c9 leave ;tear down frame.
80486ef: c3 ret ;and exit.
答案 0 :(得分:1)
具有反汇编技术的x86汇编代码
它包括多余的指令,反汇编显示了一些实际上并不存在的指令!
这对jne
和je
不仅跳到了同一个地址,这使与零标志的关系成为可疑,而且还跳到了内{{1 }}指令!该call
指令和随后的call
指令是诱饵。它们以简单的拆卸形式出现,这是您必须介入的地方!
运行此代码的CPU将开始在地址0x080486DF处执行,其中字节0x58、0x89、0x45和0xF4在此位置。如果您将它们拆开,则会得到:
hlt
CPU看到的程序:
pop %eax
mov %eax, -0xc(%ebp)
这是功能性的重写:
<foobar>:
push %ebp
mov %esp, %ebp
sub $0x28, %esp
push $0x804867d ; (1)
jne <in_foobar>
je <in_foobar>
bytes 0xE8 and 0x42 are not on the execution path
<in_foobar>:
pop %eax ; (1)
mov %eax, -0xc(%ebp)
mov -0xc(%ebp), %eax
mov 0x8(%ebp), %edx
mov %edx, (%esp)
call *%eax
leave
ret