终于来到了关于内核的学习,目前打算浅尝一下内核的基础知识和漏洞。之后每个学习的新漏洞都单独写一篇文章,每篇学到的新的前置知识都放到对应的文章中吧,暂时先不做汇总。

阅读全文 »

前一段 VNCTF 2023 正好有一道非常入门 qemu 逃逸的题目,正好以此为契机进行 qemu 逃逸的入门学习,在这部分的学习中,要感谢 winmtroderick 师傅解答我的一些困惑。

前置知识

QEMU与逃逸

QEMU 是纯软件实现的虚拟化模拟器,可以模拟多种不同的计算机系统和硬件设备。虽然 QEMU 可以模拟出硬件或虚拟环境,但它本质上只是一个程序,所谓 qemu 逃逸是指攻击者利用 QEMU 实现的有漏洞的 PCI 设备来获取主机的权限。从虚拟机中 “逃出来”,其利用方式和平常用户程序执行 system 函数是一样的,只不过平常 PWN 题的触发方式是通过用户的输入进行触发,而 QEMU 虚拟机的设备漏洞通过运行在虚拟机上的用户程序对设备的 IO 交互来间接触发。

阅读全文 »

house of husk

介绍:

house of husk 是对 printf 函数内部进行注册的自定义格式化字符的函数指针进行了劫持

使用版本:

经过测试,glibc 2.23--2.35 版本中,该手法均可用

漏洞原理:

printf 函数通过检查 __printf_function_table 是否为空,来判断是否有自定义的格式化字符,如果判定为有的话,则会去执行 __printf_arginfo_table[spec] 处的函数指针,在这期间并没有进行任何地址的合法性检查

阅读全文 »

之前对于 unlink 的理解停留在表面,一直以为得有个堆溢出才能利用。今天做了一道 0ctf2015_freenote ,发现利用 UAF ,依然可以打 unlink … 本来记录一下用 UAFunlink 的思路,关于堆溢出打 unlink 以及该手法的更多细节请见 本文

阅读全文 »

house of banana

攻击效果:

控制程序的执行流

适用版本:glibc2.23 到目前最新的 2.36

注意: 使用 setcontext 来控制寄存器打 orw 的话,需要在 2.29 版本以上才行( 2.27 没有办法让 rdxrdi 为堆地址)

利用条件:

  1. 可以任意地址写一个堆地址(通常使用 large bin attack
  2. 能够从 main 函数返回或者调用 exit 函数
  3. 可以泄露 libc 地址和堆地址
阅读全文 »

前几天进行了 house of apple 的学习,而 house of appl2house of cat 利用的大致思想是一样的(都是通过 wide_data->wide_vtable 中的函数指针进行的跳转),因此来复现一下去年强网杯的这道 house of cat

本题我感觉也比较有代表性,因为在 house of apple 的那篇文章中的例题最后触发攻击是在 exit 函数,但是如果题目中无法从 main 函数返回也没有 exit 函数,那就需要通过 malloc_assert 来触发最后的攻击,而本题就是通过这样的方式触发的攻击。

阅读全文 »

前言:

house of appleroderick 师傅提出的一种非常优秀的 IO 攻击利用方法,应该在刚刚学习关于堆的漏洞时便看到 roderick 师傅提出的这种利用方法,当时看着文章上出现的很多不认识的名词感慨自己所了解的太少,时隔近七个月现在终于学习到了 house of apple 。而这篇文章仅仅是记录自己关于 house of apple 的学习总结,如果真正要进行对 house of apple 的学习还是建议去看 roderick 师傅发表的三篇文章。

阅读全文 »

前言

自从引入了 tcache 机制后,从 2.26 开始 tcache poisoning 就是一种简便的攻击方式,因为它不需要像 fastbin attack 利用那样对 size 检查较为严格(只能申请到 malloc_IO_2_1_stdout_ 上方的区域),篡改了 tcache bin 中堆块的 next 指针就相当于可以任意地址申请了

safe-Linking

2.32 之前 tcache poisoning 可以说是无往不利,但到了 glibc 2.32 及以后,增加了 safe-Linking 机制,至此篡改 next 指针直接任意地址申请的操作便绝迹在了高版本的 libc

阅读全文 »

作为一个 pwner ,对 one_gadget 肯定不会陌生,如果在能劫持执行流的前提下, one_gadget 在劫持执行流的位置也恰巧能用,那就可以在一定程度上简化获取 shell 的操作,因为执行 system("/bin/sh\x00") 是需要控制参数的,有些情况下劫持执行流容易但可能控制参数还得再废些力气,此时成功打一发 one_gadget 可以说是方便又迅速。

但因为 one_gadget 条件的限制, one_gadget 成功的概率并不高,通常是一个一个试,或者调试到劫持执行流的位置观察一下寄存器和内存的情况进行判断。很早之前我就有这样一个想法,如果能用 gdb 调试到劫持的地址处,输入一个命令直接判断所有的 one_gadget 能否生效该有多方便。终于在几天前进行了动手实践,并将其写出来。

阅读全文 »

目前就做了两道vm pwn的题目先简单总结一下,这类题目逆向量较大,如果有分析不懂的函数或者某段指令可以尝试配合gdb动态调试观察某些寄存器或内存值的变化来猜测其功能。漏洞点大多为数组越界可以写或者任意读来劫持hook或者got表等等。不一定每个指令都要具体分析明白,个人认为去关注漏洞指令,其他指令用到哪个去简单分析哪个

阅读全文 »