-
-
[原创] KCTF 2019 Q1 第五题 欧拉函数
-
发表于: 2019-3-23 23:46 4020
-
0x01 响应函数,逻辑相对清晰
即初步需要key的0,1两位不能同时为'A',第5和0x0B位必须位'V'
且V最终会被过滤掉,
过滤掉V字母后的key
1 2 | 0 1 5 b A A V V |
1 2 | 0 1 5 b A A V V |
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 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 | int __cdecl sub_402652( HWND hDlg) { int i; // esi char v2; // cl int v3; // eax size_t v4; // eax int v5; // edi int v6; // esi int v7; // eax char lstr6_ekey[256]; // [esp+Ch] [ebp-614h] char lstr7[256]; // [esp+10Ch] [ebp-514h] char lstr3_key[256]; // [esp+20Ch] [ebp-414h] char lstr4_msgtips[256]; // [esp+30Ch] [ebp-314h] char lstr5_dkey[256]; // [esp+40Ch] [ebp-214h] char lstr2_key[256]; // [esp+50Ch] [ebp-114h] char lstr1[4]; // [esp+60Ch] [ebp-14h] int loc_keylen; // [esp+610h] [ebp-10h] size_t v17; // [esp+614h] [ebp-Ch] char v18; // [esp+61Bh] [ebp-5h] int loc_ErrorLevel; // [esp+61Ch] [ebp-4h] lstr1[0]=0; *(_WORD*)&lstr1[1]=0; lstr1[3]=0; lstr2_key[0]=0; memset (&lstr2_key[1],0,0xFCu); *(_WORD*)&lstr2_key[253]=0; lstr2_key[255]=0; lstr3_key[0]=0; memset (&lstr3_key[1],0,0xFCu); *(_WORD*)&lstr3_key[253]=0; lstr3_key[255]=0; lstr4_msgtips[0]=0; memset (&lstr4_msgtips[1],0,0xFCu); *(_WORD*)&lstr4_msgtips[253]=0; lstr4_msgtips[255]=0; GetDlgItemTextA(hDlg,1000,lstr1,3); loc_keylen=GetDlgItemTextA(hDlg,1001,lstr2_key,255); Hi_get_P1Id_P2msg(0,lstr4_msgtips); v17=0; loc_ErrorLevel=0; if (loc_keylen<12) loc_ErrorLevel=1; if (lstr2_key[0]== 'A' && lstr2_key[1] == 'A' ) ++loc_ErrorLevel; if (lstr2_key[5]!= 'V' || lstr2_key[11] != 'V' ) ++loc_ErrorLevel; for (i=0;i<loc_keylen;++i) { if (i!=5&&i!=11) { v2=lstr2_key[i]; v18=lstr2_key[i]; if (dword_4082EC<=1) { v3=*((_WORD*)off_4080E0+v2)&0x107; } else { v3=_isctype(v2,263); v2=v18; } if (!v3) { loc_ErrorLevel+=3; break ; } v4=v17++; lstr3_key[v4]=v2; } } if (!loc_ErrorLevel) { lstr5_dkey[0]=0; memset (&lstr5_dkey[1],0,0xFCu); *(_WORD*)&lstr5_dkey[253]=0; lstr5_dkey[255]=0; lstr6_ekey[0]=0; memset (&lstr6_ekey[1],0,0xFCu); *(_WORD*)&lstr6_ekey[253]=0; lstr6_ekey[255]=0; lstr7[0]=0; memset (&lstr7[1],0,0xFCu); *(_WORD*)&lstr7[253]=0; lstr7[255]=0; v5=lstr1[0]; Hi_fetchTableToP2_0toP30x40_xor_50h(80,lstr7,64); Hi_set_st1_0to50hZero_eq_P1_0to40h_and_use_st1_to_intit_st2_402270(lstr7); v6=Hi_use_st2b64_decode_P1_to_P2_retLen(lstr3_key,lstr5_dkey); Hi_b64_encode_P1str_P3Len_to_P2(lstr5_dkey,lstr6_ekey,v6); if (lstr5_dkey[0]) { if (! memcmp (lstr6_ekey,lstr3_key,v17)) { v7=sub_4024E1(100,v5,lstr5_dkey,v6); Hi_get_P1Id_P2msg(v7,lstr4_msgtips); } } } MessageBoxA(hDlg,lstr4_msgtips,lstr4_msgtips,0); return 0; } |
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 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 | int __cdecl sub_402652( HWND hDlg) { int i; // esi char v2; // cl int v3; // eax size_t v4; // eax int v5; // edi int v6; // esi int v7; // eax char lstr6_ekey[256]; // [esp+Ch] [ebp-614h] char lstr7[256]; // [esp+10Ch] [ebp-514h] char lstr3_key[256]; // [esp+20Ch] [ebp-414h] char lstr4_msgtips[256]; // [esp+30Ch] [ebp-314h] char lstr5_dkey[256]; // [esp+40Ch] [ebp-214h] char lstr2_key[256]; // [esp+50Ch] [ebp-114h] char lstr1[4]; // [esp+60Ch] [ebp-14h] int loc_keylen; // [esp+610h] [ebp-10h] size_t v17; // [esp+614h] [ebp-Ch] char v18; // [esp+61Bh] [ebp-5h] int loc_ErrorLevel; // [esp+61Ch] [ebp-4h] lstr1[0]=0; *(_WORD*)&lstr1[1]=0; lstr1[3]=0; lstr2_key[0]=0; memset (&lstr2_key[1],0,0xFCu); *(_WORD*)&lstr2_key[253]=0; lstr2_key[255]=0; lstr3_key[0]=0; memset (&lstr3_key[1],0,0xFCu); *(_WORD*)&lstr3_key[253]=0; lstr3_key[255]=0; lstr4_msgtips[0]=0; memset (&lstr4_msgtips[1],0,0xFCu); *(_WORD*)&lstr4_msgtips[253]=0; lstr4_msgtips[255]=0; GetDlgItemTextA(hDlg,1000,lstr1,3); loc_keylen=GetDlgItemTextA(hDlg,1001,lstr2_key,255); Hi_get_P1Id_P2msg(0,lstr4_msgtips); v17=0; loc_ErrorLevel=0; if (loc_keylen<12) loc_ErrorLevel=1; if (lstr2_key[0]== 'A' && lstr2_key[1] == 'A' ) ++loc_ErrorLevel; if (lstr2_key[5]!= 'V' || lstr2_key[11] != 'V' ) ++loc_ErrorLevel; for (i=0;i<loc_keylen;++i) { if (i!=5&&i!=11) { v2=lstr2_key[i]; v18=lstr2_key[i]; if (dword_4082EC<=1) { v3=*((_WORD*)off_4080E0+v2)&0x107; } else { v3=_isctype(v2,263); v2=v18; } if (!v3) { loc_ErrorLevel+=3; break ; } v4=v17++; lstr3_key[v4]=v2; } } if (!loc_ErrorLevel) { lstr5_dkey[0]=0; memset (&lstr5_dkey[1],0,0xFCu); *(_WORD*)&lstr5_dkey[253]=0; lstr5_dkey[255]=0; lstr6_ekey[0]=0; memset (&lstr6_ekey[1],0,0xFCu); *(_WORD*)&lstr6_ekey[253]=0; lstr6_ekey[255]=0; lstr7[0]=0; memset (&lstr7[1],0,0xFCu); *(_WORD*)&lstr7[253]=0; lstr7[255]=0; v5=lstr1[0]; Hi_fetchTableToP2_0toP30x40_xor_50h(80,lstr7,64); Hi_set_st1_0to50hZero_eq_P1_0to40h_and_use_st1_to_intit_st2_402270(lstr7); v6=Hi_use_st2b64_decode_P1_to_P2_retLen(lstr3_key,lstr5_dkey); Hi_b64_encode_P1str_P3Len_to_P2(lstr5_dkey,lstr6_ekey,v6); if (lstr5_dkey[0]) { if (! memcmp (lstr6_ekey,lstr3_key,v17)) { v7=sub_4024E1(100,v5,lstr5_dkey,v6); Hi_get_P1Id_P2msg(v7,lstr4_msgtips); } } } MessageBoxA(hDlg,lstr4_msgtips,lstr4_msgtips,0); return 0; } |
0x02 难能可贵的是,样例自带了key的解码和编码函数
如图中的 Hi_use_st2b64_decode_P1_to_P2_retLen 位解密函数,用于将过滤V字母后的输入key解码位字节数组(对应这大数)
而Hi_b64_encode_P1str_P3Len_to_P2 用于将字节(大数)编码位字符串
我们可以再两处下断点,根据我们需要填充参数,解码和编码得到我们需要的内容

0x03 主要校验由函数Hi_check_dkeynum_sub_4024E1 完成,其需要返回2才能显示成功字符串

0x03 主要校验函数逻辑也相对简单
(1)其通过0040250C call Hi_sqrt_P1_and_factors_to_P2_retFactorsNum 函数生成100以内的素数表
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
赞赏记录
参与人
雪币
留言
时间
PLEBFE
为你点赞~
2023-1-27 05:26
i1arn
为你点赞~
2019-3-29 17:05
山竹笠
为你点赞~
2019-3-27 20:48
赞赏
他的文章
赞赏
雪币:
留言: