You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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定义为局部变量放到栈中执行。

验证步骤

  1. 编译修正后的程序:
gcc -m64 -z execstack -fno-stack-protector -o tester tester.c
  1. 运行程序即可正常获取shell。

内容的提问来源于stack exchange,提问作者RobertGG

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 10:53:12