이하, 필자는 'Hello, World!'를 인쇄하는 x64 어셈블리를 작성했습니다. Mac OS X 10.8의 syscall에서. 독립 실행 형으로 실행되면 완벽하게 실행됩니다.C - 버스 오류 10에서 쉘 코드 테스트
; Assemble and link with:
; nasm -f macho64 -o HelloWorld.o HelloWorld.s
; ld -arch x86_64 -o HelloWorld HelloWorld.o
global start
section .text
start:
push rbp
mov rbp, rsp
jmp short String
xor rdi, rdi
mov di, 0x01
StringRet:
pop rsi
xor rdx, rdx
mov dl, 0xE
mov r8b, 0x02
shl r8, 24
or r8, 0x04
mov rax, r8
syscall ; System call for write(4)
xor edi, edi
mov r8b, 0x02
shl r8, 24
or r8, 0x01
mov rax, r8
syscall ; System call for exit(1)
mov rsp, rbp
pop rbp
String:
call StringRet
db 'Hello, World!'
문제는 내가이 코드를 C 프로그램에서 쉘 코드로 실행하려고 할 때 발생합니다. otool을 사용하여 다음 기계 opcode를 얻습니다.
otool -t HelloWorld.o
char code[] = "\x55\x48\x89\xe5\x41\xb0\x02\x49\xc1\xe0\x18\x49\x83\xc8\x04\x4c"
"\x89\xc0\x48\x31\xff\x66\xbf\x01\x00\xeb\x1e\x5e\x48\x31\xd2\xb2"
"\x0e\x0f\x05\x41\xb0\x02\x49\xc1\xe0\x18\x49\x83\xc8\x01\x4c\x89"
"\xc0\x31\xff\x0f\x05\x48\x89\xec\x5d\xe8\xdd\xff\xff\xff\x48\x65"
"\x6c\x6c\x6f\x2c\x20\x57\x6f\x72\x6c\x64\x21";
다음은이 프로그램을 실행하는 데 사용하는 C 프로그램입니다. 그러나 나는 버스 오류가 계속 : 나는 gdb를 통해 단계 때 실행이 쉘 코드에 전달 될 때 (10)
; Compile:
; gcc -o HelloWorldTest HelloWorldTest.c
char code[] = "\x55\x48\x89\xe5\x41\xb0\x02\x49\xc1\xe0\x18\x49\x83\xc8\x04\x4c"
"\x89\xc0\x48\x31\xff\x66\xbf\x01\x00\xeb\x1e\x5e\x48\x31\xd2\xb2"
"\x0e\x0f\x05\x41\xb0\x02\x49\xc1\xe0\x18\x49\x83\xc8\x01\x4c\x89"
"\xc0\x31\xff\x0f\x05\x48\x89\xec\x5d\xe8\xdd\xff\xff\xff\x48\x65"
"\x6c\x6c\x6f\x2c\x20\x57\x6f\x72\x6c\x64\x21";
int main()
{
int (*ret)();
ret = (int(*)())code;
(int)(*ret)();
return 0;
}
나는 KERN_PROTECTION_FAILURE 권리를 얻는다.
업데이트 질문 :
위는 칼 Norum에 의해 해결되었다, 그것은 메모리 보호 때문. 나는 다른 문제가 있지만 위와 비슷합니다. 동일한 파일에 셸 코드가있는 대신 .txt 파일에서 셸 코드를 읽고 실행하려고합니다. 아래에서는 PROT_EXEC로 메모리 섹션을 표시하고 .txt 파일의 내용을 읽고 실행 해 보았습니다. 하지만 작동하지 않습니다, 나는 같은 오류, KERN_PROTECTION_FAILURE, mprotect 및 mmap PROT_EXEC 같이 메모리 섹션을 표시하는 데 사용하여 노력하고있어.
#include <stdio.h>
#include <sys/mman.h>
#include <string.h>
#include <stdlib.h>
int (*ret)();
unsigned char* buf;
int main()
{
FILE* file;
file = fopen("text.txt", "rb");
unsigned int len = ftell(file);
buf = (char*)malloc(len);
fread(buf, 1, len, file);
fclose(file);
mprotect(&buf, len, PROT_EXEC);
// I also tried mmap, but same error.
/*void *ptr = mmap(0, 1024, PROT_EXEC, MAP_ANON | MAP_PRIVATE, -1, 0);
if (ptr == MAP_FAILED)
{
perror("mmap");
exit(-1);
}
memcpy(ptr, buf, 1024);*/
ret = buf;
ret();
return 0;
}
이
은 그 같은 안녕하세요 세계 코드 내가에서 읽고있어 text.txt 파일입니다\x55\x48\x89\xe5\xeb\x33\x48\x31\xff\x66\xbf\x01\x00\x5e\x48\x31\xd2\xb2\x0e\x41\xb0\x02\x49\xc1\xe0\x18\x49\x83\xc8\x04\x4c\x89\xc0\x0f\x05\x31\xff\x41\xb0\x02\x49\xc1\xe0\x18\x49\x83\xc8\x01\x4c\x89\xc0\x0f\x05\x48\x89\xec\x5d\xe8\xc8\xff\xff\xff\x48\x65\x6c\x6c\x6f\x2c\x20\x57\x6f\x72\x6c\x64\x21\x0a
내가 PROC_EXEC 메모리에 txt 파일의 내용을 복사하고 있습니다 때문에, I 내가 KERN_PROTECTION_FAILURE를 얻는 이유를 이해하지 못한다.
새로운 텍스트 파일은 문자 백 슬래시 포함되어 있습니까
은 다음 섹션 - 재정의 체조를 할 필요없이 작동하는 프로그램입니다 , x, 5, 5 등? 또는 '\ x55'(숫자 7 IIRC) 문자가 포함되어 있습니까? –
예. \ x, .txt 파일은 위와 동일합니다. –
C 프로그램에서'malloc'의 리턴 값을 캐스트 할 필요가 없습니다. –