首页
社区
课程
招聘
[原创] 第一题:神秘来信
2019-6-21 11:50 1599

[原创] 第一题:神秘来信

2019-6-21 11:50
1599
使用IDA查看main函数,F5
int __cdecl main(int argc, const char **argv, const char **envp)
{
  int v3; // esi
  unsigned int v4; // kr00_4
  int result; // eax
  unsigned int v6; // ecx
  unsigned __int8 v9; // [esp+10h] [ebp-3Ch]
  unsigned __int8 v10; // [esp+11h] [ebp-3Bh]
  unsigned __int8 v11; // [esp+12h] [ebp-3Ah]
  char v12; // [esp+13h] [ebp-39h]
  char v13; // [esp+14h] [ebp-38h]
  char v14; // [esp+15h] [ebp-37h]
  CPPEH_RECORD ms_exc; // [esp+34h] [ebp-18h]

  v3 = 0;
  sub_401410(&unk_41C6F8);
  sub_4013D0((const char *)&unk_41C708, &v9);
  v4 = strlen((const char *)&v9);
  if ( v4 >= 7 || v14 != 51 || v13 != 53 || v12 != 51 || v11 + v10 + v9 != 149 )
  {
    sub_401410("error\n");
    result = 0;
  }
  else
  {
    v6 = 0;
    if ( v4 )
    {
      do
        v3 = *(&v9 + v6++) + 16 * v3 - 48;
      while ( v6 < v4 );
    }
    ms_exc.registration.TryLevel = 0;
    result = sub_401410("error!\n");
  }
  return result;
}

这个反编译结果有点问题,不过仍然可以看出程序接受6字符的输入。且后3字符为353。

由于v11 + v10 + v9 == 149,猜想6字符均为数字。于是打算编程暴力破解。需要暴力尝试21次。

尝试运行发现若v11 + v10 + v9 == 149会在输出后进入死循环。于是patch修改去掉死循环,让程序正常退出。

暴力破解最终获得注册码401353

反思以上猜想,若前3个字符不全为数字,由于可打印字符ascii码大于等于32,需要暴力枚举次数1485次。这个数量的暴力破解也可以接受。



[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

收藏
点赞0
打赏
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回