re每天一题(20200527)

re每天一题(20200527)

之前想要每天刷题被各种各样的事情中断了,重新捡起来这个吧。每天一题,会覆盘各比赛的题目,不过由于按照比赛来弄的话,一场比赛就会拖很长时间。就用每天一道题来约束吧,不一定是每天做一道,而是能够保证平均每天可以发一道wp。

覆盘在我的github博客上,https://prowes5.github.io/

今天先从2020GKCTF开始

Check_1n

老样子先载入IDA看下伪代码。函数较多,静态直接从头分析看来不太可能,想办法找到关键点吧。先运行一下康康。


可以看到出题人这里写了一个计算机(好闲)。。。需要找到开机密码。看下字符串有没有什么东西吧

看看什么地方使用了这个字符串。发现是在sub_4054F0调用了。大概看一下这个函数。

char *__cdecl sub_4054F0(char *a1)
{
  unsigned int v2; // ST50_4
  char v3; // [esp+50h] [ebp-1Ch]
  char *j; // [esp+54h] [ebp-18h]
  size_t i; // [esp+58h] [ebp-14h]
  unsigned int k; // [esp+58h] [ebp-14h]
  char *v7; // [esp+5Ch] [ebp-10h]
  char *v8; // [esp+60h] [ebp-Ch]
  size_t v9; // [esp+64h] [ebp-8h]
  size_t v10; // [esp+68h] [ebp-4h]

  v10 = strlen(a1);
  v9 = 3 * ((v10 >> 2) + 1);
  v8 = malloc(3 * ((v10 >> 2) + 1));
  v7 = &v8[v9];
  for ( i = 0; i < v10; ++i )
  {
    v3 = byte_175E270[a1[i]];
    if ( v3 < 0 )
    {
      sub_406B70(v8);
      return 0;
    }
    for ( j = &v8[v9 - 1]; j >= v7; --j )
    {
      v2 = 58 * *j + v3;
      *j = v2 % 0x100;
      v3 = BYTE1(v2);
    }
    if ( v3 > 0 )
    {
      if ( --v7 < v8 )
      {
        sub_406B70(v8);
        return 0;
      }
      *v7 = v3;
    }
  }
  for ( k = 0; k < &v8[v9] - v7; ++k )
    v8[k] = v7[k];
  v8[k] = 0;
  return v8;
}

通过密文的大致格式和算法,大体猜测一下为base58。写个脚本测试一下。

拿到flag

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章