题目链接
NSSCTF | 在线CTF平台
题目详情
[HUBUCTF 2022 新生赛]simple_RE
解题报告
下载得到的文件使用ida64分析,如果报错就换ida32,得到分析结果,有main函数就先看main
main函数分析
main函数的逻辑看下来十分简单,因此关键就要看这个加密函数了
这里字符串a5mc58bphliax7j显然就是密文,双进查看内容是
【5Mc58bPHLiAx7J8ocJIlaVUxaJvMcoYMaoPMaOfg15c475tscHfM/8==】
sub_401570函数分析
看下来似乎是很复杂的加密,但有经验的话从特征不难识别出来是base64加密,比如红框里的三个经典等号(ASCII码是61)和循环里的位移操作
当然最容易一锤定音是base64的还是aQvejafhmuyjbac这个数组,双击跟进看内容,这字符一看就base64了,而且是魔改换表版本
base64与base64换表
标准的base64加解密所用表是【ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/】刚好64个字符
如果对标准表中的字符进行顺序替换,称之为base64换表
- 对于标准表的base64,可以直接用编程语言提供的解密函数直接解密或者使用在线网站解密等
- 对于换表base64,需要多做一步映射,将换表的字符映射回标准表,然后再进行解密
怎么映射呢?拿本题来举例,换表是【qvEJAfHmUYjBac+u8Ph5n9Od17FrICL/X0gVtM4Qk6T2z3wNSsyoebilxWKGZpRD】
密文是【5Mc58bPHLiAx7J8ocJIlaVUxaJvMcoYMaoPMaOfg15c475tscHfM/8==】
密文中第一个字符是5,在换表中的索引(下标)为19,而在标准表中,索引19处的字符为【'T'】
密文中第二个字符是M,在换表中的索引(下标)为37,而在标准表中,索引19处的字符为【'l'】
以此类推,完成映射
映射可以通过自写循环来实现,也可以直接使用字符串函数translate,下面给出了两种方法的脚本来解决本题
EXP
自写循环映射
import base64 #导入base64模块用于解密 s1 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/' #标准表 s2 = 'qvEJAfHmUYjBac+u8Ph5n9Od17FrICL/X0gVtM4Qk6T2z3wNSsyoebilxWKGZpRD' #base64换表 en_text = '5Mc58bPHLiAx7J8ocJIlaVUxaJvMcoYMaoPMaOfg15c475tscHfM/8==' #密文 map_text = '' #用于存放密文通过换表映射回标准表的字符 for i in en_text: if(i != '='): #注意密文中存在等号的情况下,不需要替换! idx = s2.index(i) #获取每个密文的字符在换表中的索引 map_text += s1[idx] #取出标准表中的该索引的字符,就是正常base64加密的密文 else: map_text += i print(map_text) #可以先看看标准表base64加密的密文 print(base64.b64decode(map_text)) #直接使用提供的base64解密函数,获得明文,就是flag
库函数映射
import base64 #导入base64模块用于解密 s1 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/' #标准表 s2 = 'qvEJAfHmUYjBac+u8Ph5n9Od17FrICL/X0gVtM4Qk6T2z3wNSsyoebilxWKGZpRD' #base64换表 en_text = '5Mc58bPHLiAx7J8ocJIlaVUxaJvMcoYMaoPMaOfg15c475tscHfM/8==' #密文 map = str.maketrans(s2, s1) #用str类中的maketrans建立映射,注意第一个参数是需要映射的字符串,第二个参数是映射的目标 map_text = en_text.translate(map) #映射实现替换密文,替换前是base64换表加密,替换后则是base64标准表加密 print(map_text) #可以先看看标准表加密的密文 print(base64.b64decode(map_text)) #直接使用提供的base64解密函数,获得明文,就是flag