源码探秘:OWASP ZSC的Stack推栈生成器与寄存器使用技巧 📅 2026/8/16 19:08:44 源码探秘OWASP ZSC的Stack推栈生成器与寄存器使用技巧【免费下载链接】ZSCOWASP ZSC - Shellcode/Obfuscate Code Generator https://www.secologist.com/项目地址: https://gitcode.com/gh_mirrors/zs/ZSCOWASP ZSC 是一款开源的 Shellcode/代码混淆生成器专为安全研究者和渗透测试人员设计。本文带你深入源码揭开OWASP ZSC中Stack推栈生成器的工作奥秘并解析它在生成 shellcode 时巧妙运用 x86 寄存器的技巧。无论你是刚接触 shellcode 的初学者还是想借鉴开源实现思路的开发者这篇源码解析都能帮你快速建立对汇编指令如何变成机器码的完整认知。为什么需要 Stack推栈生成器在 x86 架构下系统调用如execve、chmod要求把参数放在寄存器里。但 shellcode 最大的痛点是不能出现\x00空字节且要尽量短小精悍。字符串如何塞进寄存器答案就是——通过栈。push指令可以把 4 字节的立即数压入栈顶随后mov %esp, %ebx就能让寄存器指向这段字符串这就是经典的推栈传参技巧。OWASP ZSC 的核心模块 core/stack.py 里的generate()函数就是专门把字符串或整数自动翻译成一段压栈 移位汇编序列的自动化引擎。探秘核心generate() 是如何工作的打开 core/stack.pygenerate(data, register, gtype)接收三个参数data要压入栈的字符串或数字register最终指向栈数据的寄存器如%ebx、%ecxgtype数据类型string或int它的处理逻辑非常清晰类型转换字符串先经st()反向并转成十六进制因为 x86 栈是小端序八进制/十六进制数字则统一转为0x前缀的 hex。短数据处理长度 ≤ 3 字节时直接push立即数并用popshr逻辑右移把高位多余的0x90NOP 空指令洗掉再压回栈。长数据分块长度 ≥ 4 字节时把字符串按 8 个十六进制字符即 4 字节切成一块从尾部开始依次 push保证栈顶正好是字符串开头。如果块数不是整数就用0x90补齐空位再配合shr微调最终只保留有效数据。举个例子往%ebx压入短字符串时生成的典型汇编是这样的push $0x6e69622f pop %ebx shr $0x8,%ebx push %ebx整个过程完全自动化这也是为什么它能同时支持 Linux、Windows、macOSOSX多平台。寄存器使用技巧谁该用哪个寄存器在 x86 的 Linux 系统调用约定里eax存放系统调用号ebx/ecx/edx依次存放第 1~3 个参数。OWASP ZSC 的生成器模板深谙此道把寄存器分工写进了各个功能模块功能模板寄存器用途源码位置执行文件execve字符串进%ebx调用号0xb进%allib/generator/linux_x86/exec.py修改权限chmod权限数字进%ecx文件路径进%ebxlib/generator/linux_x86/chmod.py执行系统命令整条命令字符串进%ecxlib/generator/linux_x86/system.py下载并执行拼接后的 wget 命令进%ecxlib/generator/linux_x86/download_execute.py细看 exec.py 的模板先用mov $0x46,%al设置setuid调用号然后mov %esp,%ebx让ebx指向栈上的文件名最后mov $0xb,%al; int $0x80触发execve。一个寄存器干一件事参数顺序与内核约定一一对应这种清晰的分工正是 shellcode 稳定运行的关键。从汇编到机器码opcoder 的魔法stack.generate()产出的只是汇编文本真正变成\x31\xc0这样的字节码靠的是 lib/opcoder/linux_x86.py 中的convert()函数。它的实现思路堪称教科书级静态字典替换维护一张汇编指令 → 机器码的映射表比如xor %eax,%eax→31 c0、int $0x80→cd 80一次遍历全部替换。动态指令编码对push $0x...、mov $0x...、xor大立即数等按指令长度分情况编码。例如push $0x后跟 8 位 hex 时编码为6a xx16 位时编码为68 xx xx xx xx。统一收尾最后调用stack.shellcoder()把连续字节拼成\x6a\x0f的标准 shellcode 字符串格式。Windows 平台还有独立的 lib/opcoder/windows_x86.py额外支持lods、call *%edx、mov %fs:0x30(%ecx),%eaxPEB 遍历等 Windows 特有指令甚至能处理jne的相对跳转偏移计算。入口统一由 core/opcoder.py 的op()按操作系统分发扩展新平台只需在lib/opcoder/下新增一个文件。一条 shellcode 的完整诞生流水线把整个链路串起来OWASP ZSC 生成一条 shellcode 的过程是用户输入参数 → generator 模板选定功能 寄存器分工 → stack.generate()字符串/数字 → 压栈汇编 → opcoder.convert()汇编 → 机器码字节 → shellcoder()字节 → \x 格式输出以chmod 777 /tmp/a为例文件路径会先被 core/stack.py 的推栈逻辑变成一串push $0x...777这个八进制数字则转成0x1ff压入%ecx最终由 opcoder 输出可直接注入的字节码。整个过程用户无需手写一行汇编这正是OWASP ZSC 这类 Shellcode 生成器对新手最大的价值。写在最后给学习者的三点建议先读 core/stack.py它是整个项目最精巧的模块读懂了推栈 移位的思路你就掌握了 x86 shellcode 最常用的数据装载手法。对照 opcoder 字典表把 lib/opcoder/linux_x86.py 里的静态映射表当作汇编速查手册逐条用objdump验证记忆会非常牢固。动手改模板在 lib/generator/linux_x86/ 下仿照exec.py写一个自己的功能模板很快你就能独立设计 shellcode 了。OWASP ZSC 的代码量不大却把栈、寄存器、系统调用、机器码四大主题浓缩在几百行 Python 里。希望这篇源码解析能成为你探索 Shellcode 世界的一块好用的敲门砖。【免费下载链接】ZSCOWASP ZSC - Shellcode/Obfuscate Code Generator https://www.secologist.com/项目地址: https://gitcode.com/gh_mirrors/zs/ZSC创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考