x64架构下C嵌入Shellcode触发Segmentation Fault问题求助
问题分析与解决
核心问题:Shellcode机器码不完整
你提取的shellcode缺失了一个关键字节,导致CPU执行错误指令,触发段错误。
原汇编中mov rax, 0x68732f2f6e69622f是64位立即数赋值,对应的机器码是0x48 0xb8后跟随8字节小端序立即数,但你当前的code数组里只写了7个字节,少了最后一个\x68。
修正后的C测试程序
// tester.c // gcc -m64 -z execstack -fno-stack-protector -o tester tester.c #include <stdio.h> #include <string.h> // 补上缺失的\x68字节 unsigned char code[] = "\x48\x31\xd2\x52\x48\xb8\x2f\x62\x69\x6e\x2f\x73\x68\x68\x50\x48\x89\xe7\x52\x57\x48\x89\xe6\x48\x31\xc0\xb0\x3b\x0f\x05"; int main() { // 注意:strlen会在第一个\x00处停止,shellcode含\x00时不能用它计算长度 printf("shellcode length: %zu\n", sizeof(code) - 1); int (*ret)() = (int(*)())code; ret(); }
额外注意事项
- 避免用
strlen计算shellcode长度:shellcode中可能包含\x00字节(比如xor rdx, rdx会产生\x00),strlen会在第一个\x00处截断,导致长度计算错误,应使用sizeof(code) - 1(减去末尾的终止\x00)。 - 确保数据段可执行:全局数组默认在
.data段,-z execstack仅开启栈的可执行权限,若要让.data段可执行,可添加编译选项-Wl,-z,execstack(直接传递给链接器),也可将shellcode定义为局部变量放到栈中执行。
验证步骤
- 编译修正后的程序:
gcc -m64 -z execstack -fno-stack-protector -o tester tester.c
- 运行程序即可正常获取shell。
内容的提问来源于stack exchange,提问作者RobertGG
相关产品推荐
相关产品推荐

