Я написал файл NASM в 64:NASM не работает надлежащим образом в C
section .text
global _start
_start:
jmp j
r:
pop rsi
mov al, 1d
mov dil, 1d
mov dl, 13d
syscall
xor eax, eax
mov al, 60d
syscall
j: call r
db "Hello World!",10
Составлено с:
nasm -f elf64 -o TEMP.o file.asm
ld -s -o exec TEMP.o
Shellcode:
\xeb\x10\x5e\xb0\x01\x40\xb7\x01\xb2\x0d\x0f\x05\x31\xc0\xb0\x3c\x0f\x05\xe8\xeb\xff\xff\xff\x48\x65\x6c\x6c\x6f\x20\x57\x6f\x72\x6c\x64\x21\x0a
Когда я исполняю ./exec
, он печатает «Привет, мир», как и должно быть. Однако, когда я помещаю его в следующий файл C, он дает мне ошибку сегментации.
Кроме того, когда я изменяю:
unsigned char shellcode[] = ...
в
unsigned char * shellcode = ...
я не получаю никакого вывода вообще.
C Источник:
#include <stdio.h>
#include <string.h>
unsigned char shellcode[] = "\xeb\x10\x5e\xb0\x01\x40\xb7\x01\xb2\x0d\x0f\x05\x31\xc0\xb0\x3c\x0f\x05\xe8\xeb\xff\xff\xff\x48\x65\x6c\x6c\x6f\x20\x57\x6f\x72\x6c\x64\x21\x0a";
int main(){
printf("Shellcode Length (Bytes): %d\n", strlen(shellcode));
((void(*)(void))shellcode)();
return 0;
}