查看信息,python文件
动调了一下,该程序创建了一个线程来读入数据,而这个线程的代码应该是放在内存中直接执行的,本地看不到代码,很蛋疼
查了下可以用PyInstaller Extractor工具来解包,可以参考这个Python解包及反编译: PyInstaller Extractor+uncompyle6
解码完成后用16进制编辑器打开,如010,将login.pyc中的第一行替换为struct.pyc的第一行,然后找个在线pyc反编译
#! /usr/bin/env python 3.6 (3379)
#coding=utf-8
# Compiled at: 1995-09-27 11:18:56
#Powered by BugScaner
#http://tools.bugscaner.com/
#如果觉得不错,请分享给你朋友使用吧!
import sys
input1 = input('input something:')
if len(input1) != 14:
print('Wrong length!')
sys.exit()
code = []
for i in range(13):
code.append(ord(input1[i]) ^ ord(input1[i + 1]))
code.append(ord(input1[13]))
a1 = code[2]
a2 = code[1]
a3 = code[0]
a4 = code[3]
a5 = code[4]
a6 = code[5]
a7 = code[6]
a8 = code[7]
a9 = code[9]
a10 = code[8]
a11 = code[10]
a12 = code[11]
a13 = code[12]
a14 = code[13]
if (a1 * 88 + a2 * 67 + a3 * 65 - a4 * 5 + a5 * 43 + a6 * 89 + a7 * 25 + a8 * 13 - a9 * 36 + a10 * 15 + a11 * 11 + a12 * 47 - a13 * 60 + a14 * 29 == 22748) & (a1 * 89 + a2 * 7 + a3 * 12 - a4 * 25 + a5 * 41 + a6 * 23 + a7 * 20 - a8 * 66 + a9 * 31 + a10 * 8 + a11 * 2 - a12 * 41 - a13 * 39 + a14 * 17 == 7258) & (a1 * 28 + a2 * 35 + a3 * 16 - a4 * 65 + a5 * 53 + a6 * 39 + a7 * 27 + a8 * 15 - a9 * 33 + a10 * 13 + a11 * 101 + a12 * 90 - a13 * 34 + a14 * 23 == 26190) & (a1 * 23 + a2 * 34 + a3 * 35 - a4 * 59 + a5 * 49 + a6 * 81 + a7 * 25 + (a8 << 7) - a9 * 32 + a10 * 75 + a11 * 81 + a12 * 47 - a13 * 60 + a14 * 29 == 37136) & (a1 * 38 + a2 * 97 + a3 * 35 - a4 * 52 + a5 * 42 + a6 * 79 + a7 * 90 + a8 * 23 - a9 * 36 + a10 * 57 + a11 * 81 + a12 * 42 - a13 * 62 - a14 * 11 == 27915) & (a1 * 22 + a2 * 27 + a3 * 35 - a4 * 45 + a5 * 47 + a6 * 49 + a7 * 29 + a8 * 18 - a9 * 26 + a10 * 35 + a11 * 41 + a12 * 40 - a13 * 61 + a14 * 28 == 17298) & (a1 * 12 + a2 * 45 + a3 * 35 - a4 * 9 - a5 * 42 + a6 * 86 + a7 * 23 + a8 * 85 - a9 * 47 + a10 * 34 + a11 * 76 + a12 * 43 - a13 * 44 + a14 * 65 == 19875) & (a1 * 79 + a2 * 62 + a3 * 35 - a4 * 85 + a5 * 33 + a6 * 79 + a7 * 86 + a8 * 14 - a9 * 30 + a10 * 25 + a11 * 11 + a12 * 57 - a13 * 50 - a14 * 9 == 22784) & (a1 * 8 + a2 * 6 + a3 * 64 - a4 * 85 + a5 * 73 + a6 * 29 + a7 * 2 + a8 * 23 - a9 * 36 + a10 * 5 + a11 * 2 + a12 * 47 - a13 * 64 + a14 * 27 == 9710) & (a1 * 67 - a2 * 68 + a3 * 68 - a4 * 51 - a5 * 43 + a6 * 81 + a7 * 22 - a8 * 12 - a9 * 38 + a10 * 75 + a11 * 41 + a12 * 27 - a13 * 52 + a14 * 31 == 13376) & (a1 * 85 + a2 * 63 + a3 * 5 - a4 * 51 + a5 * 44 + a6 * 36 + a7 * 28 + a8 * 15 - a9 * 6 + a10 * 45 + a11 * 31 + a12 * 7 - a13 * 67 + a14 * 78 == 24065) & (a1 * 47 + a2 * 64 + a3 * 66 - a4 * 5 + a5 * 43 + a6 * 112 + a7 * 25 + a8 * 13 - a9 * 35 + a10 * 95 + a11 * 21 + a12 * 43 - a13 * 61 + a14 * 20 == 27687) & (a1 * 89 + a2 * 67 + a3 * 85 - a4 * 25 + a5 * 49 + a6 * 89 + a7 * 23 + a8 * 56 - a9 * 92 + a10 * 14 + a11 * 89 + a12 * 47 - a13 * 61 - a14 * 29 == 29250) & (a1 * 95 + a2 * 34 + a3 * 62 - a4 * 9 - a5 * 43 + a6 * 83 + a7 * 25 + a8 * 12 - a9 * 36 + a10 * 16 + a11 * 51 + a12 * 47 - a13 * 60 - a14 * 24 == 15317):
print('flag is GWHT{md5(your_input)}')
print('Congratulations and have fun!')
else:
print('Sorry,plz try again...')
随便用个word做个替换,将a1-a14替换成code[]这样z3变量命名方便点
替换完成后是这样的
code[2] * 88 + code[1] * 67 + code[0] * 65 - code[3] * 5 + code[4] * 43 + code[5] * 89 + code[6] * 25 + code[7] * 13 - code[9] * 36 + code[8] * 15 + code[10] * 11 + code[11] * 47 - code[12] * 60 + code[13] * 29 == 22748
code[2] * 89 + code[1] * 7 + code[0] * 12 - code[3] * 25 + code[4] * 41 + code[5] * 23 + code[6] * 20 - code[7] * 66 + code[9] * 31 + code[8] * 8 + code[10] * 2 - code[11] * 41 - code[12] * 39 + code[13] * 17 == 7258
code[2] * 28 + code[1] * 35 + code[0] * 16 - code[3] * 65 + code[4] * 53 + code[5] * 39 + code[6] * 27 + code[7] * 15 - code[9] * 33 + code[8] * 13 + code[10] * 101 + code[11] * 90 - code[12] * 34 + code[13] * 23 == 26190
code[2] * 23 + code[1] * 34 + code[0] * 35 - code[3] * 59 + code[4] * 49 + code[5] * 81 + code[6] * 25 + (code[7] << 7) - code[9] * 32 + code[8] * 75 + code[10] * 81 + code[11] * 47 - code[12] * 60 + code[13] * 29 == 37136
code[2] * 38 + code[1] * 97 + code[0] * 35 - code[3] * 52 + code[4] * 42 + code[5] * 79 + code[6] * 90 + code[7] * 23 - code[9] * 36 + code[8] * 57 + code[10] * 81 + code[11] * 42 - code[12] * 62 - code[13] * 11 == 27915
code[2] * 22 + code[1] * 27 + code[0] * 35 - code[3] * 45 + code[4] * 47 + code[5] * 49 + code[6] * 29 + code[7] * 18 - code[9] * 26 + code[8] * 35 + code[10] * 41 + code[11] * 40 - code[12] * 61 + code[13] * 28 == 17298
code[2] * 12 + code[1] * 45 + code[0] * 35 - code[3] * 9 - code[4] * 42 + code[5] * 86 + code[6] * 23 + code[7] * 85 - code[9] * 47 + code[8] * 34 + code[10] * 76 + code[11] * 43 - code[12] * 44 + code[13] * 65 == 19875
code[2] * 79 + code[1] * 62 + code[0] * 35 - code[3] * 85 + code[4] * 33 + code[5] * 79 + code[6] * 86 + code[7] * 14 - code[9] * 30 + code[8] * 25 + code[10] * 11 + code[11] * 57 - code[12] * 50 - code[13] * 9 == 22784
code[2] * 8 + code[1] * 6 + code[0] * 64 - code[3] * 85 + code[4] * 73 + code[5] * 29 + code[6] * 2 + code[7] * 23 - code[9] * 36 + code[8] * 5 + code[10] * 2 + code[11] * 47 - code[12] * 64 + code[13] * 27 == 9710
code[2] * 67 - code[1] * 68 + code[0] * 68 - code[3] * 51 - code[4] * 43 + code[5] * 81 + code[6] * 22 - code[7] * 12 - code[9] * 38 + code[8] * 75 + code[10] * 41 + code[11] * 27 - code[12] * 52 + code[13] * 31 == 13376
code[2] * 85 + code[1] * 63 + code[0] * 5 - code[3] * 51 + code[4] * 44 + code[5] * 36 + code[6] * 28 + code[7] * 15 - code[9] * 6 + code[8] * 45 + code[10] * 31 + code[11] * 7 - code[12] * 67 + code[13] * 78 == 24065
code[2] * 47 + code[1] * 64 + code[0] * 66 - code[3] * 5 + code[4] * 43 + code[5] * 112 + code[6] * 25 + code[7] * 13 - code[9] * 35 + code[8] * 95 + code[10] * 21 + code[11] * 43 - code[12] * 61 + code[13] * 20 == 27687
code[2] * 89 + code[1] * 67 + code[0] * 85 - code[3] * 25 + code[4] * 49 + code[5] * 89 + code[6] * 23 + code[7] * 56 - code[9] * 92 + code[8] * 14 + code[10] * 89 + code[11] * 47 - code[12] * 61 - code[13] * 29 == 29250
code[2] * 95 + code[1] * 34 + code[0] * 62 - code[3] * 9 - code[4] * 43 + code[5] * 83 + code[6] * 25 + code[7] * 12 - code[9] * 36 + code[8] * 16 + code[10] * 51 + code[11] * 47 - code[12] * 60 - code[13] * 24 == 15317
解题脚本
from z3 import *
import hashlib
s = Solver()
code = [Int((b'code%d'% i)) for i in range(14) ]
s.add(code[2] * 88 + code[1] * 67 + code[0] * 65 - code[3] * 5 + code[4] * 43 + code[5] * 89 + code[6] * 25 + code[7] * 13 - code[9] * 36 + code[8] * 15 + code[10] * 11 + code[11] * 47 - code[12] * 60 + code[13] * 29 == 22748)
s.add(code[2] * 89 + code[1] * 7 + code[0] * 12 - code[3] * 25 + code[4] * 41 + code[5] * 23 + code[6] * 20 - code[7] * 66 + code[9] * 31 + code[8] * 8 + code[10] * 2 - code[11] * 41 - code[12] * 39 + code[13] * 17 == 7258)
s.add(code[2] * 28 + code[1] * 35 + code[0] * 16 - code[3] * 65 + code[4] * 53 + code[5] * 39 + code[6] * 27 + code[7] * 15 - code[9] * 33 + code[8] * 13 + code[10] * 101 + code[11] * 90 - code[12] * 34 + code[13] * 23 == 26190)
s.add(code[2] * 23 + code[1] * 34 + code[0] * 35 - code[3] * 59 + code[4] * 49 + code[5] * 81 + code[6] * 25 + (code[7] * 128) - code[9] * 32 + code[8] * 75 + code[10] * 81 + code[11] * 47 - code[12] * 60 + code[13] * 29 == 37136)
s.add(code[2] * 38 + code[1] * 97 + code[0] * 35 - code[3] * 52 + code[4] * 42 + code[5] * 79 + code[6] * 90 + code[7] * 23 - code[9] * 36 + code[8] * 57 + code[10] * 81 + code[11] * 42 - code[12] * 62 - code[13] * 11 == 27915)
s.add(code[2] * 22 + code[1] * 27 + code[0] * 35 - code[3] * 45 + code[4] * 47 + code[5] * 49 + code[6] * 29 + code[7] * 18 - code[9] * 26 + code[8] * 35 + code[10] * 41 + code[11] * 40 - code[12] * 61 + code[13] * 28 == 17298)
s.add(code[2] * 12 + code[1] * 45 + code[0] * 35 - code[3] * 9 - code[4] * 42 + code[5] * 86 + code[6] * 23 + code[7] * 85 - code[9] * 47 + code[8] * 34 + code[10] * 76 + code[11] * 43 - code[12] * 44 + code[13] * 65 == 19875)
s.add(code[2] * 79 + code[1] * 62 + code[0] * 35 - code[3] * 85 + code[4] * 33 + code[5] * 79 + code[6] * 86 + code[7] * 14 - code[9] * 30 + code[8] * 25 + code[10] * 11 + code[11] * 57 - code[12] * 50 - code[13] * 9 == 22784)
s.add(code[2] * 8 + code[1] * 6 + code[0] * 64 - code[3] * 85 + code[4] * 73 + code[5] * 29 + code[6] * 2 + code[7] * 23 - code[9] * 36 + code[8] * 5 + code[10] * 2 + code[11] * 47 - code[12] * 64 + code[13] * 27 == 9710)
s.add(code[2] * 67 - code[1] * 68 + code[0] * 68 - code[3] * 51 - code[4] * 43 + code[5] * 81 + code[6] * 22 - code[7] * 12 - code[9] * 38 + code[8] * 75 + code[10] * 41 + code[11] * 27 - code[12] * 52 + code[13] * 31 == 13376)
s.add(code[2] * 85 + code[1] * 63 + code[0] * 5 - code[3] * 51 + code[4] * 44 + code[5] * 36 + code[6] * 28 + code[7] * 15 - code[9] * 6 + code[8] * 45 + code[10] * 31 + code[11] * 7 - code[12] * 67 + code[13] * 78 == 24065)
s.add(code[2] * 47 + code[1] * 64 + code[0] * 66 - code[3] * 5 + code[4] * 43 + code[5] * 112 + code[6] * 25 + code[7] * 13 - code[9] * 35 + code[8] * 95 + code[10] * 21 + code[11] * 43 - code[12] * 61 + code[13] * 20 == 27687)
s.add(code[2] * 89 + code[1] * 67 + code[0] * 85 - code[3] * 25 + code[4] * 49 + code[5] * 89 + code[6] * 23 + code[7] * 56 - code[9] * 92 + code[8] * 14 + code[10] * 89 + code[11] * 47 - code[12] * 61 - code[13] * 29 == 29250)
s.add(code[2] * 95 + code[1] * 34 + code[0] * 62 - code[3] * 9 - code[4] * 43 + code[5] * 83 + code[6] * 25 + code[7] * 12 - code[9] * 36 + code[8] * 16 + code[10] * 51 + code[11] * 47 - code[12] * 60 - code[13] * 24 == 15317)
s.check()
m = s.model()
flag = [int(str(m[code[i]])) for i in range(14)]
print(flag)
for i in range(12,-1,-1):
flag[i] = flag[i] ^ flag[i+1]
for i in range(14):
print(chr(flag[i]),end='')
print(hashlib.md5(bytes(flag)).hexdigest())
结果,最终flag: flag{58964088b637e50d3a22b9510c1d1ef8}
[10, 24, 119, 7, 104, 43, 28, 91, 108, 52, 88, 74, 88, 33]
U_G07_th3_k3y!58964088b637e50d3a22b9510c1d1ef8