关于 kernel-UAF 的学习总结
终于来到了关于内核的学习,目前打算浅尝一下内核的基础知识和漏洞。之后每个学习的新漏洞都单独写一篇文章,每篇学到的新的前置知识都放到对应的文章中吧,暂时先不做汇总。
终于来到了关于内核的学习,目前打算浅尝一下内核的基础知识和漏洞。之后每个学习的新漏洞都单独写一篇文章,每篇学到的新的前置知识都放到对应的文章中吧,暂时先不做汇总。
前一段 VNCTF 2023
正好有一道非常入门 qemu
逃逸的题目,正好以此为契机进行 qemu
逃逸的入门学习,在这部分的学习中,要感谢 winmt 和 roderick 师傅解答我的一些困惑。
QEMU
是纯软件实现的虚拟化模拟器,可以模拟多种不同的计算机系统和硬件设备。虽然 QEMU
可以模拟出硬件或虚拟环境,但它本质上只是一个程序,所谓 qemu
逃逸是指攻击者利用 QEMU
实现的有漏洞的 PCI
设备来获取主机的权限。从虚拟机中 “逃出来”,其利用方式和平常用户程序执行 system
函数是一样的,只不过平常 PWN
题的触发方式是通过用户的输入进行触发,而 QEMU
虚拟机的设备漏洞通过运行在虚拟机上的用户程序对设备的 IO
交互来间接触发。
前几天进行了 house of apple
的学习,而 house of appl2
和 house of cat
利用的大致思想是一样的(都是通过 wide_data->wide_vtable
中的函数指针进行的跳转),因此来复现一下去年强网杯的这道 house of cat
本题我感觉也比较有代表性,因为在 house of apple
的那篇文章中的例题最后触发攻击是在 exit
函数,但是如果题目中无法从 main
函数返回也没有 exit
函数,那就需要通过 malloc_assert
来触发最后的攻击,而本题就是通过这样的方式触发的攻击。
自从引入了 tcache
机制后,从 2.26
开始 tcache poisoning
就是一种简便的攻击方式,因为它不需要像 fastbin attack
利用那样对 size
检查较为严格(只能申请到 malloc
和 _IO_2_1_stdout_
上方的区域),篡改了 tcache bin
中堆块的 next
指针就相当于可以任意地址申请了
在 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表等等。不一定每个指令都要具体分析明白,个人认为去关注漏洞指令,其他指令用到哪个去简单分析哪个