这题非常棒,刚开始完全看不懂,看完wp后,豁然开朗,让我对reverse又有了新的了解。推荐阅读这个wp
重命名后的代码,逻辑就清楚了。
各段代码细节分析
逆向代码为:
s = open('out', mode='r').read() # print s crr = [] for i in s: crr.append(ord(i)) drr = [] drr.append(((crr[0]) >> 3) | (((crr[len(crr) - 1] & 0x7) << 5))) for i in range(len(crr) - 1): # drr.append((crr[i] << 5) & 0xff | (crr[i+1] >> 3)) drr.append(((crr[i] & 0x7) << 5) | (crr[i + 1] >> 3)) print drr
逆向代码为:
#上一步解密得到的数组 arr = [61, 133, 60, 104, 60, 62, 245, 67, 165, 61, 165, 51, 39, 62, 118, 245, 60, 245, 133, 118, 245, 104, 19, 245, 38, 38, 165, 133, 61, 245, 7, 169, 118, 29, 60, 45, 15, 104] #先跑出运算过程中每个位置的index index = 0 new_index_arr = [] while s[index]: new_index_arr.append(index) index = s[index] new_index_arr.append(index) print new_index_arr #用跑出来的过程index,恢复各位置 new_arr = [None] * 38 new_index_arr = [0, 22, 20, 19, 14, 17, 4, 30, 29, 28, 27, 36, 34, 33, 32, 31, 37, 35, 26, 25, 5, 24, 15, 23, 16, 13, 12, 8, 21, 11, 10, 18, 3, 2, 6, 9, 7, 1] tmp = arr[1] for i in range(len(new_index_arr) - 1, -1, -1): arr[new_index_arr[i]] = arr[new_index_arr[i - 1]] arr[0] = tmp
这步是统计各字符出现次数
逆向代码为:
fs = open('that_girl', mode='r') table = {} while True: c = fs.read(1) if not c: break s = c.lower() if s in table: table[s] += 1 else: table[s] = 1 print table flag = [] for i in arr: flag.append(list(table.keys())[list(table.values()).index(i)]) print "QCTF{%s}" % ''.join(flag)
总体代码:
s = open('out', mode='r').read() print(s) rep_data = [0, 22, 20, 19, 14, 17, 4, 30, 29, 28, 27, 36, 34, 33, 32, 31, 37, 35, 26, 25, 5, 24, 15, 23, 16, 13, 12, 8, 21, 11, 10, 18, 3, 2, 6, 9, 7, 1] data = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 104, 30, 15, 29, 169, 19, 38, 67, 60, 0, 20, 39, 28, 118, 165, 26, 0, 61, 51, 133, 45, 7, 34, 0, 62, 0, 0, 0, 0, 0, 0, 40, 71, 0, 0, 66, 245, 0, 0, 0, 97, 0] arr = [] brr = [] len_flag = len(s) # string to array for i in range(len_flag): arr.append(ord(s[i])) # reverse or temp = arr[len(arr) - 1] & 0x7 for i in range(len(arr)): brr.append((temp << 5) | (arr[i] >> 3)) temp = arr[i] & 0x7 # reverse replace tmp = brr[1] for i in range(len(rep_data) - 1, -1, -1): brr[rep_data[i]] = brr[rep_data[i - 1]] brr[0] = tmp arr = [] flag = '' for i in range(len(brr)): arr.append(data.index(brr[i])) s1 = '' s2 = '' for i in range(len(arr)): tmp = arr[i] if tmp == 46: s1 += '_' s2 += '_' if tmp == 48: s1 += '0' s2 += '0' if 10 <= tmp <= 36: s1 += chr(tmp + 55) if 10 <= tmp <= 36: s2 += chr(tmp + 87) print(s1) print(s2)