这道题考察的是对base64的理解与伪代码分析,理解了还是比较简单的(如果想要搞懂base64的加解密原理可以去看看小新的第一篇文章[WUSTCTF2020]level3_[wustctf 2020]level3-CSDN博客)
第一步还是查壳:
无壳,用64位的ida打开,F5查看主函数(这些操作都是基本的前期分析方式,还有一个查看字符串找关键点)
分析之后发现关键点在test函数
上面的意思简单来说就是让输入flag后v3获取它的长度,然后flag与它的长度当作base64_encode函数的参数,猜测这里就是利用这个函数把flag给加密了然后与所给的字符串进行对比看是否正确,打开base64_encode函数看看是怎么加密的。
这里会发现就是base64的加密过程但多加了一个exception_handler函数看看这个函数有什么用
发现这个函数把码表给换了根据这个函数所在的位置得出每加密一次(每加密3个字符)换一次码表,因为加密后的字符串是36位所以flag是27位用了9张表,可以通过动调下断点来获取表
以下操作
先输入随便27个字符
再F4进行下一次
后面同理操作得到9个码表(码表是怎么生成的,为什么每次都不一样,这里师傅们可以思考一下)
解密脚本:
import base64
code = ["+86420ywusqomkigecaYWUSQOMKIGECABDFHJLNPRTVXZbdfhjlnprtvxz13579/",
"YsVO0tvT2o4puZ38j1dwf7MArGPNeQLDRHUK+SChbFanmklWEcgixXJIq6y5B/9z",
"xDfpNE4LYH5Tk+MRtrlv1oFbQm0gP37eqIajh2syUnZcSV8iBK6O/XWuzdCwA9GJ",
"YvHeOZECmTyg0Mw2i7PIGKblsfF59rzUk6p3hVdW1qaQ+xRANnXLj48BcJDotS/u",
"xDfpNE4LYH5Tk+MRtrlv1oFbQm0gP37eqIajh2syUnZcSV8iBK6O/XWuzdCwA9GJ",
"YvHeOZECmTyg0Mw2i7PIGKblsfF59rzUk6p3hVdW1qaQ+xRANnXLj48BcJDotS/u",
"xDfpNE4LYH5Tk+MRtrlv1oFbQm0gP37eqIajh2syUnZcSV8iBK6O/XWuzdCwA9GJ",
"YvHeOZECmTyg0Mw2i7PIGKblsfF59rzUk6p3hVdW1qaQ+xRANnXLj48BcJDotS/u",
"xDfpNE4LYH5Tk+MRtrlv1oFbQm0gP37eqIajh2syUnZcSV8iBK6O/XWuzdCwA9GJ"]
key = 'YkLYv1Xj23X7N0E5eoFgUveKeos1XS8K9r4g'
flag = ''
for i in range(0,len(code)):
str1 = key[i*4:i*4+4][::-1]
string1 = code[i]
string2 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
flag += base64.b64decode(str1.translate(str.maketrans(string1,string2))).decode()
print(flag)