首页
社区
课程
招聘
[原创]buuctf-re
发表于: 2025-7-22 23:59 2922

[原创]buuctf-re

2025-7-22 23:59
2922

是python语言,把exe文件变成.pyc文件,之后转成py文件

PyInstaller Extractor WEB

在线Python pyc文件编译与反编译

login.pyc文件

进去,逻辑是输入14位字符,让后每一位和后一位进行异或存入code中之后打乱存入ai中最后方程式验证,所以我们可以z3约束器解一下,让后反着写出对应代码即可

z3,(注意把第三行的(a8 << 7))变成了(a8 *128)

a1 = 119
a2 = 24
a3 = 10
a4 = 7
a5 = 104
a6 = 43
a7 = 28
a8 = 91
a9 = 52
a10 = 108
a11 = 88
a12 = 74
a13 = 88
a14 = 33

最后找一下md5即可flag{58964088b637e50d3a22b9510c1d1ef8}

c++代码,直接分析代码

输入处理

异或加密

这里的密钥需要动态调试查看数据

分组处理

逻辑运算校验

v20 中的数据进行复杂的逻辑运算(AND、OR、NOT、XOR)。

校验以下等式是否成立:

这里可以用z3求解器,无非是前面的四组数据的变换

反调试

我们可以在动态调试的时候修改代码逻辑

输出结果

所以先找到对应的数据,让后动态调试拿到密钥,之后逐位异或即可

输入数据拿到密钥,ida这里的是dq是8位的,我们需要一位的db字符,可以

图片描述

按一下键盘上的 d 是一个 循环切换数据定义大小 的快捷键,可以在这几个数据的定义方式之间切换,也可以跟进查看具体的数据,其结果是

i_will_check_is_debug_or_not

之后修改一下变量名

图片描述

a = v18[2];
b = v18[1];
c = *v18;
d = operator new(0x20ui64);

v22 = b & c;
*d = b & c;
v23 = a & *v18 & v29 | 0xC00020130082C0Ci64)

最终得到这几个方程式,z3跑一下

a & c & a | 0xC00020130082C0Ci64)

这里需要用BitVec类型是符号位向量类型,用于表示固定长度的二进制整数数据

[c = 4483973367147818765,
a = 577031497978884115,
b = 864693332579200012,
d = 842073600]

我这里是把a和c的顺序搞反了,细节!

图片描述

之后拼接成字符串让后逐位异或即可

flag = [0x3E, 0x3A, 0x46, 0x05, 0x33, 0x28, 0x6F, 0x0D, 0x0C, 0x00, 0x02, 0x01, 0x30, 0x08, 0x2C, 0x0C, 0x08, 0x02, 0x07, 0x17, 0x15, 0x3E, 0x30, 0x13, 0x32, 0x31, 0x06]
We1l_D0ndeajoa_Slgebra_am_i

由于出题的原因,

最后的答案是flag{We1l_D0ne!P0or_algebra_am_i}

[buuctf--2019红帽杯]xx_buuctf [2019红帽杯]xx-CSDN博客

c++代码,下断点跑一下程序

输入长度为19

字符检查,确保输入的前四位字符是在Code当中的数据

注意区分浅色的Code是我们输入的flag,变量名Code才是验证用的Code

qwertyuiopasdfghjklzxcvbnm1234567890

加密函数sub_7FF7BB451AB0

有一个v30

v30 的剩余部分(从 v15 + 1 到 16)置零。

由于题目中输入的格式是 flag{...}

所以v30结果是v30是输入的前4位,加后面的12个'0'

sub_7FF7BB451AB0Code做某种变换,返回结果v19,长度为 Size

看着像TEA,并且看到了0x61C88647数据是0x9E3779B9 的补码

最后证明是XXTEA

所以我们要知道密文v19和密钥v30,

重排字节,固定重排表

异或混淆

这里的逻辑是v20与自身异或得到

逆向代码

最后得到的数据v20注意小段序,

