需求:

之前在复现 IOT 漏洞,为了捋清调用链进行 GDB 调试,但由于固件的代码量较大,而且函数之间的调用和跳转很多。导致了 GDB 这边每次函数跳转后都需要在 IDA 手动同步一下。久而久之,我发现这是一个重复且无意义且浪费时间的工作,我在想能否开发一个 IDA 插件用来自动同步 GDB 调试时的 PC 寄存器

阅读全文 »

今年国赛的华中分区赛一共放了两道 PWN ,一个一解,一个零解。零解的是 LLVM PASS PWN ,这个没有研究过,暂且先复现另一个题目(考察的是 house of muney)还有一个 AWD 环节的 PWN (考察的格式化字符串漏洞)

阅读全文 »

Double Fetch 从漏洞原理上属于条件竞争漏洞,是一种内核态与用户态之间的数据访问竞争。

在 Linux 等现代操作系统中,虚拟内存地址通常被划分为内核空间和用户空间。内核空间负责运行内核代码、驱动模块代码等,权限较高。而用户空间运行用户代码,并通过系统调用进入内核完成相关功能。通常情况下,用户空间向内核传递数据时,内核先通过通过 copy_from_user 等拷贝函数将用户数据拷贝至内核空间进行校验及相关处理,但在输入数据较为复杂时,内核可能只引用其指针,而将数据暂时保存在用户空间进行后续处理。此时,该数据存在被其他恶意线程篡改风险,造成内核验证通过数据与实际使用数据不一致,导致内核代码执行异常

一个典型的 Double Fetch 漏洞原理如下图所示,一个用户态线程准备数据并通过系统调用进入内核,该数据在内核中有两次被取用,内核第一次取用数据进行安全检查(如缓冲区大小、指针可用性等),当检查通过后内核第二次取用数据进行实际处理。而在两次取用数据之间,另一个用户态线程可创造条件竞争,对已通过检查的用户态数据进行篡改,在真实使用时造成访问越界或缓冲区溢出,最终导致内核崩溃或权限提升。

image-20230404161502570
阅读全文 »

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

阅读全文 »

前一段 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 地址和堆地址
阅读全文 »