login 进来看到
这个图像,才写了一个 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 import sysinput1 = 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 hashlibfrom 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)
然后md5解密
Bytecode 是一个python字节码
慢慢分析
这里是 定义
这里是判断长度
上面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 = [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 ] welcome_message = 'welcome to GWHT2020' print (welcome_message)flag = input ('please input your flag: ' ) str = flaga = len (str ) if a < 38 : print ('lenth wrong!' ) exit(0 )
这个就说明了flag长度是38
这一段是一个累加判断
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 for i in range (13 ): b = ord (str (k)) c = ord (str (k + 1 )) a11 = en[i % 6 ] ^ c[i % 6 ] a22 = en[i % 6 ] ^ b[i % 6 ] x.append(a11) x.append(a22) k += 2 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 = "" 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)
最后一段:
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 = len (str ) a1 = ord (str [l - 7 ]) a2 = ord (str [l - 6 ]) a3 = ord (str [l - 5 ]) a4 = ord (str [l - 4 ]) a5 = ord (str [l - 3 ]) 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()) a = "" a +=chr (97 ) a +=chr (101 ) a +=chr (102 ) a +=chr (102 ) a +=chr (55 ) a +=chr (51 ) print (a)
最后的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解密: