【问题标题】:assembly/disassembly instruction operand汇编/反汇编指令操作数
【发布时间】:2011-08-06 02:10:52
【问题描述】:

查看《The Shellcoder's Handbook》中的一些汇编和反汇编代码,发现一条指令的序列操作数不一样。

例如,在装配时:

mov ebx,0

并且,在拆卸时:

mov 0,ebx

为什么会这样?

【问题讨论】:

    标签: assembly


    【解决方案1】:

    要么你的汇编器或反汇编器有问题,要么存在简单的符号不匹配。

    例如,x86(英特尔和 AT&T)的两种常见表示法颠倒了操作数的顺序,例如:

    mov  ebx, 0     ; Intel
    mov  $0, %ebx   ; AT&T
    

    这两个意思相同,将ebx 寄存器设置为零。

    在您参考的 Shellcoder 手册中,所使用的工具使用两种不同的符号。例如,在一页(我的版本中的第 39 页)上,您会看到以下文字:


    让我们把这三个步骤写成汇编。然后我们可以得到一个 ELF 二进制文件;从这个文件中,我们终于可以提取操作码了。

    Section .text
    global _start
    _start:
        mov ebx,0
        mov eax,1
        int 0x80
    

    现在我们要使用nasm 汇编器来创建我们的目标文件,然后使用 GNU 链接器来链接目标文件:

    [slap@0day root] nasm -f elf exit_shellcode.asm
    [slap@0day root] ld -o exit_shellcode exit_shellcode.o
    

    最后,我们准备好获取我们的操作码。在本例中,我们将使用objdump。 objdump 实用程序是一个简单的工具,它以人类可读的形式显示目标文件的内容。它还可以在显示目标文件的内容时很好地打印出操作码,这使得它在设计 shellcode 时很有用。通过objdump 运行我们的程序,如下所示:

    [slap@0day root] objdump -d exit_shellcode
    exit_shellcode:file format elf32-i386
    Disassembly of section .text:
    08048080 <.text>:
    8048080: bb 00 00 00 00 mov $0x0,%ebx
    8048085: b8 01 00 00 00 mov $0x1,%eax
    804808a: cd 80          int $0x80
    

    由此,您可以非常清楚地看到 nasm 需要 Intel 表示法,但 objdump 产生 AT&T 表示法。你只需要习惯它们之间的差异。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-29
      • 2011-04-18
      • 2016-08-02
      • 1970-01-01
      • 1970-01-01
      • 2019-04-04
      • 1970-01-01
      相关资源
      最近更新 更多