首页
社区
课程
招聘
[原创]第六题:消失的岛屿
2019-6-17 21:06 2046

[原创]第六题:消失的岛屿

2019-6-17 21:06
2046

简单看下ida反汇编的情况,稍微修改一下,差不多就是这样

int  main()

{

  int v3; // eax 

unsigned __int8 bindata; // [esp+11h] [ebp-3Fh]

   char v6[]= "!NGV%,$h1f4S3%2P(hkQ94==";

   char *v7; // [esp+4Ch] [ebp-4h]

  unsigned __int8 bindata[31];

  scanf("%s",bindata);

  v7 = (char *)calloc(1u, 1024u);

   base64_encode(bindata, v7,30);

   if(strcmp(v7,v6))

      printf("sucess");

   else

      printf("error");

   return 0;

}

好,那么现在只要根据base64_encode写逆过来的decode就行了

问题来了

base64_encode中含有这样的代码

 v4 = &base64[i];                           // 取值,v4=base64[i]

*v4 = charEncrypt((bindata[i] >> 2) & 63);

current = 16 * bindata[i] & 48;

v10 = &base64[v9];

*v10 = charEncrypt((bindata[i + 1] >> 4) | current);

currenta = 4 * bindata[i + 1] & 60;

base64[jb] = charEncrypt((bindata[i + 2] >> 6) | currenta);   //jb=j+2

v13 = &base64[v12];             //v12=jb+1 即j+3

*v13 = charEncrypt(bindata[i + 2] & 63); 

CharEncrypt函数的逆向很容易,但是base64_encode就很迷了

& | >> 这些操作都是不可逆转的,无法知道结果就推出原函数

我们没有办法只能emmmmm穷举了

这里很明显可以看出,每一个都和前一个有关系,那么直接..

char v6[]= "!NGV%,$h1f4S3%2P(hkQ94==";

for(int i=0;i<256;i++)

      {  bindata[0]=i;

         for(int j=0;j<256;j++)

         {

             bindata[0+1]=j;

            base64_encode(bindata, v7,22);

            if(v7[0]==v6[0]&&v7[1]==v6[1])

            {

               printf("%s ,%s\n",bindata,v7);

            }

         }

      }

运行,可以得知第一个字符是K.

bindata[0]=’K’ ;

再按这个for循环依次穷举

bindata[1]=’a’;

bindata[2]=’n’;

基本就知道了是KanXue开头,令bindata=”KanXue”

走Base64_encode函数,结果正确,方法没错,再依次往下穷举.

最后可知字符串为KanXue2019ctf_st

带入原程序,输出success

用时两小时,真不容易


[CTF入门培训]顶尖高校博士及硕士团队亲授《30小时教你玩转CTF》,视频+靶场+题目!助力进入CTF世界

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