看图标是个python程序,ida打开果然是python程序,用python_exe_unpacker.py解包
在目录里用010打开login和struct将struct开头E3前的部分插入到login头部,然后改名这login.pyc
在线转为原码
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 (...... 多好算式 ):
print('flag is GWHT{md5(your_input)}')
print('Congratulations and have fun!')
else:
print('Sorry,plz try again...')
加密规则:
- 前一个用后一个异或
- 一个运算
- flag是md5
算式这块直接用z3求解
from z3 import *
code = [Int(f'code[{i}]') for i in range(14)]
s = Solver()
#for i in range(14):
#s.add(code[i] > 0x20)
#s.add(code[i] < 0x7f)
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)
flag = []
if s.check()==sat:
d = s.model()
print(d[code[0]])
flag = [int(str(d[code[i]])) for i in range(14)]
print(flag)
for i in range(12,-1,-1):
flag[i] ^= flag[i+1]
print(bytes(flag))
#U_G07_th3_k3y!
from hashlib import md5
print('flag{'+ md5(bytes(flag)).hexdigest() + '}')
#flag{58964088b637e50d3a22b9510c1d1ef8}


![[buuctf.reverse] 070 [buuctf.reverse] 070](http://www.mshxw.com/aiimages/31/876131.png)
