-
-
[原创]2019CTFQ2T6
-
发表于: 2019-6-14 13:58 2625
-
上IDA, 定位
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) > 0x31 ) 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编码,与 !NGV%,$h1f4S3%2P(hkQ94==
比较
。
但是该码值和base64的不一致,进入base64_encode.主要将三个字符转成4个字符。
while ( i < binlength ) { v3 = j; ja = j + 1; v4 = &base64[v3]; *v4 = charEncrypt((bindata[i] >> 2) & 0x3F); current = 16 * bindata[i] & 0x30; if ( i + 1 >= binlength ) { v5 = ja; v6 = ja + 1; v7 = &base64[v5]; *v7 = charEncrypt(current); base64[v6] = '='; v8 = v6 + 1; j = v6 + 2; base64[v8] = 0x3D; break; } v9 = ja; jb = ja + 1; v10 = &base64[v9]; *v10 = charEncrypt((bindata[i + 1] >> 4) | current); currenta = 4 * bindata[i + 1] & 0x3C; if ( i + 2 >= binlength )
转码函数,是对 tuvwxTUlmnopqrs7YZabcdefghij8yz0123456VWXkABCDEFGHIJKLMNOPQRS9+/ 编码并按照条件转码。
char __cdecl charEncrypt(int data) { int dataa; // [esp+18h] [ebp+8h] dataa = aTuvwxtulmnopqr[data]; if ( dataa > 0x40 && dataa <= 0x5A ) return 0x9B - dataa; if ( dataa > 0x60 && dataa <= 0x7A ) return dataa - 0x40; if ( dataa > 0x2F && dataa <= 0x39 ) return dataa + 0x32; if ( dataa == 0x2B ) return 0x77; if ( dataa == 0x2F ) dataa = 0x79; return dataa; }
可以对以上数据所有可能进行编码。
tuvwxTUlmnopqrs7YZabcdefghij8yz0123456VWXkABCDEFGHIJKLMNOPQRS9+/
===》
45678GF,-./0123iBA!\"#$%&'()*j9:bcdefghEDC+ZYXWVUTSRQPONMLKJIHkwy
而正真的base64 编码为
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890+/
所以,将目标 !NGV%,$h1f4S3%2P==(hkQ94 进行简单替换为 : S3FuWHVlMjAxOWN1Zl0zdA==
在base64反码 得: KqnXue2019cuf]3t 。 出现问题,可以猜测为KanXue2019ctf***
进一步实验发现正确,出现这种偏差在于 编码函数对 数字 进行了 +1 操作。
反操作得:
S2FuWHVlMjAxOWN0Zl9zdA==
解码得:
KanXue2019ctf_st
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) > 0x31 ) 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编码,与 !NGV%,$h1f4S3%2P(hkQ94==
比较
。
但是该码值和base64的不一致,进入base64_encode.主要将三个字符转成4个字符。
while ( i < binlength ) { v3 = j; ja = j + 1; v4 = &base64[v3]; *v4 = charEncrypt((bindata[i] >> 2) & 0x3F); current = 16 * bindata[i] & 0x30; if ( i + 1 >= binlength ) { v5 = ja; v6 = ja + 1; v7 = &base64[v5]; *v7 = charEncrypt(current); base64[v6] = '='; v8 = v6 + 1; j = v6 + 2; base64[v8] = 0x3D; break; } v9 = ja; jb = ja + 1; v10 = &base64[v9]; *v10 = charEncrypt((bindata[i + 1] >> 4) | current); currenta = 4 * bindata[i + 1] & 0x3C; if ( i + 2 >= binlength )
while ( i < binlength ) { v3 = j; ja = j + 1; v4 = &base64[v3]; *v4 = charEncrypt((bindata[i] >> 2) & 0x3F); current = 16 * bindata[i] & 0x30; if ( i + 1 >= binlength ) { v5 = ja; v6 = ja + 1; v7 = &base64[v5]; *v7 = charEncrypt(current); base64[v6] = '='; v8 = v6 + 1; j = v6 + 2; base64[v8] = 0x3D; break; } v9 = ja; jb = ja + 1; v10 = &base64[v9]; *v10 = charEncrypt((bindata[i + 1] >> 4) | current); currenta = 4 * bindata[i + 1] & 0x3C; if ( i + 2 >= binlength )
转码函数,是对 tuvwxTUlmnopqrs7YZabcdefghij8yz0123456VWXkABCDEFGHIJKLMNOPQRS9+/ 编码并按照条件转码。
char __cdecl charEncrypt(int data) { int dataa; // [esp+18h] [ebp+8h] dataa = aTuvwxtulmnopqr[data]; if ( dataa > 0x40 && dataa <= 0x5A ) return 0x9B - dataa; if ( dataa > 0x60 && dataa <= 0x7A ) return dataa - 0x40; if ( dataa > 0x2F && dataa <= 0x39 ) return dataa + 0x32; if ( dataa == 0x2B ) return 0x77; if ( dataa == 0x2F ) dataa = 0x79; return dataa; }
可以对以上数据所有可能进行编码。
tuvwxTUlmnopqrs7YZabcdefghij8yz0123456VWXkABCDEFGHIJKLMNOPQRS9+/
===》
45678GF,-./0123iBA!\"#$%&'()*j9:bcdefghEDC+ZYXWVUTSRQPONMLKJIHkwy
而正真的base64 编码为
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890+/
所以,将目标 !NGV%,$h1f4S3%2P==(hkQ94 进行简单替换为 : S3FuWHVlMjAxOWN1Zl0zdA==
在base64反码 得: KqnXue2019cuf]3t 。 出现问题,可以猜测为KanXue2019ctf***
进一步实验发现正确,出现这种偏差在于 编码函数对 数字 进行了 +1 操作。
反操作得:
S2FuWHVlMjAxOWN0Zl9zdA==
解码得:
KanXue2019ctf_st
char __cdecl charEncrypt(int data) { int dataa; // [esp+18h] [ebp+8h] dataa = aTuvwxtulmnopqr[data]; if ( dataa > 0x40 && dataa <= 0x5A ) return 0x9B - dataa; if ( dataa > 0x60 && dataa <= 0x7A ) return dataa - 0x40; if ( dataa > 0x2F && dataa <= 0x39 ) return dataa + 0x32; if ( dataa == 0x2B ) return 0x77; if ( dataa == 0x2F ) dataa = 0x79; return dataa; }
可以对以上数据所有可能进行编码。
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)
赞赏
他的文章
- [原创] CTF2019-3-07 web svr wp 2653
- [原创]2019CTFQ2T6 2626
- [原创]CTF2019Q2T1 破文 2192
- [求助]WIN10 X64 下用户如何权限配置? 3254
看原图
赞赏
雪币:
留言: