1. 程式人生 > >【reversing.kr逆向之旅】Direct3D FPS的writeup

【reversing.kr逆向之旅】Direct3D FPS的writeup

Direct3D FPS  看到這個名字就感覺會不會是個射擊遊戲  然後執行果然是

玩了一會兒  看到有個幾個小胖人  打不死  走過去就Game Over了

PEiD看到使用C++寫的

直接載入IDA

分析字串

很明顯與Game Clear!就是與失敗相對應的成功

雙擊

檢視交叉引用

然後F5得到

int sub_403400()
{
  int i; // eax
  int v2; // ecx
  int v3; // edx

  i = sub_403440();
  if ( i != -1 )
  {
    v2 = 0x84 * i;
    v3 = dword_409190[0x84 * i];
    if ( v3 > 0 )
    {
      dword_409190[v2] = v3 - 2;
    }
    else
    {
      dword_409194[v2] = 0;
      flag[i] ^= byte_409184[v2 * 4];
    }
  }
  return i;
}

這裡再對flag[i] ^= byte_409184[v2 * 4];這句進行動態分析 可知就是i*4

寫指令碼

s = [0x43, 0x6B, 0x66, 0x6B, 0x62, 0x75, 0x6C, 0x69, 0x4C, 0x45, 
  0x5C, 0x45, 0x5F, 0x5A, 0x46, 0x1C, 0x07, 0x25, 0x25, 0x29, 
  0x70, 0x17, 0x34, 0x39, 0x01, 0x16, 0x49, 0x4C, 0x20, 0x15, 
  0x0B, 0x0F, 0xF7, 0xEB, 0xFA, 0xE8, 0xB0, 0xFD, 0xEB, 0xBC, 
  0xF4, 0xCC, 0xDA, 0x9F, 0xF5, 0xF0, 0xE8, 0xCE, 0xF0, 0xA9]
flag = ''
for i in range(len(s)):
	flag+=chr(s[i] ^ (i*4))
print flag
#Congratulation~ Game Clear! Password is Thr3EDPr0m