链接: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。