largebin attack
largebin attack 由这个名字就可以看出是对 largebin 进行的操作,需要的条件是存在 UAF 或者可以构造出 UAF。实现的功能是:
1、任意地址写入一个大数字
2、实现任意地址分配(这个好像也叫 house of strom,以后另开一章来记)
关键源码:
else
{
victim_index = largebin_index (size);
bck = bin_at (av, victim_index);
fwd = bck->fd; /* maintain large bins in sorted order */
if (fwd != bck)
{
/* Or with inuse bit to speed comparisons */
size |= PREV_INUSE;
/* if smaller than smallest, bypass loop below */
assert ((bck->bk->size & NON_MAIN_ARENA) == 0);
if ((unsigned long) (size) < (unsigned long) (bck->bk->size))
{
fwd = bck;
bck = bck->bk; victim->fd_nextsize = fwd->fd;
victim->bk_nextsize = fwd->fd->bk_nextsize;
fwd->fd->bk_nextsize = victim->bk_nextsize->fd_nextsize = victim;
}
else
{
assert ((fwd->size & NON_MAIN_ARENA) == 0);
while ((unsigned long) size < fwd->size)
{
fwd = fwd->fd_nextsize;
assert ((fwd->size & NON_MAIN_ARENA) == 0);
} if ((unsigned long) size == (unsigned long) fwd->size)
/* Always insert in the second position. */
fwd = fwd->fd;
else
{
victim->fd_nextsize = fwd;
victim->bk_nextsize = fwd->bk_nextsize;
fwd->bk_nextsize = victim;
victim->bk_nextsize->fd_nextsize = victim;
}
bck = fwd->bk;
}
}
else
victim->fd_nextsize = victim->bk_nextsize = victim;
} mark_bin (av, victim_index);
victim->bk = bck;
victim->fd = fwd;
fwd->bk = victim;
bck->fd = victim;
我们用 hollk 师傅改过的 how2heap 的源码来当作示例。(源码会放在附件里)
首先定义了两个无符号长整型并且赋值为0。

可以看到 stack_var1_addr = 0x7fffffffdfc8 , stack_var2_addr = 0x7fffffffdfd0 , 并且只都为 0。
再往下继续走,到创建完最后一个 0x30 大小的堆块。

p1,p2,p3 分别对应着0x330,0x410,0x410 大小的堆块头指针。
接下来去释放p1

再去释放p2

从wiki上抠出一张图

由于p1,p2都超过了 fastbin 的最大大小他们都会进入 unsorted bin,再往下,由于 chunk1 < 0x400,最后会进 small bin,而 chunk2 > 0x400,故最后会进large bin。
再往下到void* p4 = malloc(0x90); 申请了一个 0xa0 的堆块。这一行其实做了很多的事情。
1、通过 bk 从unsorted bin 拿出 chunk1 放入small bin ,并标记这个 small bin 中有空闲的 chunk。
2、继续通过 bk 从 unsorted bin 拿出 chunk2 放入 large bin,并标记这个large bin 有空闲的 chunk。
3、从small bin 中分割出一小块来满足 p4 ,再把剩下的 chunk(0x330 - 0xa0),放回unsorted bin 中。

我们接下来再释放一个 0x410 大小的 chunk,也就是 p3

由于他的大小是 0x410,所以也是会先被放进 unsorted bin过度,再放进 large bin中。
接下来的几行就是我们对 p2 直接进行的构造

构造前:

构造后:

我们把
1、size 由 0x411 改为了 0x3f1
2、fd 和 fd_nextsize 置零
3、bk 改为 stack_var1_addr - 0x10(0x00007fffffffdfb8)
4、bk_nextsize 改为 stack_var2_addr - 0x20(0x00007fffffffdfb0)
下面又从 hollk 师傅的文章里抠出一张图

