-
-
[原创]看雪CTF 2019Q3 第十题 绝地反击 WP
-
发表于: 2019-9-26 01:38 6390
-
驱动新手,第一次做驱动题,拿到题目的时候一脸懵,完全不知道要干什么,只知道题目是个虚拟机,但是参数啥意思完全不知道。
好在我虽然不会翻墙google,但还是和度娘很熟的,在wiki ctf里学习了一下搭建环境的方法,又从github上面找到一个别的题目的wp作为模板,开始了我的驱动征程。
我学到的第一件事情就是mod.ko是个驱动文件,而且是elf文件,可以使用ida打开。然后就是比较熟悉的pwn界面了,里面没有调用几个函数,而且大部分都是驱动常用的,直接baidu就有详细的功能说明。虽然我的分析调试环境还没有搭建起来,但是我拼着敏锐的直觉一下就看出了最后一个kfree有问题,它free之后居然没有清空指针,涉嫌uaf。
我这里一直犯了一个错误,我以为alloc出来的空间就是参数里面的常量3520,这是普通pwn题带来的经验主义的错误,导致我在利用上面一直缺乏构思,直到我调试环境搭建好了能够查看内存才发现,kmem_cache_alloc函数申请的内存空间是由第一个参数决定的,它对应的大小是0x400。通用的tty设备的思路才被我重视起来。
因为开启smep会限制内核执行用户态的代码指令,所以我利用网上的方法尝试着构造了一个rop,使用xchg来交换eax和栈的地址来执行代码。但是很奇怪的是每次交换完,程序就报错重启了。而且显示的错误代码在网上也一直搜不到原因,浪费了N个小时之后,我才发现或者是因为虚拟机的参数设置导致的。于是我挨个查找每个参数的含义,终于发现smap这个罪魁祸首。开启smap之后居然连用户态的数据也不让访问了。
好在肯定还有办法的,在搜索smap的同时,还发现了ret2dir可以完美绕过smap和smep,于是我添加了喷射shellcode的功能,并且成功的让rip跳到了这些shellcode上,结果 虚拟机又又又重启了……
最后实在没办法,大半夜困得不行,我就把目标又看向了那个作为模板的wp,里面有一段被我注释的内容,里面有这么一个操作
fake_tty_operations->ioctl = set_memory_x;
set_memory_x??这是什么函数?设置..内存..可执行??
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)
赞赏
- [原创]第十二题 深入内核 4064
- [原创]第十一题 步步逼近 4525
- [原创]第八题 AI核心地带 3454
- [原创] 第七题 智能联盟计划 3623
- 第六题 至暗时刻 10387