CTF-reverse-simpleRE(base64变表逆向)

文章讲述了在HUBUCTF2022新生赛中解决一道关于复杂加密问题的解题过程,主要涉及对base64加密和换表的理解,以及如何通过编程实现密文的映射和解密,最终找到flag。
摘要由CSDN通过智能技术生成

题目链接

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

  • 9
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值