2018/12/19-SWPUCTF-re2
阿新 • • 發佈:2018-12-20
連結: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): returnx.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。