0xCE, 0xBC, 0x40, 0x6B, 0x7C, 0x3A, 0x95, 0xC0,
0xEF, 0x9B, 0x20, 0x20, 0x91, 0xF7, 0x02, 0x35,
0x23, 0x18, 0x02, 0xC8, 0xE7, 0x56, 0x56, 0xFA

写代码解决

C:\Users\21901\PycharmProjects\pythonProject.venv\Scripts\python.exe C:\Users\21901\PycharmProjects\pythonProject\222.py
[206, 188, 64, 165, 178, 244, 231, 178, 157, 169, 18, 18, 200, 174, 91, 16, 6, 61, 29, 215, 248, 220, 220, 112]
[188, 165, 206, 64, 244, 178, 178, 231, 169, 18, 157, 18, 174, 16, 200, 91, 61, 215, 6, 29, 220, 112, 248, 220]
flag
b'flag{CXX_and_++tea}\x00\x13\x00\x00\x00'

进程已结束,退出代码为 0

flag{CXX_and_++tea}

# Visit 93dK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6%4N6%4N6Q4x3X3g2D9k6r3c8Y4L8#2)9J5k6h3&6W2N6q4)9J5c8Y4y4@1M7X3W2F1k6#2)9J5c8Y4m8&6j5#2)9J5k6r3y4G2L8i4m8A6L8r3g2Q4x3X3c8V1k6h3y4G2L8i4m8A6L8r3f1`. 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...')
# Visit 9a5K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6%4N6%4N6Q4x3X3g2D9k6r3c8Y4L8#2)9J5k6h3&6W2N6q4)9J5c8Y4y4@1M7X3W2F1k6#2)9J5c8Y4m8&6j5#2)9J5k6r3y4G2L8i4m8A6L8r3g2Q4x3X3c8V1k6h3y4G2L8i4m8A6L8r3f1`. 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...')
from z3 import *
 
# 定义变量
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 = Solver()
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:
    m = s.model()
    for i in range(1, 15):
        print(f"a{i} = {m[eval(f'a{i}')]}")
else:
    print("No solution")
from z3 import *
 
# 定义变量
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 = Solver()
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:
    m = s.model()
    for i in range(1, 15):
        print(f"a{i} = {m[eval(f'a{i}')]}")
else:
    print("No solution")
#include<stdio.h>
 
int main(){
    int code[14]={10,24,119,7,104,43,28,91,108,52,88,74,88,33};
    int i;
    for(i=12;i>=0;i--){
        code[i]=code[i]^code[i+1];
    }
    for(i=0;i<14;i++){
        printf("%c",code[i]);
    }
    //U_G07_th3_k3y!
    return 0;
}
#include<stdio.h>
 
