-
-
[原创]【2019看雪CTF】Q3赛季 第十一题:绝地反击 WP
-
发表于: 2019-9-25 00:53 4616
-
⾸先看虚拟机启动脚本:
可以看到开启了地址随机化,smap,smep保护
同时rcS可以看到载⼊了mod.ko驱动
在驱动中可以看到存在uaf漏洞:
注意触发漏洞的条件:⾸先在前⾯需要set第三个参数对应的staff结构体的2,3位为⼀个标记为deadbeef的staff,⽽后第⼆个参数与第⼀个参数不同且都标志位为0xdeadbeef,且第⼆个staff为第三个中对应设置的staff。
存在uaf漏洞且存在随机化,⾸先要leak堆地址和内核加载基址。堆地址可以直接在free后通过fd指针获得。注意到驱动申请堆块⼤⼩为0x400,这时候即可想到打开⼀个tty设备,让其对应结构体分配到free的chunk上,即可leak出内核加载基址。
可以leak出堆地址和内核加载基址后,⾸先想到的是start ctf中的,再次利⽤UAF分配到modprobe_path位置,覆盖掉后再运⾏⼀个错误格式的elf,触发运⾏预设脚本来提权,但是成功覆盖后总是触发失败,不知道原因。
第⼆种⽅法,就是⽐较普通的,通过uaf来修改tty_struct,来修改tty_operations指向⾃⼰伪
造的结构体来控制程序流。
但是伪造⽅法卡了很久,因为存在smap保护,不能直接像之前遇到的xchg解决。
这时候只能尝试tty_operations中的所有操作,看哪⼀个能结合现有rop链来控制栈,最后选择write操作。
write时,可以看到分布为:
同时找到⼀条可以pop rsp的rop链:
由此便可以在write的过程中控制栈指向所要write的⽤户数据(write前已被copy⼊内核空间)。此时即可常规伪造rop链来执⾏commit_creds(prepare_kernel_cred(0)),再返回⽤户态完成提权。
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课