[羊城杯 2020]easyre
下载附件,查壳,无壳ida打开。F5反编译查看源码。
分析源码,输入一个 38 个字符的字符串(flag),然后通过一系列的编码函数来验证这个输入的字符串是否正确。如果输入的字符串通过了所有的编码和比较步骤,程序会输出 "you are right!",否则会输出 "Something wrong. Keep going."。其中还有三次加密。
跟进第一次加密encode_one:
这段代码执行的是对输入数据进行 Base64 编码的操作。
这里是一个ascii码转换,跟进alphabet。
发现一个base64码表,到此第一个加密分析完毕。
第二个加密encode_two:
这段代码执行的是字符串的重新排列操作。函数的目的是从输入参数 a1
中提取特定位置的子字符串,并将它们按照一定的顺序复制到另一个位置 a3
。即:
-
将输入字符串
a1
的第 26 个字符开始的 13 个字符复制到输出字符串a3
的开头。 -
将
a1
的开头 13 个字符复制到a3
的第 13 个字符位置开始处。 -
将
a1
的第 39 个字符开始的 13 个字符复制到a3
的第 26 个字符位置开始处。 -
将
a1
的第 13 个字符开始的 13 个字符复制到a3
的第 39 个字符位置开始处。
第三个加密encode_three:
有个+3,应该是右移3,猜测是凯撒密码。
凯撒密码解密:
但是这并不是正确的结果,正确的结果还要对阿拉伯数字-3,因为凯撒加密是对字符进行不断位移替换的,阿拉伯数字的数值并没有变化,而且在凯撒加密的算法中出现了+3,所以要-3才能得出原来的密文
BjYjM2Mjk4NzMR1dIVHs2NzJjY0MTEzM2VhMn0=zQ3NzhhMzhlOD
在进行第二次解密:
这串代码的含义就是替换顺序即:
-
将输入字符串
a1
的第 26 个字符开始的 13 个字符复制到输出字符串a3
的开头。 -
将
a1
的开头 13 个字符复制到a3
的第 13 个字符位置开始处。 -
将
a1
的第 39 个字符开始的 13 个字符复制到a3
的第 26 个字符位置开始处。 -
将
a1
的第 13 个字符开始的 13 个字符复制到a3
的第 39 个字符位置开始处。
所以直接手动进行更改即可:
BjYjM2Mjk4NzM 3
R1dIVHs2NzJjY 1
0MTEzM2VhMn0= 4
zQ3NzhhMzhlOD 2
R1dIVHs2NzJjYzQ3NzhhMzhlODBjYjM2Mjk4NzM0MTEzM2VhMn0=
最后一次解密:就是一个base64解密
R1dIVHs2NzJjYzQ3NzhhMzhlODBjYjM2Mjk4NzM0MTEzM2VhMn0=
flag:
GWHT{672cc4778a38e80cb362987341133ea2}