首页
社区
课程
招聘
[原创] KCTF 2019 Q1 第五题 欧拉函数
发表于: 2019-3-23 23:46 3833

[原创] KCTF 2019 Q1 第五题 欧拉函数

HHHso 活跃值
22
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以内的素数表

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 3
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//