2018巅峰极客网络安全技能挑战赛 RE(1) Simple Base-N
很干净,无壳无花,x86 C++
拖进IDA
IDA分析
首先要求输入长度大于等于10
1. Fake Flag
v3 = "guvf_vf_n_snxr_synt";
是用来骗人的,其操作是在sub_401100进行操作然后比较,因此只要利用逆向思维,将v3看作已知,对sub_401100进行逆操作即可
sub_401100内部为
signed int __thiscall sub_401100(const char *this) |
可以看出是对ASCII操作
84 -> ‘T’
97 -> ‘a’
52 -> ‘4’
65 -> ‘A’
脚本
当然了,这是假flag,仅供娱乐
True Flag
接着往下看
LABEL_9才是真正的加解密函数
编码表 sub_4012C0()
接下来读取长度,+32是大写转换为小写操作,++i** 及 i&1组合表示奇数位不变,偶数位转换
dword_40507C
内容需要括住按C键重新分析,将数据识别为Char类型,结果如下
‘2765’及‘43’也是转换成char类型得到的,值得注意的是,未转换之前为十六进制编码,且应倒序读取,dword_40507C
加上4位数字(即5672)就来到了word_405080
,也就是数字顺序为567234
或着在修复dword_40507C
后,重新F5,即如下图,更加易于理解
于是将ABCDEFGHIJKLMNOPQRSTUVWXYZ带入脚本得出
再替换大小写,后面加567234即得出编码顺序
NoPqRsTuVwXyZaBcDeFgHiJkLm567234
BASE32 sub_401310()
下面case里的数据识别为char为”=”,结合题目叫Simple Base-N可以猜到应该是Base16/32/64类型的加密,并且编码表的内容我们也刚刚已经得出,为了继续印证猜想,往上看看,发现如下操作
之前写过一篇wp(2017第二届广东省强网杯线上赛Nonstandard),代码一模一样,看来就是Base32了。
解密脚本
于是直接用上次的脚本就好,带入密码weNTDk5LZsNRHk6cVogqTZmFy2NRP7X4ZHLTBZwg
s = "weNTDk5LZsNRHk6cVogqTZmFy2NRP7X4ZHLTBZwg" |
Flag
得出之后提交并不正确,通过凯撒移位,发现Rot13的结果是flag
flag:Y@u_Kn@W_b@s332_@Nd_r0t13
Get it!