int main(){
    int code[14]={10,24,119,7,104,43,28,91,108,52,88,74,88,33};
    int i;
    for(i=12;i>=0;i--){
        code[i]=code[i]^code[i+1];
    }
    for(i=0;i<14;i++){
        printf("%c",code[i]);
    }
    //U_G07_th3_k3y!
    return 0;
}
int __fastcall main(int argc, const char **argv, const char **envp)
{
  bool v3; // si
  __int64 v4; // rax
  __int64 v5; // r8
  __int64 v6; // r8
  unsigned __int8 *v7; // rax
  unsigned __int8 *v8; // rbx
  int v9; // r10d
  __int64 v10; // r11
  void **v11; // r9
  void **v12; // r8
  __int64 v13; // rdi
  __int64 v14; // r15
  __int64 v15; // r12
  __int64 v16; // rbp
  int v17; // ecx
  unsigned __int8 *v18; // rdx
  __int64 v19; // rdi
  __int64 *v20; // r14
  __int64 v21; // rbp
  __int64 v22; // r13
  __int64 *v23; // rdi
  __int64 v24; // r8
  __int64 v25; // r12
  __int64 v26; // r15
  __int64 v27; // rbp
  __int64 v28; // rdx
  __int64 v29; // rbp
  __int64 v30; // rbp
  __int64 v31; // r10
  __int64 v32; // rdi
  __int64 v33; // r8
  bool v34; // dl
  __int64 v35; // rax
  void **v36; // rdx
  __int64 v37; // rax
  __int64 v38; // r8
  __int64 v39; // rax
  void *v40; // rcx
  __int64 v42; // [rsp+20h] [rbp-68h]
  void *Block[2]; // [rsp+30h] [rbp-58h] BYREF
  unsigned __int64 v44; // [rsp+40h] [rbp-48h]
  unsigned __int64 v45; // [rsp+48h] [rbp-40h]
 
  v3 = 0;
  v44 = 0i64;
  v45 = 15i64;
  LOBYTE(Block[0]) = 0;
  v4 = sub_1400019C0(std::cout, "I'm a first timer of Logic algebra , how about you?", envp);
  std::ostream::operator<<(v4, sub_140001B90);
  sub_1400019C0(std::cout, "Let's start our game,Please input your flag:", v5);
  sub_140001DE0(std::cin, Block);
  std::ostream::operator<<(std::cout, sub_140001B90);
  if ( v44 - 5 > 25 )
  {
    v39 = sub_1400019C0(std::cout, "Wrong input ,no GXY{} in input words", v6);
    std::ostream::operator<<(v39, sub_140001B90);
    goto LABEL_43;
  }
  v7 = operator new(0x20ui64);
  v8 = v7;
  if ( v7 )
  {
    *v7 = 0i64;
    *(v7 + 1) = 0i64;
    *(v7 + 2) = 0i64;
    *(v7 + 3) = 0i64;
  }
  else
  {
    v8 = 0i64;
  }
  v9 = 0;
  if ( v44 )
  {
    v10 = 0i64;
    do
    {
      v11 = Block;
      if ( v45 >= 0x10 )
        v11 = Block[0];
      v12 = &qword_140006048;
      if ( qword_140006060 >= 16 )
        v12 = qword_140006048;
      v8[v10] = *(v11 + v10) ^ *(v12 + v9 % 27);
      ++v9;
      ++v10;
    }
    while ( v9 < v44 );
  }
  v13 = 0i64;
  v14 = 0i64;
  v15 = 0i64;
  v16 = 0i64;
  if ( v44 > 30 )
    goto LABEL_27;
  v17 = 0;
  if ( v44 <= 0 )
    goto LABEL_27;
  v18 = v8;
  do
  {
    v19 = *v18 + v13;
    ++v17;
    ++v18;
    switch ( v17 )
    {
      case 8:
        v16 = v19;
        goto LABEL_23;
      case 16:
        v15 = v19;
        goto LABEL_23;
      case 24:
        v14 = v19;
LABEL_23:
        v19 = 0i64;
        break;
      case 32:
        sub_1400019C0(std::cout, "ERRO,out of range", v44);
        exit(1);
    }
    v13 = v19 << 8;
  }
  while ( v17 < v44 );
  if ( v16 )
  {
    v20 = operator new(0x20ui64);
    *v20 = v16;
    v20[1] = v15;
    v20[2] = v14;
    v20[3] = v13;
    goto LABEL_28;
  }
LABEL_27:
  v20 = 0i64;
LABEL_28:
  v42 = v20[2];
  v21 = v20[1];
  v22 = *v20;
  v23 = operator new(0x20ui64);
  if ( IsDebuggerPresent() )
  {
    sub_1400019C0(std::cout, "Hi , DO not debug me !", v24);
    Sleep(0x7D0u);
    exit(0);
  }
  v25 = v21 & v22;
  *v23 = v21 & v22;
  v26 = v42 & ~v22;
  v23[1] = v26;
  v27 = ~v21;
  v28 = v42 & v27;
  v23[2] = v42 & v27;
  v29 = v22 & v27;
  v23[3] = v29;
  if ( v26 != 0x11204161012i64 )
  {
    v23[1] = 0i64;
    v26 = 0i64;
  }
  v30 = v26 | v25 | v28 | v29;
  v31 = v20[1];
  v32 = v20[2];
  v33 = v28 & *v20 | v32 & (v25 | v31 & ~*v20 | ~(v31 | *v20));
  v34 = 0;
  if ( v33 == 0x8020717153E3013i64 )
    v34 = v30 == 0x3E3A4717373E7F1Fi64;
  if ( (v30 ^ v20[3]) == 0x3E3A4717050F791Fi64 )
    v3 = v34;
  if ( (v26 | v25 | v31 & v32) == (~*v20 & v32 | 0xC00020130082C0Ci64) && v3 )
  {
    v35 = sub_1400019C0(std::cout, "Congratulations!flag is GXY{", v33);
    v36 = Block;
    if ( v45 >= 0x10 )
      v36 = Block[0];
    v37 = sub_140001FD0(v35, v36, v44);
    sub_1400019C0(v37, "}", v38);
    j_j_free(v8);
  }
  else
  {
    sub_1400019C0(std::cout, "Wrong answer!try again", v33);
    j_j_free(v8);
  }
LABEL_43:
  if ( v45 >= 0x10 )
  {
    v40 = Block[0];
    if ( v45 + 1 >= 0x1000 )
    {
      v40 = *(Block[0] - 1);
      if ( (Block[0] - v40 - 8) > 0x1F )
        invalid_parameter_noinfo_noreturn();
    }
    j_j_free(v40);
  }
  return 0;
}
int __fastcall main(int argc, const char **argv, const char **envp)
{
  bool v3; // si
  __int64 v4; // rax
  __int64 v5; // r8
  __int64 v6; // r8
  unsigned __int8 *v7; // rax
  unsigned __int8 *v8; // rbx
  int v9; // r10d
  __int64 v10; // r11
  void **v11; // r9
  void **v12; // r8
  __int64 v13; // rdi
  __int64 v14; // r15
  __int64 v15; // r12
  __int64 v16; // rbp
  int v17; // ecx
  unsigned __int8 *v18; // rdx
  __int64 v19; // rdi
  __int64 *v20; // r14
  __int64 v21; // rbp
  __int64 v22; // r13
  __int64 *v23; // rdi
  __int64 v24; // r8
  __int64 v25; // r12
  __int64 v26; // r15
  __int64 v27; // rbp
  __int64 v28; // rdx
  __int64 v29; // rbp
  __int64 v30; // rbp
  __int64 v31; // r10
  __int64 v32; // rdi
  __int64 v33; // r8
  bool v34; // dl
  __int64 v35; // rax
  void **v36; // rdx
  __int64 v37; // rax
  __int64 v38; // r8
  __int64 v39; // rax
  void *v40; // rcx
  __int64 v42; // [rsp+20h] [rbp-68h]
  void *Block[2]; // [rsp+30h] [rbp-58h] BYREF
  unsigned __int64 v44; // [rsp+40h] [rbp-48h]
  unsigned __int64 v45; // [rsp+48h] [rbp-40h]
 
  v3 = 0;
  v44 = 0i64;
  v45 = 15i64;
  LOBYTE(Block[0]) = 0;
  v4 = sub_1400019C0(std::cout, "I'm a first timer of Logic algebra , how about you?", envp);
  std::ostream::operator<<(v4, sub_140001B90);
  sub_1400019C0(std::cout, "Let's start our game,Please input your flag:", v5);
  sub_140001DE0(std::cin, Block);
  std::ostream::operator<<(std::cout, sub_140001B90);
  if ( v44 - 5 > 25 )
  {
    v39 = sub_1400019C0(std::cout, "Wrong input ,no GXY{} in input words", v6);
    std::ostream::operator<<(v39, sub_140001B90);
    goto LABEL_43;
  }
  v7 = operator new(0x20ui64);
  v8 = v7;
  if ( v7 )
  {
    *v7 = 0i64;
    *(v7 + 1) = 0i64;
    *(v7 + 2) = 0i64;
    *(v7 + 3) = 0i64;
  }
  else
  {
    v8 = 0i64;
  }
  v9 = 0;
  if ( v44 )
  {
    v10 = 0i64;
    do
    {
      v11 = Block;
      if ( v45 >= 0x10 )
        v11 = Block[0];
      v12 = &qword_140006048;
      if ( qword_140006060 >= 16 )
        v12 = qword_140006048;
      v8[v10] = *(v11 + v10) ^ *(v12 + v9 % 27);
      ++v9;
      ++v10;
    }
    while ( v9 < v44 );
  }
  v13 = 0i64;
  v14 = 0i64;
  v15 = 0i64;
  v16 = 0i64;
  if ( v44 > 30 )
    goto LABEL_27;
  v17 = 0;
  if ( v44 <= 0 )
    goto LABEL_27;
  v18 = v8;
  do
  {
    v19 = *v18 + v13;
    ++v17;
    ++v18;
    switch ( v17 )
    {
      case 8:
        v16 = v19;
        goto LABEL_23;
      case 16:
        v15 = v19;
        goto LABEL_23;
      case 24:
        v14 = v19;
LABEL_23:
        v19 = 0i64;
        break;
      case 32:
        sub_1400019C0(std::cout, "ERRO,out of range", v44);
        exit(1);
    }
    v13 = v19 << 8;
  }
  while ( v17 < v44 );
  if ( v16 )
  {
    v20 = operator new(0x20ui64);
    *v20 = v16;
    v20[1] = v15;
    v20[2] = v14;
    v20[3] = v13;
    goto LABEL_28;
  }
LABEL_27:
  v20 = 0i64;
LABEL_28:
  v42 = v20[2];
  v21 = v20[1];
  v22 = *v20;
  v23 = operator new(0x20ui64);
  if ( IsDebuggerPresent() )
  {
    sub_1400019C0(std::cout, "Hi , DO not debug me !", v24);
    Sleep(0x7D0u);
    exit(0);
  }
  v25 = v21 & v22;
  *v23 = v21 & v22;
  v26 = v42 & ~v22;
  v23[1] = v26;
  v27 = ~v21;
  v28 = v42 & v27;
  v23[2] = v42 & v27;
  v29 = v22 & v27;
  v23[3] = v29;
  if ( v26 != 0x11204161012i64 )
  {
    v23[1] = 0i64;
    v26 = 0i64;
  }
  v30 = v26 | v25 | v28 | v29;
  v31 = v20[1];
  v32 = v20[2];
  v33 = v28 & *v20 | v32 & (v25 | v31 & ~*v20 | ~(v31 | *v20));
  v34 = 0;
  if ( v33 == 0x8020717153E3013i64 )
    v34 = v30 == 0x3E3A4717373E7F1Fi64;
  if ( (v30 ^ v20[3]) == 0x3E3A4717050F791Fi64 )
    v3 = v34;
  if ( (v26 | v25 | v31 & v32) == (~*v20 & v32 | 0xC00020130082C0Ci64) && v3 )
  {
    v35 = sub_1400019C0(std::cout, "Congratulations!flag is GXY{", v33);
    v36 = Block;
    if ( v45 >= 0x10 )
      v36 = Block[0];
    v37 = sub_140001FD0(v35, v36, v44);
    sub_1400019C0(v37, "}", v38);
    j_j_free(v8);
  }
  else
  {
    sub_1400019C0(std::cout, "Wrong answer!try again", v33);
    j_j_free(v8);
  }
LABEL_43:
  if ( v45 >= 0x10 )
  {
    v40 = Block[0];
    if ( v45 + 1 >= 0x1000 )
    {
      v40 = *(Block[0] - 1);
      if ( (Block[0] - v40 - 8) > 0x1F )
        invalid_parameter_noinfo_noreturn();
    }
    j_j_free(v40);
  }
  return 0;
}
sub_140001DE0(std::cin, Block);
sub_140001DE0(std::cin, Block);
v8[v10] = Block[v10] ^ qword_140006060[v9 % 27];
v8[v10] = Block[v10] ^ qword_140006060[v9 % 27];
v16 = v19;  // 前 8 字节
v15 = v19;  // 中 8 字节
v14 = v19;  // 后 8 字节
v13 = v19;  // 最后 8 字节
v16 = v19;  // 前 8 字节
v15 = v19;  // 中 8 字节
v14 = v19;  // 后 8 字节
v13 = v19;  // 最后 8 字节
v25 = v21 & v22;
v26 = v42 & ~v22;
v28 = v42 & ~v21;
v29 = v22 & ~v21;
v25 = v21 & v22;
v26 = v42 & ~v22;
v28 = v42 & ~v21;
v29 = v22 & ~v21;
if (IsDebuggerPresent()) {
    std::cout << "Hi, DO not debug me!";
    Sleep(2000);
    exit(0);
}
if (IsDebuggerPresent()) {
    std::cout << "Hi, DO not debug me!";
    Sleep(2000);
    exit(0);
}
from z3 import *
 
