首页
社区
课程
招聘
[原创]羊城杯ctf部分wp
发表于: 2020-9-12 18:43 8197

[原创]羊城杯ctf部分wp

2020-9-12 18:43
8197

re

login

python打包的exe

 

提取出来python源文件如下:

# uncompyle6 version 3.6.6
# Python bytecode 3.6 (3379)
# Decompiled from: Python 3.7.3 (v3.7.3:ef4ec6ed12, Mar 25 2019, 22:22:05) [MSC v.1916 64 bit (AMD64)]
# Embedded file name: login.py
# Compiled at: 1995-09-28 00:18:56
# Size of source mod 2**32: 257 bytes
import sys
input1 = input('input something:')
if len(input1) != 14:
    print('Wrong length!')
    sys.exit()
else:
    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...')
# okay decompiling login.pyc

z3求解后逐个异或回来即可:

from z3 import *
code = [BitVec('x%d'%i, 16) for i in range(14)]
x = [code[i] for i in range(14)]
s = Solver()
for i in range(14):
    s.add(code[i] < 500)
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] << 7) - 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)
answer=s.check()
print(answer)
if answer==sat:
    print(s.model())
    m=s.model()
    flag = []
    for i in x:
        flag.append(m[i].as_long())
    print(flag)
from hashlib import md5
res=flag
# print(chr(33),end="")
for i in range(13,-1,-1):
    print(chr(res[i]),end="")
    if i>0:
        res[i-1]^=res[i]
print()
res="!y3k_3ht_70G_U"[::-1]
s = md5(res.encode()).hexdigest()
print(s)

bytecode

直接分析python字节码

 

前5个字符验证flag格式”GWHT{“

 

中间26个字符由数据异或得到

 

最后6个字符z3解方程即可

 

最后的解题脚本:

from z3 import *
code = [BitVec('x%d'%i, 8) for i in range(6)]
xx = [code[i] for i in range(6)]
s = Solver()
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]
print(len(en),len(output))
print("\xe2\x80\xa6\xe2\x80\xa6")
head=list(map(ord,"GWHT{"))
print(head)
print(((((head[0]*2020)+head[1])*2020+head[2])*2020+head[3])*2020+head[4])
x=[]
k=5
for i in range(13):
    b=output[2*i]
    c=output[2*i+1]
    a11=c^en[i%6]
    a22=b^en[i%6]
    x.append(a11)
    x.append(a22)
print("".join(list(map(chr,x))),end="")
# print(len("cfa2b87b3f746a8f0ac5c5963f"))
print("aeff73")
s.add(code[0]*3+code[1]*2+code[2]*5==1003)
s.add(code[0]*4+code[1]*7+code[2]*9==2013)
s.add(code[0]+code[1]*8+code[2]*2==1109)
s.add(code[3]*3+code[4]*2+code[5]*5==671)
s.add(code[3]*4+code[4]*7+code[5]*9==1252)
s.add(code[3]+code[4]*8+code[5]*2==644)
answer=s.check()
print(answer)
if answer==sat:
    print(s.model())
    m=s.model()
    flag = ""
    for i in xx:
        flag+=chr(m[i].as_long())
    print(flag)

babyre

首先是一个des,cbc模式的加密,输入的为明文

 

拿到密文和key直接求解即可:

from Crypto.Cipher import DES
key = b"\xAD\x52\xF2\x4C\xE3\x2C\x20\xD6"    # 8个字节
des = DES.new(key, iv = b"\x00"*8, mode=DES.MODE_CBC)
res=[0x0A, 0xF4, 0xEE, 0xC8, 0x42, 0x8A, 0x9B, 0xDB, 0xA2, 0x26, 0x6F, 0xEE, 0xEE, 0xE0, 0xD8, 0xA2]
print(des.decrypt(bytes(res)))

得到字符串“th1s1sth3n1c3k3y”

 

加下来是一个aes加密,ecb模式的,key为“th1s1sth3n1c3k3y”,我们输入的字符串为32字节

 

得到的密文,首先自身进行可逆的异或

 

然后再不可逆的生成31字节的数据,这里有多解,需要爆破,一开始用z3,求出来的都不对

 

爆破得到的数据逆运算后由字符串“GWHT{”开始的即为正确答案

 

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 2
支持
分享
最新回复 (3)
雪    币: 56063
活跃值: (21210)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
2

感谢分享!
将题目附件(若有的话)上传论坛一份?

最后于 2020-9-12 18:58 被kanxue编辑 ,原因:
2020-9-12 18:58
0
雪    币: 986
活跃值: (6207)
能力值: ( LV7,RANK:115 )
在线值:
发帖
回帖
粉丝
3
kanxue 感谢分享!将题目附件(若有的话)上传论坛一份?
题目主办方会开源,过两天会附上开源地址
2020-9-12 19:57
0
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
4
求开源地址
2020-9-18 15:19
0
游客
登录 | 注册 方可回帖
返回