在大多数攻击中,我们只需要 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
...