再往下继续void* p4 = malloc(0x90); 申请了一个 0xa0 的堆块。干的事情也很多
1、通过 bk 从unsorted bin 拿出 刚才剩下的那个 chunk(0x290) 放入small bin ,并标记这个 small bin 中有空闲的 chunk。
2、继续通过 bk 从 unsorted bin 拿出 chunk3 放入 large bin,并标记这个large bin 有空闲的 chunk。
3、从 small bin 中分割出一小块来满足 p4 ,再把剩下的 chunk(0x290 - 0xa0),放回unsorted bin 中。

由于 chunk3 是属于 large bin 的 chunk ,故会进入 large bin 的分支,我们再来看上面的源码。
里面的 fwd 就是 p2,victim 也就是 p3,bck 也就是 p2->bk。
由于 p2 的 size 被我们改过了 0x3f1,比 p3 的要小,故前面两个 if 语句不符合,最后会进入如下内容
else
{
victim->fd_nextsize = fwd;
victim->bk_nextsize = fwd->bk_nextsize;
fwd->bk_nextsize = victim;
victim->bk_nextsize->fd_nextsize = victim;
}
我们之前的构造已经使 p2->bk->fd = stack_var1_addr , p2->bk_nextsize->fd_nextsize = stack_var2_addr。
经过这四行的源码就会使
1、p3->fd_nextsize = p2
2、p3->bk_nextsize = p2->bk_nextsize
3、p2->bk_nextsize = p3
4、p3->bk_nextsize->fd_nextsize = p3
2+4组合起来也就是 p3->bk_nextsize = p2->bk_nextsize = stack_var2_addr - 0x20,p3->bk_nextsize->fd_nextsize =*(( stack_var2_addr - 0x20 )+ 0x20) = stack_var2 = p3
也就是 stack_var2 = p3。
接着源码里也有这几行
mark_bin (av, victim_index);
victim->bk = bck;
victim->fd = fwd;
fwd->bk = victim;
bck->fd = victim;
那么就会使
1、p3->bk = p2->bk
2、p3->fd = p2
3、p2->bk = p3
4、p2->bk->fd = p3
构造好的数据结合4就可以使 p2->bk->fd = *((stack_var2_addr - 0x10)+ 0x10)= stack_var2 = p3。
看一下最后修改的结果,也就是把 stack_var1 和 stack_var2 里的值改为 p3 的头指针。

