知识点
换表的base64特点:
1.出现64个字节的字符串(其实应该叫做表)作为数组取值,并且(经常,不是一定)出现“/”和“+”符号
2.=作为补位,体现为对3求余(%3)
Base64 字典表顺序
Ida打开F5找到加密的,点开basekey
解题流程
无壳
一看这个就知道base64的码表肯定被改了,然后拖进ida一看
用ida64打开。
基本都是构造函数和析构函数,其里一个最显眼的是查找一下
base64Encode(&result);,base64 的码表估计就藏在里面
看了这个&unk_489084
方法一:
下面有个码表,一看就是base64 的,好了,上工具
http://web.chacuo.net/netbasex
得到flag{Special_Base64_By_Lich}
方法二:
盲猜是换表的base64,脚本处理。
贴出脚本
import base64
import string
str1 = "mTyqm7wjODkrNLcWl0eqO8K8gc1BPk1GNLgUpI==" #str1是要解密的代码
string1 = "AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz0987654321/+" #string1是改过之后的base64表
string2 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
print (base64.b64decode(str1.translate(str.maketrans(string1,string2))))
"""
str() 函数将对象转化为适于人阅读的形式。
Python maketrans() 方法用于创建字符映射的转换表,对于接受两个参数的最简单的调用方式,第一个参数是字符串,表示需要转换的字符,第二个参数也是字符串表示
转换的目标。
注:两个字符串的长度需相同,为一一对应的关系。
maketrans()方法语法:str.maketrans(intab, outtab)
返回值:返回字符串转换后生成的新字符串。
str.maketrans()方法接受一个或两个参数, 返回一个字典(字典的 key 和 value 均用unicode编码)
1.接受两个参数:str.maketrans(str1, str2)
str1, str2均为字符串, 将 str1 和 str2 的元素按次序关系构造成字典, 字典的 key 和 value 均用unicode编码.
intable = "aeiou"
outtable = "12345"
trantab = str.maketrans(intable, outtable)
返回trantab: {97: 49, 101: 50, 105: 51, 111: 52, 117: 53}
2.接受一个参数:str.maketrans(dict1)
dict1 为一个字典, 返回一个字典(字典的 key 和 value 均用unicode编码).
parentheses_table = str.maketrans({"(": None, ")": None})
parentheses_table: {40: None, 41: None}
Python translate() 方法根据 maketrans() 方法给出的字符映射转换表转换字符串里的字符。
返回根据 maketrans() 方法给出的字符映射转换表转换后的字符串。
"""
flag{Special_Base64_By_Lich}