[弱口令安全实验室2022招新赛]EasyBase
考点一览
Base64、rot18、逆序函数
Base家族:
Base64:大写字母(A-Z),小写字母(a-z),数字(0-9)以及+/;
Base32:只有大写字母(A-Z)和数字234567;
Base16:是16进制,范围是数字(0-9),字母(ABCDEF);
Rot家族:
ROT5:只对数字进行编码,用当前数字往前数的第5个数字替换当前数字。
ROT13:只对字母进行编码,用当前字母往前数的第13个字母替换当前字母。
ROT18:将ROT5和ROT13组合在一起。
逆序函数
strrev()—头文件为“string.h”
认真解题
拿到这个easybase,就知道那肯定有base哇!base多少呢?我也不知道。然后就是固定操作查壳:无壳 64bit
习惯性F5。哦莫!看到了“the 18 palm attacks to defeat dragons!”这是“降龙十八掌”(疯狂暗示,可惜我没懂)。
后面就是一堆汇编语言,看不懂怎么办?(看不懂就点击左上的叉叉[狗头])还能咋办,先看看字符串吧[shift+F12]
看见了这个东东:“=DzMuO8MmgaomuGA9Rmpj5lAkAwZgxQplNGYhOwAi6lAmywZlqGZ7LQB7pGs”
(有点眼熟,不确定,再看一眼,这个‘=’!好像反过来的base呀,结合标题,那就是base啦)
我们再往下看:
“ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/”(我们知道这是base64呀)
当我们对“=DzMu[Tab补全]”交叉引用[control+X]再反汇编[F5],可以看见一堆汇编语言。
显然,我看不懂汇编语言,但我发现了一个特别的函数:
度娘一下:这是头文件“string.h”下的库函数‘strrev’,作用是将字符串逆序。它在154行和204行分别出现了一次,这意味逆序很有可能要进行两次。
首先,“=DzMu[Tab补全]”肯定是要逆一次滴,逆序代码如下:
`int main ()
{
char a[10000];
gets(a);
strrev(a);
puts(a);
return 0;
}`
可以得到:“sGp7BQL7ZGqlZwymAl6iAwOhYGNlpQxgZwAkAl5jpmR9AGumoagmM8OuMzD=”
把它丢到‘随波逐流’进行解码:
普通的人可以发现解码结果和原来一样,聪明的人可以通过上面暗示的‘降龙十八掌’联想到是不是rot18的解码结果[可惜我不是聪明的人呜呜呜呜]。不过山人自有妙计!
首先,看到它说的解码结果和原密码一模一样,我emo了,只能回去重新看代码了(学长提示:ida中很多干扰代码,不是所有代码都有用的!)
根据我的不多的经验之谈,‘Str1’一般都是有东西滴,看见了一个这个东东:
然后这个‘sub_140001300’可以点开,就点开看看:
omg!很乱不能理解!但是V13是被V5复制来的,所以进去找V13,对应到这个三个地方:
由这三个V13可以知道分别是对0-9、A-Z、a-z有对应的转换,因此此处为rot18!
知道是rot18之后,再把我们前面逆序过的“sGp7[Tab补全]”再带入‘随波逐流’,看到它的rot18解码:
“fTc2ODY2MTdyMjlzNy1vNjBuLTAycDktMjNxNy0wczE4NThzbntzZ3BhZmQ=”
对“fTc2[Tab补全]”再来解密一次:
得到解密结果:
“}7686617r29s7-o60n-02p9-23q7-0s1858sn{sgpafd”
这一看就知道它又倒过来了,而且前面提到了要逆序第二次。
结果为:
“dfapgs{ns8581s0-7q32-9p20-n06o-7s92r7166867}”
发现这个东东,它的开头不是我们需要的‘qsnctf’,所以我们再次rot18解密,得到:
qsnctf{af3036f5-2d87-4c75-a51b-2f47e2611312}
这就是最后答案。
综上所述:我们先进行逆序,再rot18,再rot18,再base64,再逆序,再rot18.
问答环节
Q1:做题需要看懂全部代码吗?
A1:不需要哇!找到关键函数就行啦~
预告一下
二叉树真的要来啦~