1. 程式人生 > >2018/12/19-SWPUCTF-re2

2018/12/19-SWPUCTF-re2

連結:https://pan.baidu.com/s/1h9B2m0OibyKgibE7zWTA9w
提取碼:zpqi 


根據題目提示用x32dbg動態除錯發現和SEH,VEH有關。

處理函式在sub_401600中,對輸入進行迴圈左移和異或,動態除錯時發現會在輸入後加上"cyy",然後主兩部分處理都是對dword值進行操作,寫指令碼要注意處理。

然後時handler函式。

進行base64加密,需要注意的編碼表是變化了的。

最後和“LMlWu2Y/Tk8c33Y+T8Lv0a=="對比。

先寫base64解密指令碼。

from string import maketrans

base 
= 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/' diy_base = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/' t = maketrans(base, diy_base) t2 = maketrans(diy_base, base) def cus_base64_enc(x): return x.encode('base64').translate(t) def cus_base64_dec(x): return
x.translate(t2).decode('base64') str = cus_base64_dec('LMlWu2Y/Tk8c33Y+T8Lv0a==') for i in str: print("0x%x,"%ord(i)),

得到0x96, 0x62, 0xf0, 0x53, 0x6c, 0xbf, 0xb4, 0xaf, 0x2, 0xdf, 0x7c, 0xbe, 0xb7, 0xc9, 0x55, 0xd0。

四個一組我們可以寫出四個dword值,arr1=0x53f06296,arr2=0xafb4bf6c,arr3=0xbe7cdf02,arr4=0xd055c9b7。然後恢復一下四個dword值的順序,得到arr1=0xd055c9b7,arr2=0xbe7cdf02,arr3=0x53f06296,arr4=0xafb4bf6c。其中“cyy”的dword值為0x797963,為arr5=0x797963。

然後我們寫出迴圈左移異或的逆向指令碼即可。

arr1 = 0xd055c9b7
arr2 = 0xbe7cdf02
arr3 = 0x53f06296
arr4 = 0xafb4bf6c
arr5 = 0x797963

arr4 = arr4 ^ arr5
arr4 = ((arr4<<27)|(arr4>>5))&0xffffffff
arr3 = arr3 ^ arr4
arr3 = ((arr3<<27)|(arr3>>5))&0xffffffff
arr2 = arr2 ^ arr3
arr2 = ((arr2<<27)|(arr2>>5))&0xffffffff
arr1 = arr1 ^ arr2
arr1 = ((arr1<<27)|(arr1>>5))&0xffffffff

flag = ''
arr = [arr1,arr2,arr3,arr4]
for i in arr:
    a = hex(i)[2:-1].decode('hex')
    flag += a[::-1]
print flag

執行即可得到flag。