House of Pig

介绍

House of Pig 这种利用方法来自 XCTF-FINAL 2021 的同名题目。

概括

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

利用条件为

  • 存在 UAF

  • 能执行abort流程或程序显式调用 exit 或程序能通过主函数返回。

主要利用的函数为 _IO_str_overflow,可以参考 glibc 2.24下 IO_FILE 的利用

利用流程为

  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。

注意在 2.31 下的 largbin attack 和老版本有一定区别,可以参考 Large Bin Attack 这一章。

例题

XCTF-FINAL-2021 house of pig

跳表修复

拿到题目,直接 F5 的话可能会出现 __asm{ jmp rax } 这样的指令

这是 switch 的跳表结构未被 IDA 识别造成的,导致了大量代码丢失,通过 IDA 的 Edit->Other 中的 Specify switch idiom 功能可以实现修复,对于此程序应该使用的参数为

然后就可以识别出 switch 了。

流程分析

首先,经过大胆猜测可以分析出每只猪的结构体结构

和 qword_9070 指向的结构体结构

把这两个结构体补全后,程序的流程就会容易分析许多,可以发现主要的漏洞是在改变猪猪的时候,备份和更新结构体时未对 des_exist_sign[24] 数组更新

要触发这个未更新的漏洞需要更改角色,要通过一个 check_password 的操作。

也就是需要输入三个 md5 值之一的原值,注意到最后一个 md5 被 '\x00' 截断了,所以只要前两位相同即可,可以尝试使用爆破等方法通过此处的检测,下面是一种方法。

总结一下,程序主要的漏洞点是有 UAF,可以 show,可以 edit,分别有 2 和 8 次机会。最大可以申请 0x440 大小的空间,即可以使 chunk 进入 unsorted bin 和 large bin。整个程序中不存在 malloc 函数,全部是 calloc,由此函数的不从 tcache 中取出 chunk 的性质,且不可以申请 fastbin 范围中的 chunk,导致利用比较困难。

通过 House of Pig 实现利用

参考

house of pig一个新的堆利用详解

Last updated