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

取自Shellcoder手册的Shellcode无法生成Shell的问题求助

排查32位Shellcode在64位WSL环境下无法执行的问题

看起来你的问题出在32位Shellcode和64位编译环境不兼容上,结合你的代码和环境,我们一步步分析:

1. 先拆解你的Shellcode逻辑

这段来自《Shellcoder's Handbook》的Shellcode是经典的32位x86 Linux Shellcode,用了jmp-call-pop技术构造execve("/bin/sh", ["/bin/sh", NULL], NULL)调用,汇编逻辑如下:

jmp short 0x1c       ; 跳转到后面的call指令
pop esi              ; 从栈中弹出"/bin/sh"的起始地址到esi
xor eax,eax          ; eax置0
mov byte [esi+7],al  ; 把"/bin/sh"的第8个字节设为0,让字符串以null结尾
lea ebx,[esi]        ; ebx指向"/bin/sh"
mov [esi+8],ebx      ; 构造argv数组:argv[0] = "/bin/sh"
mov [esi+0xc],eax    ; argv[1] = NULL,结束数组
mov al,0xb           ; eax设为0xb(32位Linux中execve的系统调用号)
mov ebx,esi          ; ebx = "/bin/sh"地址
lea ecx,[esi+8]      ; ecx指向argv数组
lea edx,[esi+0xc]    ; edx指向envp(这里是NULL)
int 0x80             ; 触发系统调用
call 0x0             ; 调用前面的jmp,把"/bin/sh"地址压栈
db '/bin/sh'         ; 字符串常量

逻辑本身是正确的,但它是纯32位指令,无法在64位程序的执行模式下正常运行。

2. 你的环境问题:WSL默认是64位编译

Windows 10上的Ubuntu子系统默认是64位架构,gcc默认编译生成64位二进制程序。当你的64位程序跳转到32位Shellcode执行时,CPU处于64位长模式,执行32位指令会出现指令解析错误或寄存器使用不匹配,导致execve调用失败,程序无反应。

3. 解决方案:编译为32位程序

要让这段32位Shellcode正常运行,你需要:

步骤1:安装32位编译依赖

WSL默认没有安装32位库,先执行:

sudo apt update && sudo apt install gcc-multilib libc6-dev-i386

步骤2:用-m32参数编译

修改你的编译命令,强制生成32位程序:

gcc -m32 -fno-stack-protector -z execstack shellcode.c -o shellcode

步骤3:运行程序

执行生成的./shellcode,应该就能正常弹出/bin/sh的交互Shell了。

4. 额外调试建议

如果还是有问题,可以用gdb调试确认执行流程:

  1. 带调试信息编译:gcc -m32 -g -fno-stack-protector -z execstack shellcode.c -o shellcode
  2. 启动gdb:gdb ./shellcode
  3. 在main函数的返回地址处设断点,跟踪是否成功跳转到Shellcode,再单步执行指令排查哪里出错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:09:50