Reverse-base64
题目来源:2023MOECTF
题目概述
题目给了一个pyc文件,我们尝试在线反编译后获得源文件:
#!/usr/bin/env python
# Version: Python 3.7
import base64
from string import *
str1 = 'yD9oB3Inv3YAB19YynIuJnUaAGB0um0='
string1 = 'ZYXWVUTSRQPONMLKJIHGFEDCBAzyxwvutsrqponmlkjihgfedcba0123456789+/'
string2 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
flag = input('welcome to moectf\ninput your flag and I wiil check it:')
enc_flag = base64.b64encode(flag.encode()).decode()
enc_flag = enc_flag.translate(str.maketrans(string2, string1))
if enc_flag == str1:
print('good job!!!!')
else:
print('something wrong???')
exit(0)
分析加密
审计程序逻辑发现,程序的具体逻辑是,我们输入一个字符串,然后程序对这个字符串进行base64编码,然后通过某个映射加密这组字符串,然后将这组字符串和str1对比,如果相同即为flag,所以str1这个变量即是加密后的flag,我们需要对str1进行逆向。
我们要反向映射str1这个字符串,查找发现,maketrans函数的作用是创建一个将string1用string2替换的映射表,而maketrans就是使用这个映射表处理字符串。那么转念一想,我们反向映射,只要将函数中string1和string2的位置交换,创建一个将string2用string1来替换的映射表,再用这个新的映射表来处理str1,不就反映射成功了吗?
编写POC
说干就干,修改了以下题目的py脚本,反向映射str1,脚本如下:
import base64
from string import *
str1 = 'yD9oB3Inv3YAB19YynIuJnUaAGB0um0='
string1 = 'ZYXWVUTSRQPONMLKJIHGFEDCBAzyxwvutsrqponmlkjihgfedcba0123456789+/'
string2 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
f=str1.translate(str.maketrans(string1,string2))
print(f)
运行得到反映射结果:
再使用base64解码,得到flag:
踩坑总结
1.要熟悉程序的函数,使用逆向思维分析