我尝试在c中执行shellcode。但我遇到了分段错误错误。 我在Kali Linux虚拟机上尝试过。 shellcode的目的是将hello shellcode打印到屏幕上 这是我的代码:
// shellcode_example.c
#include <stdio.h>
int main() {
printf("Hello, Shellcode!\n");
return 0;
}
这是十六进制代码的摘录:
gcc -o shellcode_example shellcode_example.c
objdump -d -M intel shellcode_example
080484b6 <main>:
80484b6: 55 push ebp
80484b7: 89 e5 mov ebp,esp
80484b9: 83 ec 08 sub esp,0x8
80484bc: 68 60 86 04 08 push 0x8048660
80484c1: e8 aa fe ff ff call 8048370 <puts@plt>
80484c6: 83 c4 04 add esp,0x4
80484c9: b8 00 00 00 00 mov eax,0x0
80484ce: c9 leave
80484cf: c3 ret
这是shellcode执行:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/mman.h>
// Shellcode: Bu, örnek bir NOP (no-operation) shellcode'dur
unsigned char shellcode[] = {
0x90, 0x90, 0x90, 0x90, 0xC3 // Think, it's mine shellcode.
};
int main() {
void *mem = mmap(NULL, sizeof(shellcode), PROT_READ | PROT_WRITE | PROT_EXEC, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);
if (mem == MAP_FAILED) {
perror("mmap");
return 1;
}
// Shellcode'ı tahsis edilen belleğe kopyala
memcpy(mem, shellcode, sizeof(shellcode));
// Bir işlev işaretçisi oluştur ve bellek konumuna dönüştür
typedef void (*ShellcodeFunction)();
ShellcodeFunction func = (ShellcodeFunction)mem;
// Shellcode'ı yürüt
func();
// Tahsis edilen belleği serbest bırak
munmap(mem, sizeof(shellcode));
return 0;
}
有什么解决办法吗? 我尝试了互联网上的所有解决方案。
我尝试:
gcc -fno-stack-protector -z execstack -O OutputFileName yourShellCode.c
我使用了局部变量和全局变量,但没有改变。
objdump -d -M intel shellcode_example
objdump
显示了两件事是错误的:
libc
(此处为puts
)。位置相关的二进制文件必须加载到它链接的地址(此处为
0x08048000
)。您不能在任意地址 mmap
该二进制文件并期望它能够工作)。
动态链接的二进制文件要求运行时加载程序设置该二进制文件的程序链接表(因此对
puts@plt
的调用将解析为libc.so
内的符号定义)。但运行时加载程序完全不知道该二进制文件的存在,因此不会对该二进制文件执行任何操作。
TL;DR:你的“shell 代码”必须避免使用绝对地址和动态链接(这就是为什么它通常用汇编语言编写)。