如何阅读以下x86汇编代码?

时间:2019-05-19 09:42:21

标签: assembly stack disassembly processor

我正在安全方面学习,几天后我发现了一个锻炼方法。

这是关于一些具有反汇编技术的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.

1 个答案:

答案 0 :(得分:1)

  

具有反汇编技术的x86汇编代码

它包括多余的指令,反汇编显示了一些实际上并不存在的指令!

这对jneje不仅跳到了同一个地址,这使与零标志的关系成为可疑,而且还跳到了内{{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