最后补充一下 large bin attack 需要的条件
1、可以修改某个 large bin 的数据 size , fd , bk , fd_nextsize , bk_nextsize
2、构造过的 large bin chunk 要在正常 large bin chunk 的前面进入 large bin链表
提取码:fs74
参考链接:
https://xz.aliyun.com/t/5177?page=1
https://ctf-wiki.org/pwn/linux/user-mode/heap/ptmalloc2/large-bin-attack/
https://blog.csdn.net/qq_41202237/article/details/112825556
largebin attack的更多相关文章
- 2021能源PWN wp
babyshellcode 这题考无write泄露,write被沙盒禁用时,可以考虑延时盲注的方式获得flag,此exp可作为此类型题目模版,只需要修改部分参数即可,详细见注释 from pwn im ...
- heap exploit about ptmalloc in glibc version 2.31
学习的一下高版本的libc的利用方式. 项目地址:https://github.com/StarCross-Tech/heap_exploit_2.31 tcache_dup 源代码: 1 #incl ...
- glibc2.29以上 IO_FILE 及 house of pig
摆烂很长时间之后,终于下定决心来看点新的东西.正好 winmt 师傅前不久把他 pig 修好的附件发给我了,我就借此来学习一下新版本的 IO_FILE 及 house of pig. 新版本的 IO_ ...
- House of apple 一种新的glibc中IO攻击方法
目录 House of apple 一种新的glibc中IO攻击方法 前言 利用条件 利用原理 利用思路 思路一:修改tcache线程变量 思路二:修改mp_结构体 思路三:修改pointer_gua ...
- 堆Pwn:House Of Storm利用手法
0x00:介绍 利用手法的背景: house of storm是一种结合了unsorted bin attack和Largebin attack的攻击技术,其基本原理和Largebin attack类 ...
- 【Cocos2d-x for WP8 学习整理】(2)Cocos2d-Html5 游戏 《Fruit Attack》 WP8移植版 开源
这一阵花了些时间,把 cocos2d-html5 里的sample 游戏<Fruit Attack>给移植到了WP8上来,目前已经实现了基本的功能,但是还有几个已知的bug,比如WP8只支 ...
- Web 服务器 low bandth DOS attack
https://www.owasp.org/images/0/04/Roberto_Suggi_Liverani_OWASPNZDAY2010-Defending_against_applicatio ...
- CF 701B Cells Not Under Attack(想法题)
题目链接: 传送门 Cells Not Under Attack time limit per test:2 second memory limit per test:256 megabyte ...
- ASP.NET Padding Oracle Attack EXP
#!/usr/bin/perl## PadBuster v0.3 - Automated script for performing Padding Oracle attacks# Brian Hol ...
随机推荐
- 物理CPU,物理核,逻辑CPU,虚拟CPU(vCPU)区别 (转)
在做虚拟化时候,遇到划分CPU的问题,因此考虑到CPU不知道具体怎么划分,查询一些资料后就写成本文. a. 物理CPU:物理CPU是相对于虚拟CPU而言的概念,指实际存在的处理器,就是我们可以看的见, ...
- 入门-k8s查看Pods/Nodes (四)
目标 了解Kubernetes Pods(容器组) 了解Kubernetes Nodes(节点) 排查故障 Kubernetes Pods 在 部署第一个应用程序 中创建 Deployment 后,k ...
- docker 介绍及安装操作
docker 介绍及安装操作 1.docker概述 2.docker安装及操作 1.docker概述: Docker是一个开源的应用容器引擎,基于go语言开发并遵循了apache2.0协议开源 是在L ...
- Git配置ssh免密登录
一.在用户目录下的.ssh目录下生成秘钥与公钥 如果用户目录下没有.ssh目录,则需要新建一个 cd ~/.ssh ssh-keygen -t rsa 一路回车即可 注:国内很多博客都会带上-C &q ...
- JVM性能调优与实战基础理论篇-中
JVM内存模型 概述 我们所说的JVM内存模型是指运行时数据区,用New出来的对象放在堆中,如每个线程中局部变量放在栈或叫虚拟机栈中,下图左边区域部分为栈内存的结构.如main线程包含程序炯酸器.线程 ...
- 3、前端--伪元素选择器、选择器优先级、字体、背景、边框、display、盒子模型
伪元素选择器 # 首字调整>>>:也是一种文档布局的方式 p:first-letter { font-size: 48px; /*字体大小*/ color: red; } # 在文本 ...
- 【论文考古】联邦学习开山之作 Communication-Efficient Learning of Deep Networks from Decentralized Data
B. McMahan, E. Moore, D. Ramage, S. Hampson, and B. A. y Arcas, "Communication-Efficient Learni ...
- python-利用json模块处理json数据几个函数总结
1.前言 json是一种轻量级的数据交换格式,它是JavaScript的子集,易于人阅读和编写. 前端和后端进行数据交互,其实就是JS和Python进行数据交互. 接口间或者前后端间的语言不一致,不同 ...
- java宝典笔记(一)
第四章java基础知识 4.1基本概念 一.java优点 1.面向对象(封装.继承.多态) 2.可移植性.平台无关,一次编译,到处运行.Windows,Linux,macos等.java为解释性语言, ...
- Vue 源码解读(6)—— 实例方法
前言 上一篇文章 Vue 源码解读(5)-- 全局 API 详细介绍了 Vue 的各个全局 API 的实现原理,本篇文章将会详细介绍各个实例方法的实现原理. 目标 深入理解以下实例方法的实现原理. v ...