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

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