login

进来看到

image-20230924010344611

这个图像,才写了一个 exe打包python文件的题。

参考:https://www.zmypb.top/2023/09/22/%E6%AF%94%E8%B5%9B%E5%A4%8D%E7%8E%B0-ctfshow-%E5%86%85%E9%83%A8%E8%B5%9B/

中的“来一个派森”

得到python文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#!/usr/bin/env python
# visit https://tool.lu/pyc/ for more information
# Version: Python 3.6

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...')

简单的使用z3求解器就能得出答案:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
import hashlib

from z3 import *
s = Solver()
a1 = Int('a1')
a2 = Int('a2')
a3 = Int('a3')
a4 = Int('a4')
a5 = Int('a5')
a6 = Int('a6')
a7 = Int('a7')
a8 = Int('a8')
a9 = Int('a9')
a10 = Int('a10')
a11 = Int('a11')
a12 = Int('a12')
a13 = Int('a13')
a14 = Int('a14')
s.add(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)
s.add(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)
s.add(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)
s.add(a1*23 + a2*34 + a3*35 - a4*59 + a5*49 + a6 * 81 + a7*25+ a8*128- a9*32
+a10*75 + a11*81 + a12*47 - a13*60 + a14*29== 37136)
s.add(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)
s.add(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)
s.add(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)
s.add(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)
s.add(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)
s.add(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)
s.add(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)
s.add(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)
s.add(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)
s.add(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)
if s.check() == sat:
result = s.model()
print(result)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
[a13 = 88,
a3 = 10,
a4 = 7,
a10 = 108,
a12 = 74,
a1 = 119,
a7 = 28,
a6 = 43,
a9 = 52,
a14 = 33,
a5 = 104,
a8 = 91,
a2 = 24,
a11 = 88]

还有一个简单的xor

1
2
3
4
5
6
7
8
9
10
code = [10,24,119,7,104,43,28,91,108,52,88,74,88,33]
flag = ""
for i in range(13,0,-1):
code[i-1] = code[i]^code[i-1]
flag += chr(code[i-1])
flag = flag[::-1]
flag += chr(33)
print(flag)

#U!G!7!t!3!k!y!3!_!h!_!0!_!

然后md5解密

Bytecode

是一个python字节码

慢慢分析

image-20230922191807652

这里是 定义

image-20230922191856583

这里是判断长度

上面2个写出来差不多是:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# 创建一个名为en的列表,包含一组常量值
en = [3, 37, 72, 9, 6, 132]

# 创建一个名为output的列表,包含另一组常量值
output = [101, 96, 23, 68, 112, 42, 107, 62, 96, 53, 176, 179, 98, 53, 67, 29, 41, 120, 60, 106, 51, 101, 178, 189, 101, 48]

# 加载常量 'welcome to GWHT2020'
welcome_message = 'welcome to GWHT2020'

# 打印欢迎消息
print(welcome_message)

# 使用 raw_input 函数获取用户输入的字符串,并将其存储在变量 flag 中
flag = input('please input your flag: ')

# 复制 flag 的值到变量 str
str = flag

# 使用 len 函数计算字符串的长度并将结果存储在变量 a 中
a = len(str)

# 检查字符串长度是否小于 38
if a < 38:
print('lenth wrong!')
exit(0)

这个就说明了flag长度是38

image-20230922191952459

这一段是一个累加判断

1
2
3
4
5
6
7
for i in range(5):
char = s[i]
char_ascii = ord(char)
result += char_ascii * 2020

if result == 1182843538814603:
return True

差不多就是这个意思

