【发布时间】:2015-12-23 03:21:36
【问题描述】:
我是组装新手。我试图通过参考一本名为“Writing Security Tools and Exploits”的书来学习。熟悉这本书的人都知道,汇编代码是为 32 位编写的,但我是在 64 位系统上构建的。
因此,我重写了代码以在 64 位上运行。成功编译代码后,当我尝试运行程序时,没有完成所需的输出。相反,我没有收到任何输出。
我在 AMD64 Debian Linux 系统上构建它。这是我试图从以下位置接收输出的代码:
global _start
_start:
xor rax,rax
jmp short string
code:
pop rsi
push byte 15
push rsi
push byte 1
mov al,4
push rax
int 0x80
xor rax,rax
push rax
push rax
mov al,1
int 0x80
string:
call code
db 'Hello, world !',0x0a
我使用以下命令编译它
$> nasm -f elf64 hello.asm $> ld -s -o hello hello.o
当我尝试运行时没有输出。
关于我哪里出错了有什么建议吗?
【问题讨论】:
-
我假设从这段代码中您正在尝试为基于堆栈的缓冲区利用创建代码。对于 64 位代码,您应该使用
syscall而不是int 0x80,并且 64 位调用约定在寄存器中传递大多数syscall参数,而不是堆栈。 -
如果您在
strace下运行您的代码,您将获得它所做的系统调用的跟踪以及错误代码。