sudrv
赛后很久之后复现的一题kernel pwn
漏洞点
- 堆溢出
- 格式化字符串
堆溢出
1 | signed __int64 sudrv_write() |
这里并没有对size进行任何的检查
格式化字符串
1 | __int64 __fastcall sudrv_ioctl(__int64 a1, int a2, __int64 a3) |
当a2为0xdeadbeef
的时候,对应的汇编代码:
1 | .text:0000000000000078 mov rdi, cs:su_buf |
sudrv_ioctl_cold_2
处:
1 | .text.unlikely:00000000000000B8 sudrv_ioctl_cold_2 proc near ; CODE XREF: sudrv_ioctl+62↑j |
直接调用了printk
,造成了格式化字符串漏洞
思路
- 格式化字符串泄露kernel基地址和栈地址
- 利用堆溢出把下一块的chunk的指针指向栈地址(这里我踩的一个坑是,我覆盖的地址没有和chunk地址对齐,比如我覆盖的是0x1000的chunk,那覆盖的地址后3位也应该为000),多次分配到栈上ROP
exp:
1 |
|
后记
解出了这题其实还是很开心的,中间踩了许多的坑,总之收获挺大的,kernel这一块还是慢慢学吧
参考链接:
https://blog.de1ta.club/2019/08/19/SUCTF2019/
https://github.com/team-su/SUCTF-2019/blob/master/Pwn/sudrv/exp/pwn.c