Я пытаюсь написать свой первый «Hello world» shellcode на моем 64-битном Ubuntu, но он не работает.Linux 64-bit 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
Я положил шеллкода из 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, он печатает «Hello world».
'.data' раздел (где код заканчивается) не является исполняемым по умолчанию. Кроме того, вы должны убедиться, что ваш код не зависит от положения. – Jester
На x86_64 вы уверены, что это действительно: 'length: equ $ -message' –