SHCTF-2017:crackme

下載附件,附件爲exe的可執行文件,第一步查殼。python

發現爲nsPack殼,可採用脫殼機或者手動脫殼的方式進行脫殼。ide

在此採用手動脫殼的方式,增長本身對脫殼流程的理解,並熟練相關操做。學習

 

ESP定律脫殼this

將程序拖入ODspa

發現pushfd和pushad兩句關鍵句。3d

F8單步執行到call語句,ESP變化,在ESP上右鍵,添加斷點。code

 

F9執行程序blog

 

執行到popfd,且下一條命令爲一個很長距離的跳轉,根據北斗殼的特色,極可能跳轉至OEP。字符串

 

F8單步執行到以下位置get

觀察代碼 00401336 爲程序的OEP

 

利用PETools獲取轉存

 

利用 ImportREC 修復IAT

 

脫殼後的程序可以正確運行

 

對脫殼後的程序進行查殼

 

查詢結果殼已經脫掉,脫殼操做完畢。

 

將程序拖入IDA分析

int __cdecl main(int argc, const char **argv, const char **envp)
{
  int result; // eax
  int v4; // eax
  char Buf; // [esp+4h] [ebp-38h]
  char Dst; // [esp+5h] [ebp-37h]

  Buf = 0;
  memset(&Dst, 0, 0x31u);
  printf("Please Input Flag:");
  gets_s(&Buf, 0x2Cu);
  if ( strlen(&Buf) == 42 )
  {
    v4 = 0;
    while ( (*(&Buf + v4) ^ byte_402130[v4 % 16]) == dword_402150[v4] )
    {
      if ( ++v4 >= 42 )
      {
        printf("right!\n");
        goto LABEL_8;
      }
    }
    printf("error!\n");
LABEL_8:
    result = 0;
  }
  else
  {
    printf("error!\n");
    result = -1;
  }
  return result;
}

 

在while語句中,對輸入字符串進行異或運算,利用異或運算特殊的可逆性。將byte_402130與dword_402150進行異或,便可獲得正確答案。

byte_402130處須要模16 循環取值。

 

編寫python腳本

string_1 = "this_is_not_flag"
string_2 = [0x12, 4, 8, 0x14, 0x24, 0x5c, 0x4a, 0x3d, 0x56, 0xa, 0x10, 0x67, 0,
            0x41, 0, 1, 0x46, 0x5a, 0x44, 0x42, 0x6e, 0x0c,
            0x44, 0x72, 0x0c, 0x0d, 0x40, 0x3e, 0x4b, 0x5f, 2, 1, 0x4c, 0x5e, 
            0x5b, 0x17, 0x6e, 0xc, 0x16, 0x68, 0x5b, 0x12, 0x48, 0x0e]
flag = ""
for i in range(42):
    flag += chr(string_2[i] ^ ord(string_1[i % 16]))
print(flag)

輸出:flag{59b8ed8f-af22-11e7-bb4a-3cf862d1ee75}

 

解題完畢!

 

收穫:熟悉手動脫殼操做,解題完畢後,在網上查找資料學習各類殼的手動脫殼流程,對加殼脫殼有更加深刻的瞭解。

部分資料:ximo脫殼基礎     連接: https://pan.baidu.com/s/1zkE0zMgsMFBA5RawEajjOQ    提取碼: wf2y 

相關文章
相關標籤/搜索