X-CTF(REVERSE高级) handcrafted-pyc

第一次用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相加栈顶与后面位置数据,然后把相加后的数据压栈到栈顶,意思就是把里面的字符按照操作出现的顺序进行排序


ROT_TWO交换a,b数据

BINARY_ADD相加a,b数据

了解到汇编意思后,现在,我们把有效汇编代码保存到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)
原文地址:https://www.cnblogs.com/blackicelisa/p/12263648.html