【发布时间】:2011-08-06 02:10:52
【问题描述】:
查看《The Shellcoder's Handbook》中的一些汇编和反汇编代码,发现一条指令的序列操作数不一样。
例如,在装配时:
mov ebx,0
并且,在拆卸时:
mov 0,ebx
为什么会这样?
【问题讨论】:
标签: assembly
查看《The Shellcoder's Handbook》中的一些汇编和反汇编代码,发现一条指令的序列操作数不一样。
例如,在装配时:
mov ebx,0
并且,在拆卸时:
mov 0,ebx
为什么会这样?
【问题讨论】:
标签: assembly
要么你的汇编器或反汇编器有问题,要么存在简单的符号不匹配。
例如,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 表示法。你只需要习惯它们之间的差异。
【讨论】: