2017.10.21總結

今天就做了兩道CTF的題,是真的頭疼···
總結:
1.第一道題是把flag藏在壓縮包中的做法,即在壓縮包的數據流中直接粘貼進去一段base64加密後的字段,這樣的方法會在解壓時提示壓縮包損壞(因爲其中有一段是沒壓縮過的直接加進去的),做這種題還是要熟悉文件頭;
2.第二道是一道逆向的題,需要注意的有:
   ①做逆向的題可以先shift+F12查找字符串,在通過X顯示字符串都出現在哪裏,最後F5反編譯開始做;
   ②在題中可以右鍵添加註釋;
   ③IDA中綠色是常量;
   ④strcpy是複製字符串,strlen是取字符串的長度;
   ⑤for循環中若沒有條件即本循環只能通過break終止循環;

   ⑥*(_BYTE *)(a1 + 9 * a2 + a3)是二維數組的取值方法,byte是取一個字節的數據;

   ⑦下次做這種題可以寫個程序把地圖畫出來;

   ⑧int是4個字節,char是1個。

下面是題:

int __cdecl main(int argc, const char **argv, const char **envp)
{
  int result; // eax@3
  size_t v4; // ebx@5
  size_t v5; // eax@6
  char v6; // [sp+4h] [bp-50h]@1
  char v7[50]; // [sp+13h] [bp-41h]@1
  char v8[4]; // [sp+45h] [bp-Fh]@1
  char v9; // [sp+4Bh] [bp-9h]@1
  size_t i; // [sp+4Ch] [bp-8h]@1

  sub_40D870();
  sub_47C370((int)&dword_487F00, v7);
  strcpy(v8, "xman{");                          // xman是答案的開頭
  v9 = 125;                                     // 125的ASCII碼爲}
  for ( i = 0; ; ++i )
  {
    v4 = i;
    if ( v4 >= strlen(v8) )
      break;
    if ( v7[i] != v8[i] )                       // v4是我的輸入值
    {
      sub_401500((int)"違うよ\n", v6);
      return 0;
    }
  }
  v5 = strlen(v7);                              // v2是v4的長度
  if ( v7[v5 - 1] == v9 )
  {
    v7[strlen(v7) - 1] = 0;
    sub_4015F3(&v7[5]);
    result = 0;
  }
  else
  {
    sub_401500((int)"違うよ\n", v6);
    result = 0;
  }
  return result;
}

// a1可能是我輸入的值中的數字
int __cdecl sub_4015F3(char *a1)
{
  signed int v1; // eax@2
  size_t v2; // ebx@17
  int result; // eax@19
  char v4; // [sp+4h] [bp-64h]@0
  int v5; // [sp+1Ah] [bp-4Eh]@1
  int v6; // [sp+1Eh] [bp-4Ah]@1
  char v7; // [sp+22h] [bp-46h]@1
  int v8; // [sp+23h] [bp-45h]@1
  int v9; // [sp+27h] [bp-41h]@1
  char v10; // [sp+2Bh] [bp-3Dh]@1
  int v11; // [sp+2Ch] [bp-3Ch]@1
  int v12; // [sp+30h] [bp-38h]@1
  char v13; // [sp+34h] [bp-34h]@1
  int v14; // [sp+35h] [bp-33h]@1
  int v15; // [sp+39h] [bp-2Fh]@1
  char v16; // [sp+3Dh] [bp-2Bh]@1
  int v17; // [sp+3Eh] [bp-2Ah]@1
  int v18; // [sp+42h] [bp-26h]@1
  char v19; // [sp+46h] [bp-22h]@1
  int v20; // [sp+47h] [bp-21h]@1
  int v21; // [sp+4Bh] [bp-1Dh]@1
  char v22; // [sp+4Fh] [bp-19h]@1
  int v23; // [sp+50h] [bp-18h]@1
  int v24; // [sp+54h] [bp-14h]@1
  size_t i; // [sp+58h] [bp-10h]@1
  char v26; // [sp+5Fh] [bp-9h]@1

  v5 = 0x5202020;
  v6 = 0x20202020;
  v7 = 0;                                       // char
  v8 = 0x5200520;
  v9 = 0x20050520;
  v10 = 0;                                      // char
  v11 = 0x20050520;
  v12 = 0x20200520;                             // char
  v13 = 0;
  v14 = 0x20200520;
  v15 = 0x20052020;
  v16 = 0;                                      // char
  v17 = 0x5200520;
  v18 = 0x5050520;
  v19 = 0;                                      // char
  v20 = 0x5202020;
  v21 = 0x20202020;
  v22 = 0;                                      // char
  v24 = 0;
  v23 = 0;
  v26 = 1;
  for ( i = 0; ; ++i )
  {
    v2 = i;
    if ( v2 >= strlen(a1) )                     // strlen是取字符串的長度
      break;
    v1 = a1[i];                                 // 把a的第一個值給v1
    if ( v1 == '2' )
    {
      v26 = sub_40157C((int)&v24, &v23);        // 23=7?  ++    v23<=6
      goto LABEL_14;
    }
    if ( v1 > 50 )
    {
      if ( v1 == '3' )
      {
        v26 = sub_4015A4(&v24);                 // v24=0?  --    v24>=1
        goto LABEL_14;
      }
      if ( v1 == '4' )
      {
        v26 = sub_4015CB(&v24);                 // v24=7?  24++
        goto LABEL_14;
      }
    }
    else if ( v1 == '1' )
    {
      v26 = sub_401555((int)&v24, &v23);        // 23=0?   23--
      goto LABEL_14;
    }
    v26 = 0;
LABEL_14:
    if ( (unsigned __int8)sub_401529((int)&v5, v24, v23) ^ 1 )// v24=3,v23=1或4
    {
      v26 = 0;
      break;
    }
  }
  if ( v26 == 1 )                               // 如果v26不等於1,就會出現痛···
  {
    if ( v24 != 5 || v23 != 7 )
    {
      result = sub_401500((int)&unk_489033, v4);
    }
    else if ( strlen(a1) <= '\x10' )
    {
      result = sub_401500((int)"本當に 本當に よかった\n", v4);
    }
    else
    {
      result = sub_401500((int)&"ああ..疲れた....\n", v4);
    }
  }
  else
  {
    result = sub_401500((int)"痛いQAQ\n", v4);
  }
  return result;
}


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