bugku file (出題人有個不好的習慣,總喜歡清除回收站,這次在出題的過程中又把文件給刪了,你能幫他還原回來嗎?)

下載後發現是 file文件  

因爲是逆向題目我把它放入   IDA打開

找到main函數  F5反編譯得到  

int __cdecl main(int argc, const char **argv, const char **envp)
{
  const char *v3; // rsi
  const char **v5; // [rsp+0h] [rbp-1A0h]
  int i; // [rsp+1Ch] [rbp-184h]
  int v7; // [rsp+20h] [rbp-180h]
  signed int j; // [rsp+24h] [rbp-17Ch]
  int k; // [rsp+28h] [rbp-178h]
  FILE *v10; // [rsp+30h] [rbp-170h]
  _BYTE *v11; // [rsp+40h] [rbp-160h]
  _BYTE *v12; // [rsp+48h] [rbp-158h]
  int v13[64]; // [rsp+50h] [rbp-150h]
  char v14[72]; // [rsp+150h] [rbp-50h]
  unsigned __int64 v15; // [rsp+198h] [rbp-8h]

  v5 = argv;
  v15 = __readfsqword(0x28u);
  v10 = fopen(argv[1], "r");
  if ( !v10 )
    __assert_fail("file!=NULL", "file.c", 0x8Fu, "main");
  for ( i = 0; ; ++i )
  {
    v3 = "%c";
    if ( (unsigned int)__isoc99_fscanf((__int64)v10, (__int64)"%c", (__int64)&v14[i]) == -1 )
      break;
  }
  v7 = 0;
  v11 = encode(flllag);
  v12 = encode(sttr_home);
  for ( j = 0; j <= 63; j += 2 )
  {
    v3 = (const char *)(unsigned int)sttr_home[j + 1];
    v13[v7++] = sub_400EB9(sttr_home[j], sttr_home[j + 1]);
  }
  *v11 = (unsigned __int64)encode(flllag);
  for ( k = 0; k < v7; ++k )
  {
    if ( *flllag != (k ^ v14[k] ^ v13[k]) )
    {
      printf("Your file is wrong!! try again", v5);
      return 0;
    }
    ++flllag;
  }
  *v12 = (unsigned __int64)encode(sttr_home);
  printf("the flag is file's MD5 Congratulations!", v3, v5);
  return 0;
}

都看不懂沒有關係   只要懂了這裏就行

題目要求  滿足

flllag[k] = k ^ v14[k] ^ v13[k] 

時  輸出flag正確

那麼根據  

異或操作的可逆性,v14[k] = k ^ flllag[k] ^ v13[k]

也可以看出  V7是 計算傳入字符串的長度的 

 

分析 V13的函數 sub_400EB9():

將傳入的字符串664e06226625425d562e766e042d422c072c45692d125c7e6552606954646643

每兩位合在一起 構成十六進制數 

sttr_home[0]=6
sttr_home[1]=6


6*16 相當於十六進制左移一位

發現  v13數組是sttr_home變量數組中

函數sub_400E6A是16進制轉化爲10進制

相當於 先將字符串轉爲十六進制轉爲十進制  在構造成真正的十六進制字符

 

找到 sttr_home變量數組 中傳入的字符串

經過上面的函數 sub_400EB9()  形成了十六進制字符串

 

這個爲v13[k]

664e06226625425d562e766e042d422c072c45692d125c7e6552606954646643

 

並找到傳入的flag 

這個爲flllag

flag{hello_player_come_on_hahah}

接下來只需要 計算就可以了   附上腳本

strs = [0x66,0x4e,0x6,0x22,0x66,0x25,0x42,0x5d,0x56,0x2e,0x76,0x6e,0x4,0x2d,0x42,0x2c,0x7,0x2c,0x45,0x69,0x2d,0x12,0x5c,0x7e,0x65,0x52,0x60,0x69,0x54,0x64,0x66,0x43]
strss = "flag{hello_player_come_on_hahah}"
for i in range(len(strs)):
    print(hex(strs[i] ^ ord(strss[i]) ^ i), end='')

輸出

我們講 0x刪去  得到

0023654619482136324823156441354665623415546215061314121320181021

此時要寫入文件了 

1. 打開 十六進制編譯器 (我用的010 editor )

2.將這一串字符放入 .txt文件  並且導入 十六進制編譯器 

3.在保存導出即可 

 我導出的爲 a.txt  

之後計算 哈希值即可 

按照格式 提交即可  

小寫  

flag{914a7b9df69eab5b74b9edb7070e53e8}

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