# 定义变量
a,b,c,d=BitVecs("a b c d",64)
 
# 定义约束条件
s = Solver()
s.add(a & ~c == 0x11204161012)
s.add((a & ~b) & c | a & (b & c | b & ~c | ~(b | c)) == 0x8020717153E3013)
s.add(a & ~c | b & c | a & ~b | c & ~b == 0x3E3A4717373E7F1F)
s.add(((a & ~c | b & c | a & ~b | c & ~b) ^ d) == 0x3E3A4717050F791F)
s.add((a & ~c | b & c | b & a) == (~c & a | 0xC00020130082C0C) )
 
 
# 检查是否有解
if s.check() == sat:
    print(s.model())
else:
    print("No solution")
from z3 import *
 
# 定义变量
a,b,c,d=BitVecs("a b c d",64)
 
# 定义约束条件
s = Solver()
s.add(a & ~c == 0x11204161012)
s.add((a & ~b) & c | a & (b & c | b & ~c | ~(b | c)) == 0x8020717153E3013)
s.add(a & ~c | b & c | a & ~b | c & ~b == 0x3E3A4717373E7F1F)
s.add(((a & ~c | b & c | a & ~b | c & ~b) ^ d) == 0x3E3A4717050F791F)
s.add((a & ~c | b & c | b & a) == (~c & a | 0xC00020130082C0C) )
 
 
# 检查是否有解
if s.check() == sat:
    print(s.model())
