-
-
[原创] 第六题:消失的岛屿
-
2019-6-21 11:55 2344
-
使用IDA查看main函数,F5
int __cdecl main(int argc, const char **argv, const char **envp) { int v3; // eax uint8_t bindata; // [esp+11h] [ebp-3Fh] const char *v6; // [esp+48h] [ebp-8h] char *v7; // [esp+4Ch] [ebp-4h] __main(); printf("please enter Serial:"); scanf(" %s", &bindata); if ( strlen((const char *)&bindata) > 49 ) puts("error"); v7 = (char *)calloc(1u, 0x400u); v3 = strlen((const char *)&bindata); base64_encode(&bindata, v7, v3); v6 = "!NGV%,$h1f4S3%2P(hkQ94=="; if ( !strcmp("!NGV%,$h1f4S3%2P(hkQ94==", v7) ) puts("Success"); else puts("Please Try Again"); free(v7); system("pause"); return 0; }
看到函数名字base64_encode多半是base64编码,并且"!NGV%,$h1f4S3%2P(hkQ94=="字符串以==结尾,长度为24,是4的倍数。不过"!NGV%,$h1f4S3%2P(hkQ94=="出现了奇怪的字符,那么可能是标准base64的变形。
在base64_encode函数中随即发现charEncrypt函数
char __cdecl charEncrypt(int data) { int dataa; // [esp+18h] [ebp+8h] dataa = aTuvwxtulmnopqr[data]; //'tuvwxTUlmnopqrs7YZabcdefghij8yz0123456VWXkABCDEFGHIJKLMNOPQRS9+/' if ( dataa > 64 && dataa <= 90 ) return -101 - dataa; if ( dataa > 96 && dataa <= 122 ) return dataa - 64; if ( dataa > 47 && dataa <= 57 ) return dataa + 50; if ( dataa == 43 ) return 119; if ( dataa == 47 ) dataa = 121; return dataa; }
'tuvw‘显然不是真实的base64字符表,charEncrypt函数相当于是对真实的字符表做了混淆。可以得到真实的表如下。
45678GF,-./0123iBA!"#$%&'()*j9:bcdefghEDC+ZYXWVUTSRQPONMLKJIHkwy
猜想本程序只是修改了base64的字符表,并没有对编码算法做出修改。而这种变形的base64相当于标准base64编码加简单替换。逆过程为简单替换加标准base64解码。
标准base64字符表如下。
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/
将"!NGV%,$h1f4S3%2P(hkQ94=="替换得到"S2FuWHVlMjAxOWN0Zl9zdA==",解码得到KanXue2019ctf_st成功。
[培训]二进制漏洞攻防(第3期);满10人开班;模糊测试与工具使用二次开发;网络协议漏洞挖掘;Linux内核漏洞挖掘与利用;AOSP漏洞挖掘与利用;代码审计。
最后于 2019-6-21 13:18
被alaaal编辑
,原因:
赞赏
他的文章
看原图