MENU

Catalog

    ctfshow EzAutoRE Writeup

    August 19, 2021 • Read: 632 • Reverse,CTF

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

    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()
    Archives QR Code
    QR Code for this page
    Tipping QR Code