SHCTF-2017:crackme


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

發現為nsPack殼,可采用脫殼機或者手動脫殼的方式進行脫殼。

在此采用手動脫殼的方式,增加自己對脫殼流程的理解,並熟練相關操作。

 

ESP定律脫殼

將程序拖入OD

發現pushfd和pushad兩句關鍵句。

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

 

F9執行程序

 

執行到popfd,且下一條命令為一個很長距離的跳轉,根據北斗殼的特點,很可能跳轉至OEP。

 

F8單步執行到如下位置

觀察代碼 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 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM