-
-
[原创]第六题:消失的岛屿
-
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世界