章节大纲

  • 在大多数攻击中,我们只需要 Shellcode 的机器代码,而不需要包含其他数据的可执行文件。从技术上讲,只有机器代码才被称为 Shellcode。因此,我们需要从可执行文件或目标文件中提取机器代码。有多种方法可以实现这一点。一种方法是使用 objdump 命令反汇编可执行文件或目标文件。
     
    对于 amd64,汇编代码有两种常见的语法模式:AT&T 语法模式和 Intel 语法模式。默认情况下,objdump 使用 AT&T 模式。以下示例中,我们使用 -Mintel 选项生成 Intel 模式的汇编代码。

    $ objdump -Mintel -d hello.o
    hello.o:     file format elf64-x86-64
    
    Disassembly of section .text:
    
    0000000000000000 <_start>:
       0: bf 01 00 00 00        mov    edi,0x1
       5: 48 be 00 00 00 00 00  movabs rsi,0x0
       c: 00 00 00
       f: ba 0f 00 00 00        mov    edx,0xf
      14: b8 01 00 00 00        mov    eax,0x1
      19: 0f 05                 syscall
      1b: bf 00 00 00 00        mov    edi,0x0
      20: b8 3c 00 00 00        mov    eax,0x3c
      25: 0f 05                 syscall
     
    在上述输出中,冒号后的数字是机器代码。你还可以使用 xxd 命令打印二进制文件的内容,应该能从输出中找到 Shellcode 的机器代码。

    $ xxd -p -c 20 hello.o
    7f454c4602010100000000000000000001003e00
    ...                     ⇩ 机器代码从这里开始
    000000001800000000000000bf0100000048be00
    00000000000000ba0f000000b8010000000f05bf
    00000000b83c0000000f05000000000000000000
    ...