首页
社区
课程
招聘
[原创]【2019看雪CTF】Q3赛季 第十一题:绝地反击 WP
发表于: 2019-9-25 00:53 4616

[原创]【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直播授课

收藏
免费 1
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//