-
-
[原创] KCTF 2019 Q1 第五题 欧拉函数
-
发表于: 2019-3-23 23:46 3833
-
0x01 响应函数,逻辑相对清晰
即初步需要key的0,1两位不能同时为'A',第5和0x0B位必须位'V'
且V最终会被过滤掉,
过滤掉V字母后的key
0 1 5 b A A V V
0 1 5 b A A V V
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; }
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以内的素数表
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
赞赏记录
参与人
雪币
留言
时间
一笑人间万事
为你点赞~
2023-1-27 05:26
i1arn
为你点赞~
2019-3-29 17:05
山竹笠
为你点赞~
2019-3-27 20:48
赞赏
他的文章
- [原创] KCTF 2022 Win. 第六题 约束与伪随机 6754
- [原创] KCTF 2021 Win. 第二题 排排坐 21179
- [原创] KCTF 2021 Win. 第一题 算力与攻击模式 4122
- 鸿蒙通识 26057
- [原创] KCTF 2021 Spr. 第二题 未选择的路 9262
看原图
赞赏
雪币:
留言: