我想在我的Ubuntu 64位上編寫我的第一個「Hello world」shellcode,但它不起作用。Linux 64位shellcode
我有文件hello.asm:
; 64-bit "Hello World!" in Linux NASM
global _start ; global entry point export for ld
section .text
_start:
; sys_write(stdout, message, length)
mov rax, 1 ; sys_write
mov rdi, 1 ; stdout
mov rsi, message ; message address
mov rdx, length ; message string length
syscall
; sys_exit(return_code)
mov rax, 60 ; sys_exit
mov rdi, 0 ; return 0 (success)
syscall
section .data
message: db 'Hello, world!',0x0A ; message and newline
length: equ $-message ; NASM definition pseudo-instruction
我用這個命令:
nasm -felf64 hello.asm -o hello.o
ld -o hello hello.o
objdump -d hello
我把shellcode的從objdump的到我的C程序:
char code[] = "\xb8\x01\x00\x00\x00\xbf\x01\x00\x00\x00\x48\xbe\xd8\x00\x60\x00\x00\x00\x00\x00\xba\x0e\x00\x00\x00\x0f\x05\xb8\x3c\x00\x00\x00\xbf\x00\x00\x00\x00\x0f\x05";
int main(int argc, char **argv)
{
int (*func)();
func = (int (*)()) code;
(int)(*func)();
return 0;
}
和編譯它在gcc中,但運行後,我有「分段錯誤(核心傾銷)「。
我不知道我在做什麼錯。彙編代碼似乎工作,因爲當我運行./hello它打印「你好世界」。
'.data'節(代碼結束)是默認情況下不執行。此外,你應該確保你的代碼是獨立的位置。 – Jester 2014-11-09 01:55:25
在x86_64上,您確定這是有效的:'length:equ $ -message' – 2015-03-25 22:57:31