largebin attack 由这个名字就可以看出是对 largebin 进行的操作,需要的条件是存在 UAF 或者可以构造出 UAF。实现的功能是:

1、任意地址写入一个大数字

2、实现任意地址分配(这个好像也叫 house of strom,以后另开一章来记)

关键源码:

  1. else
  2. {
  3. victim_index = largebin_index (size);
  4. bck = bin_at (av, victim_index);
  5. fwd = bck->fd;
  6.  
  7. /* maintain large bins in sorted order */
  8. if (fwd != bck)
  9. {
  10. /* Or with inuse bit to speed comparisons */
  11. size |= PREV_INUSE;
  12. /* if smaller than smallest, bypass loop below */
  13. assert ((bck->bk->size & NON_MAIN_ARENA) == 0);
  14. if ((unsigned long) (size) < (unsigned long) (bck->bk->size))
  15. {
  16. fwd = bck;
  17. bck = bck->bk;
  18.  
  19. victim->fd_nextsize = fwd->fd;
  20. victim->bk_nextsize = fwd->fd->bk_nextsize;
  21. fwd->fd->bk_nextsize = victim->bk_nextsize->fd_nextsize = victim;
  22. }
  23. else
  24. {
  25. assert ((fwd->size & NON_MAIN_ARENA) == 0);
  26. while ((unsigned long) size < fwd->size)
  27. {
  28. fwd = fwd->fd_nextsize;
  29. assert ((fwd->size & NON_MAIN_ARENA) == 0);
  30. }
  31.  
  32. if ((unsigned long) size == (unsigned long) fwd->size)
  33. /* Always insert in the second position. */
  34. fwd = fwd->fd;
  35. else
  36. {
  37. victim->fd_nextsize = fwd;
  38. victim->bk_nextsize = fwd->bk_nextsize;
  39. fwd->bk_nextsize = victim;
  40. victim->bk_nextsize->fd_nextsize = victim;
  41. }
  42. bck = fwd->bk;
  43. }
  44. }
  45. else
  46. victim->fd_nextsize = victim->bk_nextsize = victim;
  47. }
  48.  
  49. mark_bin (av, victim_index);
  50. victim->bk = bck;
  51. victim->fd = fwd;
  52. fwd->bk = victim;
  53. 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 语句不符合,最后会进入如下内容

  1. else
  2. {
  3. victim->fd_nextsize = fwd;
  4. victim->bk_nextsize = fwd->bk_nextsize;
  5. fwd->bk_nextsize = victim;
  6. victim->bk_nextsize->fd_nextsize = victim;
  7. }

我们之前的构造已经使 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。

接着源码里也有这几行

  1. mark_bin (av, victim_index);
  2. victim->bk = bck;
  3. victim->fd = fwd;
  4. fwd->bk = victim;
  5. 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的更多相关文章

  1. 2021能源PWN wp

    babyshellcode 这题考无write泄露,write被沙盒禁用时,可以考虑延时盲注的方式获得flag,此exp可作为此类型题目模版,只需要修改部分参数即可,详细见注释 from pwn im ...

  2. heap exploit about ptmalloc in glibc version 2.31

    学习的一下高版本的libc的利用方式. 项目地址:https://github.com/StarCross-Tech/heap_exploit_2.31 tcache_dup 源代码: 1 #incl ...

  3. glibc2.29以上 IO_FILE 及 house of pig

    摆烂很长时间之后,终于下定决心来看点新的东西.正好 winmt 师傅前不久把他 pig 修好的附件发给我了,我就借此来学习一下新版本的 IO_FILE 及 house of pig. 新版本的 IO_ ...

  4. House of apple 一种新的glibc中IO攻击方法

    目录 House of apple 一种新的glibc中IO攻击方法 前言 利用条件 利用原理 利用思路 思路一:修改tcache线程变量 思路二:修改mp_结构体 思路三:修改pointer_gua ...

  5. 堆Pwn:House Of Storm利用手法

    0x00:介绍 利用手法的背景: house of storm是一种结合了unsorted bin attack和Largebin attack的攻击技术,其基本原理和Largebin attack类 ...

  6. 【Cocos2d-x for WP8 学习整理】(2)Cocos2d-Html5 游戏 《Fruit Attack》 WP8移植版 开源

    这一阵花了些时间,把 cocos2d-html5 里的sample 游戏<Fruit Attack>给移植到了WP8上来,目前已经实现了基本的功能,但是还有几个已知的bug,比如WP8只支 ...

  7. Web 服务器 low bandth DOS attack

    https://www.owasp.org/images/0/04/Roberto_Suggi_Liverani_OWASPNZDAY2010-Defending_against_applicatio ...

  8. CF 701B Cells Not Under Attack(想法题)

    题目链接: 传送门 Cells Not Under Attack time limit per test:2 second     memory limit per test:256 megabyte ...

  9. ASP.NET Padding Oracle Attack EXP

    #!/usr/bin/perl## PadBuster v0.3 - Automated script for performing Padding Oracle attacks# Brian Hol ...

随机推荐

  1. JFrame 的层次结构 及 背景设置说明

    感谢原文:https://blog.csdn.net/qq_32006373/article/details/49659129 一.JFrame 的层次结构 我们通过两个图来说明一下 JFrame 的 ...

  2. JAVA多线程学习五:线程范围内共享变量&ThreadLocal

    一.概念 可以将每个线程用到的数据与对应的线程号存放到一个map集合中,使用数据时从这个集合中根据线程号获取对应线程的数据,就可以实现线程范围内共享相同的变量. 二.代码 Runnable中的run( ...

  3. docker容器编排 (4)

    容器编排 我们的项目可能会使用了多个容器,容器多了之后管理容器的工作就会变得麻烦.如果要对多个容器进行自动配置使得容器可以相互协作甚至实现复杂的调度,这就需要进行容器编排.Docker原生对容器编排的 ...

  4. js修改css

    转载请注明来源:https://www.cnblogs.com/hookjc/ <style type="text/css"> .style{font-size:9pt ...

  5. tabbar选中按钮的标题颜色和字体

    @implementation XMGTabBarController /* 问题: 1.选中按钮的图片被渲染 -> iOS7之后默认tabBar上按钮图片都会被渲染 1.修改图片 2.通过代码 ...

  6. shell脚本之数组基本操作及排序

    数组的基本操作及排序 1.数组定义方法: ( 6 7 9 4 3 2) 0 1 2 3 4 5 #下标号 方法一: 数组名=(value0 value1 value2 -) 方法二: 数组名=([0] ...

  7. docker基础——1.原理解读

    1. 相关内核知识 docker本质上是宿主机上的进程. 通过namespace实现资源隔离,通过cgroups实现资源限制,通过写时复制机制copy-on-write实现高效文件操作. 依赖kern ...

  8. node 解决存储xss风险报告

    1. 安装 xss模块 npm install xss 2.在 Node.js 中使用 const xss = require("xss"); // 在项目的接口里面添加 let ...

  9. Linux实现MySQL数据库凌晨自动备份

    Linux实现MySQL数据库凌晨自动备份 备份多数据库,每天凌晨两点执行,使用当前年月日作为文件夹,不存在该文件夹就创建,删除七天前备份过的文件. 定时调度使用crontab 1 login_use ...

  10. fork_join

    在systemverilog中可以用fork-- join.fork --join_any.fork--join_none来实现多个线程的并发执行. 1.父线程.子线程 调用fork--join的线程 ...