首页
社区
课程
招聘
CTF2019 第六题:消失的岛屿
2019-6-10 17:38 1505

CTF2019 第六题:消失的岛屿

2019-6-10 17:38
1505
分析很简单,来水一把
        首先看了程序是无壳程序,然后运行要求输入注册码,直接IDA 加载程序定位到main函数,直接F5代码很清晰


        看代码结构就是,输入的注册码,在base64编码以后直接跟字符串 !NGV%,$h1f4S3%2P(hkQ94== 比较,如果相同都成功,否则失败
        但是看这个字符串好奇怪,在正常base64中不可能出现%,( 这类字符,所以这个base64肯定有问题(或者只是替换了表呢/偷笑)
        双击进入 base64_encode 函数,发现流程都跟base64正常一样,其中 charEncrypt 特别奇怪,所以再进去分析 :

        代码同样很清晰,其中 替换表 为:
aTuvwxtulmnopqr db 'tuvwxTUlmnopqrs7YZabcdefghij8yz0123456VWXkABCDEFGHIJKLMNOPQRS9+/',0 
在base64替换编码以后又字符串又重新加减了一下,所以写个程序反过来倒退即可:
#include <stdio.h>
int main()
{
    char buf[] = {"!NGV%,$h1f4S3%2P(hkQ94"};
    for (int i=0; i<strlen(buf); i++)
    {
        char ch = 0;
        if (buf[i]>=0x21 && buf[i]<=0x41)
        {
            ch = buf[i]+64;
        }
        else if (buf[i]>=0x41 && buf[i]<=0x5A)
        {
            ch = 155 - buf[i];
        }
        else if (buf[i]>=0x62 && buf[i]<=0x6B)
        {
            ch = buf[i]-50;
        }
        else if (buf[i]=='w')
        {
            ch = '+';
        }
        else if (buf[i]=='y')
        {
            ch = '/';
        }
        printf("%c", ch);
    }
    printf("\n");
}
        结果得到字符串: aMTEeld6q4tHserKh69Jyt

        最后,再用一个可以修改编码表的base64工具还原即可(其中替换表为 tuvwxTUlmnopqrs7YZabcdefghij8yz0123456VWXkABCDEFGHIJKLMNOPQRS9+/):


        至此,就得到了最终注册码为: KanXue2019ctf_st 

[培训]二进制漏洞攻防(第3期);满10人开班;模糊测试与工具使用二次开发;网络协议漏洞挖掘;Linux内核漏洞挖掘与利用;AOSP漏洞挖掘与利用;代码审计。

收藏
点赞0
打赏
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回