XCTF-RE-testre-Base58

CTF · 03-21 · 108 人浏览

一、查看文件类型

Pasted image 20231214001320.png
ELF64 无壳

二、IDA静态分析

1.main

Pasted image 20231214103335.png
程序逻辑比较简单,只有两个调用函数

2.sub_400D00

Pasted image 20231214002413.png
read()读取目标文件内容,fflush(stdoout)清除输出缓冲区。
sub_400D00是个读取输入的函数。

3.sub_400700(关键函数)

Pasted image 20231214103359.png
Pasted image 20231214103417.png
Pasted image 20231214103520.png
Pasted image 20231214103532.png
逆序分析程序逻辑:
(1)第112-118行将s与拼接后的字符串“D9cS9N9iHjMLTdA8YSMRMp”对比,相等则输出提示“correct!”
由此可知密文为:D9cS9N9iHjMLTdA8YSMRMp
(2)s来自v11,跟进第107行中对v11进行处理的循环中的数组
Pasted image 20231214103924.png
发现为base58编码表,下一行的数组为base64编码表
(3)继续往上读
Pasted image 20231214111222.png
计算中出现关键数字58
确认为base58加密

三、解题

密文为:D9cS9N9iHjMLTdA8YSMRMp

(1)python脚本

def b58encode(tmp: str) -> str:  
    tmp = list(map(ord, tmp))  
    temp = tmp[0]  
    base58 = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"  
    for i in range(len(tmp) - 1):  
        temp = temp * 256 + tmp[i + 1]  
    tmp = []  
    while True:  
        tmp.insert(0, temp % 58)  
        temp = temp // 58  
        if temp == 0:  
            break  
    temp = ""  
    for i in tmp:  
        temp += base58[i]  
    return temp  
  
  
def b58decode(tmp: str) -> str:  
    import binascii  
    base58 = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"  
    temp = []  
    for i in tmp:  
        temp.append(base58.index(i))  
    tmp = temp[0]  
    for i in range(len(temp) - 1):  
        tmp = tmp * 58 + temp[i + 1]  
    return binascii.unhexlify(hex(tmp)[2:].encode("utf-8")).decode("UTF-8")  
  
  
print(b58encode("ABDCDEFGA"))  
print(b58decode("D9cS9N9iHjMLTdA8YSMRMp"))

运行结果:
base58_is_boring

flag为:flag{base58_is_boring}

(2)本地工具箱

Pasted image 20231214111634.png

base 编码 CTF RE XCTF Base58 解码
Theme Jasmine by Kent Liao