-
-
[原创]Q2 第六题消失的岛屿解题思路
-
2019-6-16 17:16 2230
-
找到定义,为定义字符串,找到引用,发现为输出字符串。则此处为核心区域。
阅读后,得知为Base64字符转码,给出转码后的字符串,输入字符串进行转码,转码匹配则破解成功。而要匹配的字符串为:
即!NGV%,$h1f4S3%2P(hkQ94==
那么我们需要观察当前转码函数:IDA中汇编代码较长,这里列举出其C语言代码:
大意如下,字符数组下表为0的字符开始,3个字符为一组,第一个字符x的Ascii码值右移两位,与0x3F进行按位与,得到的值传入CharEncrypt函数进行进一步计算,得到转换码。存入申请的内存base64[i+0]。至于CharEncryp函数,我们将在下面进行介绍。
计算current,其值等于x左移4位 和0x30按位与的结果。取第二个输入字符y,右移4位,和current进行按位或得到的值,传入CharEncrypt函数进行进一步计算,得到转换码。存入申请的内存[i+1]。
计算currenta, 其值等于y左移2位和0x3C按位与的结果。取第三个输入字符z, 右移6位,和currenta进行按位或得到的值,传入CharEncrypt函数进行进一步计算,得到转换码。存入申请的内存[i+2]。
将z和0x3F进行按位与 得到的值,传入CharEncrypt函数进行进一步计算,得到转换码。存入申请的内存[i+3]。
也就是说输入三个字符得到转换结果位4个字符。
CharEncrypt函数翻译代码如下:
上面传入的参数其实为一个字符数组下标。即这个字符串:
逻辑如下:
每次通过参数,从这个字符数组中取一个字符,判断其类型,当取出字符为整数值dataa,判断其类型:
(1)大写字母 返回值=150-dataa
(2)数字0-9 返回值=dataa+50
(3)小写字母 返回值=dataa-64
(4)'+' 返回值为119 即‘w’
(5)'/' 返回值为121 即‘y’
(6)其他值 为返回值为原值
当输入字符为最后一个字符时,加上‘’4‘=’‘=’
进一步对照Ascii码表计算发现,其规律如下图:
最终,我们通过推演计算,及代码测试(见附件),得出以下结果:
至此,破解成功。
耗时三天,功力还需提升呀!QAQ
[CTF入门培训]顶尖高校博士及硕士团队亲授《30小时教你玩转CTF》,视频+靶场+题目!助力进入CTF世界