Ctfshow EzAutoRE Writeup

注意
本文最后更新于 2024-02-12,文中内容可能已过时。

这道题目还是蛮有意思的,nc 连接之后会给一个 base64 数据,解码之后发现是一个 ELF 文件,并且加了 UPX 壳,题目的内容是一个非齐次线性方程组,并且要求在 3 秒内给出解。我们解题脚本需要先脱壳,然后对二进制文件进行解析,解析后解方程组得到数据。本来想用 unicorn 来解决的,但是实际上并没有必要,因为这里的汇编代码都是成对且有规律的出现的(原始代码应该是直接生成的汇编,而不是通过了 C 语言来编译)。

 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
42
43
44
45
from pwn import *
import base64
import numpy as np
from scipy import linalg


sh = remote('pwn.challenge.ctf.show', 28128)
sh.recvuntil('-------------------------------------------------\n')
base64_data = sh.recvuntil('-------------------------------------------------', drop=True)
data = base64.b64decode(base64_data)
with open("C:\\data", "wb") as f:
    f.write(data)
os.system("F:\Tools\upx-3.96-win64\upx.exe -d C:\\data")

X = []
C = []
t = {}
with open("C:\\data", "rb") as f:
    CODE_DATA = f.read()

i = 0x1218
while i < len(CODE_DATA):
    idx = 0
    if CODE_DATA[i:i + 3] == '\x0F\xB6\x85':
        idx = ord(CODE_DATA[i + 3:i + 4])
        i += 10
    if CODE_DATA[i:i + 2] == '\x69\xD0':
        t[idx] = u32(CODE_DATA[i + 2:i + 6])
        i += 6
    if CODE_DATA[i:i + 2] == '\x69\xC0':
        t[idx] = u32(CODE_DATA[i + 2:i + 6])
        i += 8
    if CODE_DATA[i] == '\x3D':
        C.append(u32(CODE_DATA[i + 1:i + 5]))
        X.append(t.values())
        t.clear()
        i += 11
    if CODE_DATA[i:i + 5] == '\x48\x8D\x3D\x85\x09':
        break
X = np.array(X)
C = np.array(C)
ANS = linalg.solve(X, C)
flag = ''.join(chr(int(round(i))) for i in ANS)
sh.sendline(flag)
sh.interactive()
0%