2014-02-03 2 views
0

Я написал файл 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; 
} 

ответ

0

Я считаю, что я понял это. Только недавно я переехал в Кранчбанг. Теперь я должен указать -z execstack, чтобы он работал. Спасибо всем, кто действительно пытался дать мне ответ!

Смежные вопросы