-
-
[原创]2019CTFQ2T6
-
发表于: 2019-6-14 13:58 2783
-
上IDA, 定位
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | 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个字符。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | 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+/ 编码并按照条件转码。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | 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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | 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个字符。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | 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 ) |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | 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+/ 编码并按照条件转码。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | 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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | 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; } |
可以对以上数据所有可能进行编码。
赞赏
他的文章
- [原创] CTF2019-3-07 web svr wp 2789
- [原创]2019CTFQ2T6 2784
- [原创]CTF2019Q2T1 破文 2317
- [求助]WIN10 X64 下用户如何权限配置? 3509
赞赏
雪币:
留言: