首页
社区
课程
招聘
[原创]第5题 青梅竹马 Writeup
2019-3-10 17:27 2360

[原创]第5题 青梅竹马 Writeup

2019-3-10 17:27
2360

这是一个Win32逆向

 

有一个自定义的Base64编码
字符集是ABCyVPGHTJKLMNOFQRSIUEWDYZgbc8sfah1jklmnopqret5v0xX9wi234u67dz+/
有一个先解码再编码的操作,本质上是做了一个长度校验
另外有判断Flag前两位不是A,第6位和第12位是V
再次解码的时候V没有用到
进入下一个check,发现又是熟悉的高精度计算。。。

// sub_4024e1
  v7 = 0;
  memset(prime_table, 0, sizeof(prime_table));
  __0x53 = sub_40243F(_100, &v7);
  hp_new((int)&powmod_res);
  hp_new((int)&v9);
  hp_init((int)&powmod_res, 0);
  hp_init((int)&flag_num, 0);
  v4 = 1;
  hp_init((int)&mul_3_to_73, 1);
  hp_init((int)&v9, v7);
  hp_str_init(&flag_num, decoded_flag, len);
  res = hp_ldword_abs((int)&powmod_res);
  if ( __0x53 > 1 )
  {
    v5 = prime_table;
    while ( *v5 != _O )
    {
      if ( *v5 )
        hp_mul((int)&mul_3_to_73, (int)&mul_3_to_73, *v5);
      ++v4;
      ++v5;
      if ( v4 >= __0x53 )
        goto LABEL_9;
    }
    __0x53 = prime_table[v4];
  }
LABEL_9:
  if ( hp_cmp((int)&flag_num, (int)&v9) >= 0 && hp_cmp((int)&flag_num, (int)&mul_3_to_73) <= 0 )
  {
    hp_powmod((int)&powmod_res, (int)&flag_num, __0x53, (int)&mul_3_to_73);
    if ( hp_cmp((int)&powmod_res, (int)&v9) >= 0 && hp_cmp((int)&powmod_res, (int)&mul_3_to_73) <= 0 )
      res = hp_ldword_abs((int)&powmod_res);
  }
  hp_del((int)&powmod_res);
  hp_del((int)&v9);
  return res;
}

创建了几个大整数对象,其中有一个初始化为了解码后的Flag
先求出了100以内的素数,然后算了一个

3*5*7*11*13*17...*73

的值
然后判断Flag是否在2到这个数之间
然后做了一个powmod, flag * 83 % (3\...*73)
这个结果要等于正负2
使用Wolfram解得

x = 20364840299624512075310661735 * n + 6602940601029543050476765433

可以解得Flag

>>> x = 'ABCyVPGHTJKLMNOFQRSIUEWDYZgbc8sfah1jklmnopqret5v0xX9wi234u67dz+/'
>>> y = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
>>> t = string.maketrans(y, x)
>>> hex(6602940601029543050476765433)
'0x1555d30f38b0dbcaec83c0f9L'
>>> '1555d30f38b0dbcaec83c0f9'.decode('hex').encode('base64').translate(t)
'PEDIy9102dreadyu\n'

补上两个V得最终结果

PEDIyV9102dVreadyu

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

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