1. 程式人生 > >2018/11/19-湖湘杯Re-Replace

2018/11/19-湖湘杯Re-Replace

 Replace

題目連結:https://pan.baidu.com/s/1kASjMHQYrQsHCYPEAIyk9w
提取碼:f5j9 

我們首先用IDA開啟,發現沒有多少東西,可以猜到是加了殼的。

 

使用Peid進行查殼,發現是UPX殼。

 

Upx殼比較簡單,我們之間使用esp定律殼輕鬆找到OEP

 

我們使用x32dbg來分析這個程式,x32dbg反編譯功能,這樣我們不必脫殼,在進行分析核心演算法的時候夠使用反編譯功能即可得到虛擬碼。

等殼載入完後到了繼續單步跟蹤,即可找到程式的核心部分,可以看到成功與失敗的字串Well Done

”和“Your Wrong”。

 

 

 

我們對這片彙編程式碼進行反編譯。

 

可以看出程式的功能是獲取輸入35個字元,然後再核心函式裡對輸入進行驗證,若輸入正確,則輸出成功,若輸入錯誤,則輸出錯誤。

 

下面我們跟進核心函式進行分析,彙編程式碼比較複雜,我們仍使用x32dbg的反編譯功能。

反彙編後

 

 

經分析我們可以看到有一個do-while迴圈來處理輸入的35個字元,進行迴圈35次,每次處理一個字元。

 

迴圈中首先根據輸入的一個字元進行運算得到兩個值esi6ed7

 

 

接著根據程式中的一個地址儲存的陣列(我們稱為data陣列)中的值生成eax8ecx9

 

 

我們動態除錯一下可得到data陣列中的值。

 

然後就是進行比較,我們來看最後進行的比較

 

 

分析知道是比較的是,由edi7esi6進行運算得到一個數當下標,然後在一個數組中(我們稱為arr陣列)進行查詢,然後和ecx9eax8進行運算的值比較。

 

也就是說,比較的兩個值,一個是根據輸入的字元生成下標,然後在arr陣列中進行尋值,另一個值呢,是根據程式中的data陣列生成的。

並且可以知道,

data陣列是固定的,所以等式右邊比較的36個值都是固定的。我們在比較的地方設下動態斷點,不必運算,通過除錯即可得到右邊的cmp2陣列36個值。

 

 

得到

cmp2[35]={0x33,0x50,0xef,0x85,0x21,0x20,0x45,0xc7,0x8f,0xcf,0xc7,0x8f,0xcf,0xed,0xf9,0x3c,0x51,0x50,0x4d,0xcf,0x0,0x4d,0x51,0xc7,0xef,0xfb,0xc3,0xcf,0x6e,0x9f,0xfb,0x4,0x43,0xc3,0xff}

 

cmp2陣列的值都能在arr陣列找到,只要滿足輸入的字元生成的下標正確即可。然後我們知道迴圈每次都處理一個字元,產生一個下標,有一個對應的arr陣列的值,然後和cmp2陣列進行比較。

所以我們選擇輸入常見的字元然後進行除錯,在比較的地方設下斷點,然後執行檢視暫存器eax,(將下面比較不相等的跳轉指令nop掉),就是這個字元在arr陣列中對應的值,然後我們能夠得到常見字元對應的arr陣列中的值。

常見字元對應的arr陣列中的值如下(為了節省時間不全部列出,列出比較值主要對應的):

0-0x4  1-0xc7  2-0x23  3-0xc3  4-0x18  5-0x96  6-0x5  7-0x9a  8-0x7  9-0x12

a-0xef  b-0xaa  c-0xfb  d-0x43  e-0x4d  f-0x33  g-0x85  h-0x45  i-0xf9  j-0x2

...  l-0x50  m-0x3c  n-0x9f ...  p-0x51 ... s-0x8f ....

...  R-0x0  T-0x20  S-0xed ...  E-0x6E ... {-0x21 ...  }-0xff ... _-0xcf ...

 

然後我們只要將cmp2陣列的中的值進行匹配相應的字元即可。