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}

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