这个是前5个【其实更具题目猜测前五个是:GWHT{】

第二段是:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# 创建一个空列表
x = []

# 设置变量k为5
k = 5

# 进入一个循环,迭代范围是0到13
for i in range(13):
# 获取字符串中k位置的字符的ASCII码值,存储在变量b中
b = ord(str(k))

# 获取字符串中k+1位置的字符的ASCII码值,存储在变量c中
c = ord(str(k + 1))

# 计算a11 = (c[i % 6] ^ en[i % 6])
a11 = en[i % 6] ^ c[i % 6]

# 计算a22 = (b[i % 6] ^ en[i % 6])
a22 = en[i % 6] ^ b[i % 6]

# 将a11追加到列表x中
x.append(a11)

# 将a22追加到列表x中
x.append(a22)

# 将k增加2
k += 2

# 检查列表x是否等于另一个名为output的列表
if x == output:
# 如果相等,执行一些操作
pass

这里要注意的是output的第一个算出来的是flag的第二个

flag第一个位置

1
2
3
4
5
6
7
8
9
10
11
12
13
en = [3, 37, 72, 9, 6, 132]
output = [101, 96, 23, 68, 112, 42, 107, 62, 96, 53, 176, 179, 98, 53, 67, 29, 41, 120, 60, 106, 51, 101, 178, 189, 101, 48]

k = 0#这里是求flag的第二段,虽然代码里面是5,但是是一样的因为我们求的是flag的第二段。
flag = ""
for i in range(13):
a1=en[i%6]^output[k+1]
flag +=chr(a1)
a2 = en[i%6]^output[k]
flag += chr(a2)
k = k+2
print(flag)
#cfa2b87b3f746a8f0ac5c5963f

最后一段:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# 获取字符串的长度并存储在变量l中
l = len(str)

# 计算a1 = ord(str[l - 7])
a1 = ord(str[l - 7])

# 计算a2 = ord(str[l - 6])
a2 = ord(str[l - 6])

# 计算a3 = ord(str[l - 5])
a3 = ord(str[l - 5])

# 计算a4 = ord(str[l - 4])
a4 = ord(str[l - 4])

# 计算a5 = ord(str[l - 3])
a5 = ord(str[l - 3])

# 计算a6 = ord(str[l - 2])
a6 = ord(str[l - 2])

# 检查一系列条件
if (
a1 * 3 + a2 * 2 + a3 * 5 == 1003 and
a1 * 4 + a2 * 7 + a3 * 9 == 2013 and
a1 * 8 + a2 * 2 + a3 * 1109 == 1109 and
a4 * 3 + a5 * 2 + a6 * 5 == 671 and
a4 * 4 + a5 * 7 + a6 * 9 == 1252 and
a4 * 8 + a5 * 2 + a6 * 644 == 644
):
# 如果所有条件都满足,执行一些操作
pass

这里就 用z3来求解了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
from z3 import *
flag = [Int('flag[%d]' % i) for i in range(8)]
s = Solver()
s.add(flag[0]*3 + flag[1]*2 + flag[2]*5 == 1003)
s.add(flag[0]*4 + flag[1]*7 + flag[2]*9 == 2013)
s.add(flag[0] + flag[1]*8 + flag[2]*2 == 1109)
s.add(flag[3]*3 + flag[4]*2 + flag[5]*5 == 671)
s.add(flag[3]*4 + flag[4]*7 + flag[5]*9 == 1252)
s.add(flag[3] + flag[4]*8 + flag[5]*2 == 644)

if s.check() == sat:
print("ok")
print(s.model())

# [flag[1] = 101,
# flag[4] = 55,
# flag[2] = 102,
# flag[5] = 51,
# flag[3] = 102,
# flag[0] = 97]
a = ""
a +=chr(97)
a +=chr(101)
a +=chr(102)
a +=chr(102)
a +=chr(55)
a +=chr(51)

print(a)
#aeff73

最后的flag:GWHT{cfa2b87b3f746a8f0ac5c5963faeff73}

easyre

这个蛮简单的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# 导入string模块

import string


# 定义左移3位的函数

def shift_left_3(input_str):
lower_letters = string.ascii_lowercase
upper_letters = string.ascii_uppercase
digits = string.digits

​ shifted_str = ""
​ for char in input_str:
​ if char in lower_letters:
​ shifted_str += lower_letters[(lower_letters.index(char) - 3) % len(lower_letters)]
​ elif char in upper_letters:
​ shifted_str += upper_letters[(upper_letters.index(char) - 3) % len(upper_letters)]
​ elif char in digits:
​ shifted_str += digits[(digits.index(char) - 3) % len(digits)]
​ else:
​ shifted_str += char
​ return shifted_str

# 测试

print(shift_left_3("EmBmP5Pmn7QcPU4gLYKv5QcMmB3PWHcP5YkPq3=cT6QckkPckoRG"))
#BjYjM2Mjk4NzMR1dIVHs2NzJjY0MTEzM2VhMn0=zQ3NzhhMzhlOD

手动对他位移

BjYjM2Mjk4NzM

R1dIVHs2NzJjY

0MTEzM2VhMn0=

zQ3NzhhMzhlOD

:

R1dIVHs2NzJjYzQ3NzhhMzhlODBjYjM2Mjk4NzM0MTEzM2VhMn0=

然后再去base64解密:

image-20230922211959126