OneGadget与其他工具集成:打造完整的Pwn工具链
OneGadget是一款强大的libc漏洞利用工具,能够快速定位libc库中的one gadget RCE(远程代码执行)漏洞,帮助安全研究者和开发者构建高效的Pwn工具链。本文将详细介绍如何将OneGadget与其他工具集成,提升漏洞利用效率。
一、OneGadget核心功能解析
OneGadget的核心功能是在libc.so.6中寻找满足execve("/bin/sh", 0, 0)条件的代码片段,即one gadget。通过分析lib/one_gadget/one_gadget.rb源码可知,其主要通过两种方式定位gadget:基于BuildID查询和直接分析文件。
图1:OneGadget在x86_64架构下的执行结果,显示多个可用的execve调用及其约束条件
1.1 多架构支持
OneGadget支持多种处理器架构,包括:
- x86_64:如examples/x86_64.png所示,输出rsp寄存器相关的gadget
- i386:通过esp寄存器定位gadget,如examples/i386.png
- AArch64:针对ARM64架构的x20/x21寄存器约束,见examples/aarch64.png
1.2 灵活的查询方式
- 基于BuildID查询:通过libc的唯一标识快速定位预编译的gadget,如examples/from_build_id.png所示
- 文件直接分析:对本地libc文件进行深度扫描
- 近函数搜索:通过
--near参数查找特定函数附近的gadget,如examples/near.png中展示的exit和mkdir函数附近的结果
二、与漏洞利用框架的集成方案
2.1 与pwntools无缝协作
在pwntools脚本中集成OneGadget可显著提升漏洞利用效率:
from pwn import *
import subprocess
# 获取libc中的one gadget
def get_one_gadget(libc_path):
result = subprocess.check_output(f"one_gadget {libc_path}", shell=True).decode()
# 解析输出提取offset
offsets = [int(line.split()[0], 16) for line in result.splitlines() if line.startswith('0x')]
return offsets
# 实际漏洞利用代码
libc = ELF('./libc.so.6')
gadgets = get_one_gadget('./libc.so.6')
# 使用第一个gadget
rop = ROP(libc)
rop.raw(gadgets[0])
2.2 自动化脚本集成
OneGadget可与自动化漏洞利用脚本结合,如examples/script.png所示,通过管道操作快速获取offset并集成到exploit中:
#!/bin/bash
# 自动化获取one gadget并生成payload
OFFSET=$(one_gadget ./libc.so.6 | head -n1 | awk '{print $1}')
python -c "print('A'*104 + p64(0x$OFFSET))" > payload.txt
三、提升工具链效率的实用技巧
3.1 约束条件过滤
OneGadget输出的每个gadget都包含约束条件,如lib/one_gadget/builds/libc-2.24-24b1296687d36e24bd48b8c412157d94f074ecc2.rb中定义的:
effect: "execve(\"/bin/sh\", rsp+0x30, environ)",
constraints: ["[rsp+0x30] == NULL"]
选择约束条件简单的gadget(如仅需特定寄存器为NULL)可提高利用成功率。
3.2 多版本libc支持
OneGadget通过lib/one_gadget/builds/目录下的预编译文件支持多种libc版本,包括:
- libc-2.19至libc-2.31
- 特殊版本如libc-2.21.90、libc-2.23.90
四、完整工具链搭建步骤
4.1 安装与配置
# 克隆仓库
git clone https://gitcode.com/gh_mirrors/on/one_gadget
cd one_gadget
# 安装依赖
bundle install
# 构建gem包
gem build one_gadget.gemspec
# 安装gem
gem install one_gadget-*.gem
4.2 典型工作流
- 漏洞分析:使用IDA Pro或Ghidra确定漏洞类型和可控寄存器
- libc识别:通过
readelf -h或file命令获取libc版本信息 - gadget查找:
one_gadget libc.so.6 --level 1获取所有可能的gadget - 利用开发:结合pwntools编写exploit,集成OneGadget提供的offset
- 测试验证:使用GDB调试确认exploit有效性
五、常见问题解决方案
5.1 gadget执行失败
若gadget执行失败,可尝试:
- 使用
--level 1参数获取更多候选gadget - 检查约束条件是否满足(如寄存器值、内存可写性)
- 通过spec/gadget_spec.rb中的测试用例验证gadget有效性
5.2 新型libc支持
对于未包含的libc版本,可通过以下方式添加支持:
- 提取目标libc的BuildID:
readelf -n libc.so.6 | grep BuildID - 使用
one_gadget --generate生成新的build文件 - 提交PR到官方仓库
通过将OneGadget与pwntools、GDB等工具结合,安全研究者可以构建高效的漏洞利用工作流,显著提升Pwn任务的效率和成功率。无论是CTF竞赛还是漏洞研究,OneGadget都是不可或缺的重要工具。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



