gpt4 book ai didi

c - 从 C 测试 Shellcode - 总线错误 10

转载 作者:太空狗 更新时间:2023-10-29 17:19:44 25 4
gpt4 key购买 nike

下面,我编写了打印“Hello, World!”的 x64 程序集。来自 Mac OS X 10.8 上的系统调用。它在独立执行时组装和运行完美。

; 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 程序中将此代码作为 shell 代码运行时。我使用 otool 获取以下机器操作码。

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 程序。但我不断收到总线错误: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;
}

当我单步执行 gdb 时,当执行传递给 shellcode 时,我得到了 KERN_PROTECTION_FAILURE。

更新问题:

上面是Carl Norum解决的,是内存保护的问题。我有一个不同的问题,但与上面类似。我不想将 shell 代码放在同一个文件中,而是想从 .txt 文件中读取 shell 代码并执行它。下面我尝试将一段内存标记为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 文件,它是相同的 hello world 代码:

\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

因为我正在将 txt 文件的内容复制到 PROC_EXEC 内存中,所以我不明白为什么会出现 KERN_PROTECTION_FAILURE。

最佳答案

您的程序尝试从标记为“execute disable”的内存页面执行 shellcode,这是数据部分内存的默认设置。这就是您看到 KERN_PROTECTION_FAILURE 的原因。您需要将 shellcode 放在文本部分:

__attribute__((section("__TEXT,__text")))
char code[] = ...

这样做之后,您的程序就可以正常工作了:

$ clang -Wall -Wextra -pedantic -O2 example.c -o example
$ ./example
Hello, World!

编辑说明:您不需要对函数指针调用进行类型转换。只需 ret(); 就可以了。您至少需要删除 (int) 部分才能在没有警告的情况下进行编译。

编辑:

这是一个不需要你做部分覆盖体操就可以工作的程序:

#include <sys/mman.h>
#include <inttypes.h>
#include <unistd.h>

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\x0a";

int main()
{
int (*ret)() = (int (*)())code;
void *page = (void *)((uintptr_t)code & ~(getpagesize() - 1));

mprotect(page, sizeof code, PROT_EXEC);

ret();

return 0;
}

运行示例:

$ clang -O2 -Wall -Wextra example.c -o example
$ ./example
Hello, World!
$ gcc -O2 -Wall -Wextra example.c -o example
$ ./example
Hello, World!

关于c - 从 C 测试 Shellcode - 总线错误 10,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17822771/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com