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。

猜你喜欢

转载自www.cnblogs.com/Fingerprint/p/10147238.html