首页
社区
课程
招聘
[原创]第五题分析
发表于: 2016-11-10 20:45 2015

[原创]第五题分析

loudy 活跃值
10
2016-11-10 20:45
2015
第五题分析


从上图可以看出密码共6位,且大于等于0x30,小于等于0x39,即为纯数字。

上图两个函数调用为关键调用。

IDA F5
signed int __cdecl sub_401000(int a1, int a2)
{
  unsigned __int8 v2; // dl@1
  char *v3; // edi@1
  signed int v4; // eax@1
  int v5; // eax@3
  char v6; // cl@4
  signed int result; // eax@7
  char *v8; // ecx@7
  signed int v9; // [sp+10h] [bp-108h]@3
  char v10; // [sp+18h] [bp-100h]@1
  char v11; // [sp+19h] [bp-FFh]@1
  __int16 v12; // [sp+115h] [bp-3h]@1
  char v13; // [sp+117h] [bp-1h]@1

  v2 = 0;
  v10 = 0;
  memset(&v11, 0, 0xFCu);
  v12 = 0;
  v13 = 0;
  v3 = &v10;
  v4 = 0;
  do
  {
    *(&v10 + v4) = v4;
    ++v4;
  }
  while ( v4 < 256 );
  v5 = 0;
  v9 = 256;
  do
  {
    v6 = *v3;
    v2 += *v3 + *(_BYTE *)(v5++ + a1);
    *v3 = *(&v10 + v2);
    *(&v10 + v2) = v6;
    if ( v5 == a2 )
      v5 = 0;
    ++v3;
    --v9;
  }
  while ( v9 );
  result = 0;
  v8 = &v13;
  do
  {
    byte_406030[result] ^= *v8 + *(&v10 + result);
    ++result;
    --v8;
  }
  while ( result < 128 );
  return result;
}
上面函数利用输入的密码对406030处代码解密,正确解密才能正确运行。

BOOL sub_4010C0()
{
  __int64 v0; // rdi@1
  signed int v1; // ecx@1

  v0 = 0i64;
  v1 = 0;
  do
    v0 += (unsigned __int8)byte_406030[v1++];
  while ( v1 < 128 );
  return v0 == 10617;
}

上面函数对406030处共128字节逐个相加,判断和是否为10617,是则意味着正确解密。
因为密码才6位,且范围窄,暴力搜索非常快,遂代码搜索之,得到771535,附上代码。

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

上传的附件:
收藏
免费 0
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//