else:
    print("No solution")
nums = [
    4483973367147818765,
    864693332579200012,
    577031497978884115,
    842073600
]
 
flag = []
 
for num in nums:
    hex_str = f"{num:X}"               # 转十六进制大写字符串
    hex_str = hex_str.zfill(len(hex_str) + len(hex_str) % 2# 保证偶数位
    flag += [f"0x{hex_str[i:i+2]}" for i in range(0, len(hex_str), 2)]
 
# 截取前 27 字节(因为 flag 长度是 27)
flag = flag[:27]
 
print("flag = [" + ", ".join(flag) + "]")
flag = [0x3E, 0x3A, 0x46, 0x05, 0x33, 0x28, 0x6F, 0x0D, 0x0C, 0x00, 0x02, 0x01, 0x30, 0x08, 0x2C, 0x0C, 0x08, 0x02, 0x07, 0x17, 0x15, 0x3E, 0x30, 0x13, 0x32, 0x31, 0x06]
key="i_will_check_is_debug_or_not"
for i in range(27):
    print(chr(ord(key[i]) ^ flag[i]),end='')
nums = [
    4483973367147818765,
    864693332579200012,
    577031497978884115,
    842073600
]
 
flag = []
 
for num in nums:
    hex_str = f"{num:X}"               # 转十六进制大写字符串
    hex_str = hex_str.zfill(len(hex_str) + len(hex_str) % 2# 保证偶数位
    flag += [f"0x{hex_str[i:i+2]}" for i in range(0, len(hex_str), 2)]
 
# 截取前 27 字节(因为 flag 长度是 27)
flag = flag[:27]
 
print("flag = [" + ", ".join(flag) + "]")
flag = [0x3E, 0x3A, 0x46, 0x05, 0x33, 0x28, 0x6F, 0x0D, 0x0C, 0x00, 0x02, 0x01, 0x30, 0x08, 0x2C, 0x0C, 0x08, 0x02, 0x07, 0x17, 0x15, 0x3E, 0x30, 0x13, 0x32, 0x31, 0x06]
key="i_will_check_is_debug_or_not"
for i in range(27):
    print(chr(ord(key[i]) ^ flag[i]),end='')
__int64 input_len = 0;
while (*(Code + input_len)) ++input_len;
 
if (input_len != 19)
{
    sub_7FF7BB451620(std::cout, "error\n");
    _exit(Code);
}

传播安全知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (1)
雪    币: 1023
活跃值: (223)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2

第一道题目[羊城杯 2020]login

z3添加约束条件时,各个自变量大小应小于等于256.不过这里z3一次就求出了正确的结果。

题目中if条件可以看成求解有13个方程、14个自变量的线性方程组,那么这个方程组若有解则必定有无穷多解。

利用sympy验证有:

from sympy import *

M = Matrix([[89, 7, 12, -25, 41, 23, 20, -66, 31, 8, 2, -41, -39, 17],
            [28, 35, 16, -65, 53, 39, 27, 15, -33, 13, 101, 90, -34, 23],
            [23, 34, 35, -59, 49, 81, 25, 128, -32, 75, 81, 47, -60, 29],
            [38, 97, 35, -52, 42, 79, 90, 23, -36, 57, 81, 42, -62, -11],
            [22, 27, 35, -45, 47, 49, 29, 18, -26, 35, 41, 40, -61, 28],
            [12, 45, 35, -9, -42, 86, 23, 85, -47, 34, 76, 43, -44, 65],
            [79, 62, 35, -85, 33, 79, 86, 14, -30, 25, 11, 57, -50, -9],
            [8, 6, 64, -85, 73, 29, 2, 23, -36, 5, 2, 47, -64, 27],
            [67, -68, 68, -51, -43, 81, 22, -12, -38, 75, 41, 27, -52, 31],
            [85, 63, 5, -51, 44, 36, 28, 15, -6, 45, 31, 7, -67, 78],
            [47, 64, 66, -5, 43, 112, 25, 13, -35, 95, 21, 43, -61, 20],
            [89, 67, 85, -25, 49, 89, 23, 56, -92, 14, 89, 47, -61, -29],
            [95, 34, 62, -9, -43, 83, 25, 12, -36, 16, 51, 47, -60, -24]])
b = Matrix([7258, 26190, 37136, 27915, 17298, 19875, 22784, 9710, 13376, 24065, 27687, 29250, 15317])
x = Matrix(symbols('a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14'))
print(solve(Eq(M * x, b), x))

计算结果为

{a1: 771508093740352605608561*a14/1096349357896268373440178 + 35001935498741433484766223/365449785965422791146726, 
a10: 73420963596835724570959*a14/548174678948134186720089 + 18926657842567637751642655/182724892982711395573363, 
a11: 60878922934522754779640*a14/548174678948134186720089 + 15410122430198852507879904/182724892982711395573363, 
a12: 995901124805992203889867*a14/1096349357896268373440178 + 16088371788575372302069187/365449785965422791146726, 
a13: 433787717452120488894107*a14/365449785965422791146726 + 17844586489037229487406357/365449785965422791146726, 
a2: 12792846327113822772990127/365449785965422791146726 - 365641042176697798678973*a14/1096349357896268373440178, 
a3: 1574216917716737353293115*a14/548174678948134186720089 - 15489137165056996930490635/182724892982711395573363, 
a4: 1598623672631640902111473*a14/1096349357896268373440178 - 15026711897190090385199121/365449785965422791146726, 
a5: 458599869596140649907119*a14/1096349357896268373440178 + 32962179174846423130281195/365449785965422791146726, 
a6: 19948596042119405174712323/182724892982711395573363 - 1099220513078437742277974*a14/548174678948134186720089, 
a7: 378030576143124239155338*a14/182724892982711395573363 - 7358712009207180816071990/182724892982711395573363, 
a8: 837239695377984150060793*a14/1096349357896268373440178 + 24046293873695648343683343/365449785965422791146726, 
a9: 794585021198274130139803*a14/548174678948134186720089 + 761259201919977138277043/182724892982711395573363}

a14为自由变量,那么将a14遍历[0, 256],当a1 ~ a13均为整数时即可得到结果。

最后于 2025-8-15 16:34 被NJyO编辑 ,原因:
2025-8-15 11:50
1
游客
登录 | 注册 方可回帖
返回