第一次用python3生成的pyc出现了很多关于版本的问题,所以第二次使用python2生成pyc
按照题上给出的数据,首先base64解密,然后解压生成out.pyc文件
uncompyle6反汇编生成的py文件是乱码,究其原因out.pyc文件缺少pyc的文件头,用十六进制工具添加文件头:03 F3 0D 0A 97 32 18 5E 63
关于pyc与py的介绍:https://www.cnblogs.com/blili/p/11799483.html
这里有一个坑是要用python2生成的pyc文件头,从图中我们可以看出两个版本生成的pyc头是不同的,命令:python -m py_compile 1.py
pyc转py,uncompyle6 -o exchange.py out.pyc
打开exchang.py是两千多行的汇编(数据未截完),我们也可以看出作者是用python2.7编写的
对这些chr数据主要是ROT_TWO和BINARY_ADD 两个操作,使用dis这个库对数据进行试验我们可以发现ROT_TWO交换栈顶与后面位置的数据,BINARY_ADD相加栈顶与后面位置数据,然后把相加后的数据压栈到栈顶,意思就是把里面的字符按照操作出现的顺序进行排序
了解到汇编意思后,现在,我们把有效汇编代码保存到1.txt里(两千多行,截图略)
把编号前1000的字符提取出来吧
按照汇编代码的逻辑,对提取出来的字符串排序,我们截取}之前的字符串,找到}所在1.txt的631行
输出有点问题,flag内容乱的,这里的代码参考了:https://www.jianshu.com/p/0af911bb4046
将所有字符解密,flag依然乱码,原来在输出字符串时,if语句把空字符串过滤了。
修改代码,重新提取字符串
得到flag
附代码:
1 ''' 2 3 import re 4 5 with open("1.txt",'r') as f: 6 7 line = [] 8 9 for i in range(1000): 10 11 line.append(f.readline()) 12 13 list=[] 14 15 pat="(d*) " 16 17 for i in line: 18 19 if 'LOAD_CONST' in i: 20 21 text=re.compile(pat).findall(i) 22 23 for j in text: 24 25 list.append(j) 26 27 for i in list: 28 29 if(i==''): 30 31 print(" ") 32 33 else: 34 35 print(chr(int(i)),end='') 36 37 ''' 38 39 with open("1.txt",'r') as f: 40 41 line = [] 42 43 for i in range(958): 44 45 line.append(f.readline()) 46 47 def ROT_TWO(List): 48 49 a = List.pop() 50 51 b = List.pop() 52 53 List.append(a) 54 55 List.append(b) 56 57 return List 58 59 def BINARY_ADD(List): 60 61 a = List.pop() 62 63 b = List.pop() 64 65 List.append(b+a) 66 67 return List 68 69 cipher ="llaC em yP aht notriv lauhcamni !eac Ini npreterP tohty ntybdocese!!! ctihN{noy woc uoc naipmoa eldnur yP nnohttyb doceni euoy rb ria}!napwssro :dorWp gnssadrow...elP esa yrtaga .ni oD tonurbf etecro)= ." 70 71 cipher = list(cipher) 72 73 s =[] 74 75 j=0 76 77 for i in line: 78 79 if 'LOAD_CONST' in i and j < len(cipher): 80 81 s.append(cipher[j]) 82 83 j += 1 84 85 elif 'ROT_TWO' in i: 86 87 s = ROT_TWO(s) 88 89 elif 'BINARY_ADD' in i: 90 91 s = BINARY_ADD(s) 92 93 print (s)