首页
社区
课程
招聘
[原创]Q2 第六题消失的岛屿解题思路
2019-6-16 17:16 2230

[原创]Q2 第六题消失的岛屿解题思路

2019-6-16 17:16
2230

        和1题开始方式相同,首先查看字符串,发现提示字符Success。


        找到定义,为定义字符串,找到引用,发现为输出字符串。则此处为核心区域。



        阅读后,得知为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世界

最后于 2019-8-3 11:47 被Saturn35编辑 ,原因:
上传的附件:
收藏
点赞1
打赏
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回