2023工业信息安全技能大赛锦标赛-Reverse-wp完整版
WMBa0 发表于 河南 CTF 1580浏览 · 2024-02-15 08:14

时间6小时,题目比较基础,有一道困难的题目,也是花费我很长时间才在比赛结束前做出来,题目都包含
主要是记录一下,工控大多数企业都会参加一些。

magic_book

IDA打开64位,没看懂要干什么

string一把嗦就可以看到flag

很离谱的一道题目(很多工控都这样出,哈哈哈)

ez_crypt

正常RC4,采用了rust语言,动态调试即可
动调密文
923117B560C8486423FA0ABBC53493ECB9616C5D899BA01B47E267BBC7CBD8FE1C67BF98E2EE
动态调试得到key
sierting

babygo

base32变表密文N2XHD244PSVED53BHG2W7ZSVNK5W7ZSVPOTUHNUtable
base32表:AC-Z2-7B=


Cyber解密

xor.cpython-312.pyc

前面的题目感觉十分简单,但是这道就是比较难了

flag{Th1s_1s_4n_funny_ch4llenge_lollllll~}

给出密文

$ python xor.cpython-312.pyc
[[154, 209, 184, 205, 152, 173, 85], 
[219, 163, 159, 245, 245, 245, 3], 
[244, 244, 153, 245, 164, 191, 126], 
[136, 241, 132, 245, 188, 173, 93], 
[197, 198, 139, 207, 190, 181, 31], 
[167, 206, 128, 197, 183, 183, 76], 
[157, 223, 145, 198, 180, 165, 87]]

python312版本很新,一般的反编译工具不能编译,dis也不可以

pycdc也失败了

因此还有最后一条路:使用pycdc的模块:pycdas

./pycdas xor.pyc

得到

xor.cpython-312.pyc (Python 3.12)
[Code]
    File Name: .\xor.py
    Object Name: <module>
    Qualified Name: <module>
    Arg Count: 0
    Pos Only Arg Count: 0
    KW Only Arg Count: 0
    Stack Size: 3
    Flags: 0x00000000
    [Names]
        'os'
        'flag'
        'cut'
        'chall'
        'res'
        'print'
    [Locals+Names]
    [Constants]
        0
        None
        b'flag{xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx}'
        [Code]
            File Name: .\xor.py
            Object Name: cut
            Qualified Name: cut
            Arg Count: 2
            Pos Only Arg Count: 0
            KW Only Arg Count: 0
            Stack Size: 7
            Flags: 0x00000003 (CO_OPTIMIZED | CO_NEWLOCALS)
            [Names]
                'range'
                'len'
            [Locals+Names]
                'obj'
                'sec'
                'i'
            [Constants]
                None
                0
            [Disassembly]
                0       RESUME                        0
                2       LOAD_GLOBAL                   1: NULL + range
                12      LOAD_CONST                    1: 0
                14      LOAD_GLOBAL                   3: NULL + len
                24      LOAD_FAST                     0: obj
                26      CALL                          1
                34      LOAD_FAST                     1: sec
                36      CALL                          3
                44      GET_ITER                      
                46      LOAD_FAST_AND_CLEAR           2
                48      SWAP                          2
                50      BUILD_LIST                    0
                52      SWAP                          2
                54      FOR_ITER                      10 (to 76)
                58      STORE_FAST                    2: i
                60      LOAD_FAST                     0: obj
                62      LOAD_FAST                     2: i
                64      LOAD_FAST                     2: i
                66      LOAD_FAST                     1: sec
                68      BINARY_OP                     0 (+)
                72      BINARY_SLICE                  
                74      LIST_APPEND                   2
                76      JUMP_BACKWARD                 12
                78      END_FOR                       
                80      SWAP                          2
                82      STORE_FAST                    2: i
                84      RETURN_VALUE                  
                86      SWAP                          2
                88      POP_TOP                       
                90      SWAP                          2
                92      STORE_FAST                    2: i
                94      RERAISE                       0
        [Code]
            File Name: .\xor.py
            Object Name: chall
            Qualified Name: chall
            Arg Count: 0
            Pos Only Arg Count: 0
            KW Only Arg Count: 0
            Stack Size: 6
            Flags: 0x00000003 (CO_OPTIMIZED | CO_NEWLOCALS)
            [Names]
                'flag'
                'startswith'
                'endswith'
                'cut'
                'os'
                'urandom'
                'append'
            [Locals+Names]
                'x'
                'm'
                'res'
                'pad'
                'i'
                'tmp'
            [Constants]
                None
                6
                b'flag{'
                b'}'
                0
                1
                2
                3
                4
                5
            [Disassembly]
                0       RESUME                        0
                2       LOAD_CONST                    1: 6
                4       STORE_FAST                    0: x
                6       LOAD_GLOBAL                   0: flag
                16      LOAD_ATTR                     3: cut
                36      LOAD_CONST                    2: b'flag{'
                38      CALL                          1
                46      POP_JUMP_IF_TRUE              2 (to 4)
                48      LOAD_ASSERTION_ERROR          
                50      RAISE_VARARGS                 1
                52      LOAD_GLOBAL                   0: flag
                62      LOAD_ATTR                     5: urandom
                82      LOAD_CONST                    3: b'}'
                84      CALL                          1
                92      POP_JUMP_IF_TRUE              2 (to 4)
                94      LOAD_ASSERTION_ERROR          
                96      RAISE_VARARGS                 1
                98      LOAD_GLOBAL                   7: NULL + cut
                108     LOAD_GLOBAL                   0: flag
                118     LOAD_FAST                     0: x
                120     CALL                          2
                128     STORE_FAST                    1: m
                130     BUILD_LIST                    0
                132     STORE_FAST                    2: res
                134     LOAD_GLOBAL                   9: NULL + os
                144     LOAD_ATTR                     10 <INVALID>
                164     LOAD_FAST                     0: x
                166     CALL                          1
                174     STORE_FAST                    3: pad
                176     LOAD_FAST                     1: m
                178     GET_ITER                      
                180     FOR_ITER                      288 (to 760)
                186     STORE_FAST                    4: i
                188     BUILD_LIST                    0
                190     STORE_FAST                    5: tmp
                192     LOAD_FAST                     5: tmp
                194     LOAD_ATTR                     13 <INVALID>
                214     LOAD_FAST                     4: i
                216     LOAD_CONST                    4: 0
                218     BINARY_SUBSCR                 
                222     LOAD_FAST                     4: i
                224     LOAD_CONST                    5: 1
                226     BINARY_SUBSCR                 
                230     BINARY_OP                     12 (^)
                234     LOAD_FAST                     4: i
                236     LOAD_CONST                    6: 2
                238     BINARY_SUBSCR                 
                242     BINARY_OP                     12 (^)
                246     LOAD_FAST                     3: pad
                248     LOAD_CONST                    4: 0
                250     BINARY_SUBSCR                 
                254     BINARY_OP                     12 (^)
                258     CALL                          1
                266     POP_TOP                       
                268     LOAD_FAST                     5: tmp
                270     LOAD_ATTR                     13 <INVALID>
                290     LOAD_FAST                     4: i
                292     LOAD_CONST                    7: 3
                294     BINARY_SUBSCR                 
                298     LOAD_FAST                     4: i
                300     LOAD_CONST                    8: 4
                302     BINARY_SUBSCR                 
                306     BINARY_OP                     12 (^)
                310     LOAD_FAST                     3: pad
                312     LOAD_CONST                    5: 1
                314     BINARY_SUBSCR                 
                318     BINARY_OP                     12 (^)
                322     LOAD_FAST                     3: pad
                324     LOAD_CONST                    6: 2
                326     BINARY_SUBSCR                 
                330     BINARY_OP                     12 (^)
                334     CALL                          1
                342     POP_TOP                       
                344     LOAD_FAST                     5: tmp
                346     LOAD_ATTR                     13 <INVALID>
                366     LOAD_FAST                     3: pad
                368     LOAD_CONST                    9: 5
                370     BINARY_SUBSCR                 
                374     LOAD_FAST                     4: i
                376     LOAD_CONST                    9: 5
                378     BINARY_SUBSCR                 
                382     BINARY_OP                     12 (^)
                386     LOAD_FAST                     3: pad
                388     LOAD_CONST                    5: 1
                390     BINARY_SUBSCR                 
                394     BINARY_OP                     12 (^)
                398     LOAD_FAST                     3: pad
                400     LOAD_CONST                    7: 3
                402     BINARY_SUBSCR                 
                406     BINARY_OP                     12 (^)
                410     CALL                          1
                418     POP_TOP                       
                420     LOAD_FAST                     5: tmp
                422     LOAD_ATTR                     13 <INVALID>
                442     LOAD_FAST                     4: i
                444     LOAD_CONST                    7: 3
                446     BINARY_SUBSCR                 
                450     LOAD_FAST                     3: pad
                452     LOAD_CONST                    7: 3
                454     BINARY_SUBSCR                 
                458     BINARY_OP                     12 (^)
                462     LOAD_FAST                     3: pad
                464     LOAD_CONST                    8: 4
                466     BINARY_SUBSCR                 
                470     BINARY_OP                     12 (^)
                474     LOAD_FAST                     3: pad
                476     LOAD_CONST                    5: 1
                478     BINARY_SUBSCR                 
                482     BINARY_OP                     12 (^)
                486     CALL                          1
                494     POP_TOP                       
                496     LOAD_FAST                     5: tmp
                498     LOAD_ATTR                     13 <INVALID>
                518     LOAD_FAST                     4: i
                520     LOAD_CONST                    9: 5
                522     BINARY_SUBSCR                 
                526     LOAD_FAST                     3: pad
                528     LOAD_CONST                    4: 0
                530     BINARY_SUBSCR                 
                534     BINARY_OP                     12 (^)
                538     LOAD_FAST                     4: i
                540     LOAD_CONST                    8: 4
                542     BINARY_SUBSCR                 
                546     BINARY_OP                     12 (^)
                550     LOAD_FAST                     3: pad
                552     LOAD_CONST                    5: 1
                554     BINARY_SUBSCR                 
                558     BINARY_OP                     12 (^)
                562     CALL                          1
                570     POP_TOP                       
                572     LOAD_FAST                     5: tmp
                574     LOAD_ATTR                     13 <INVALID>
                594     LOAD_FAST                     4: i
                596     LOAD_CONST                    6: 2
                598     BINARY_SUBSCR                 
                602     LOAD_FAST                     4: i
                604     LOAD_CONST                    8: 4
                606     BINARY_SUBSCR                 
                610     BINARY_OP                     12 (^)
                614     LOAD_FAST                     3: pad
                616     LOAD_CONST                    4: 0
                618     BINARY_SUBSCR                 
                622     BINARY_OP                     12 (^)
                626     LOAD_FAST                     3: pad
                628     LOAD_CONST                    5: 1
                630     BINARY_SUBSCR                 
                634     BINARY_OP                     12 (^)
                638     CALL                          1
                646     POP_TOP                       
                648     LOAD_FAST                     5: tmp
                650     LOAD_ATTR                     13 <INVALID>
                670     LOAD_FAST                     4: i
                672     LOAD_CONST                    6: 2
                674     BINARY_SUBSCR                 
                678     LOAD_FAST                     4: i
                680     LOAD_CONST                    4: 0
                682     BINARY_SUBSCR                 
                686     BINARY_OP                     12 (^)
                690     LOAD_FAST                     4: i
                692     LOAD_CONST                    8: 4
                694     BINARY_SUBSCR                 
                698     BINARY_OP                     12 (^)
                702     LOAD_FAST                     3: pad
                704     LOAD_CONST                    8: 4
                706     BINARY_SUBSCR                 
                710     BINARY_OP                     12 (^)
                714     CALL                          1
                722     POP_TOP                       
                724     LOAD_FAST                     2: res
                726     LOAD_ATTR                     13 <INVALID>
                746     LOAD_FAST                     5: tmp
                748     CALL                          1
                756     POP_TOP                       
                758     JUMP_BACKWARD                 291
                762     END_FOR                       
                764     LOAD_FAST                     2: res
                766     RETURN_VALUE                  
    [Disassembly]
        0       RESUME                        0
        2       LOAD_CONST                    0: 0
        4       LOAD_CONST                    1: None
        6       IMPORT_NAME                   0: os
        8       STORE_NAME                    0: os
        10      LOAD_CONST                    2: b'flag{xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx}'
        12      STORE_NAME                    1: flag
        14      LOAD_CONST                    3: <CODE> cut
        16      MAKE_FUNCTION                 0
        18      STORE_NAME                    2: cut
        20      LOAD_CONST                    4: <CODE> chall
        22      MAKE_FUNCTION                 0
        24      STORE_NAME                    3: chall
        26      PUSH_NULL                     
        28      LOAD_NAME                     3: chall
        30      CALL                          0
        38      STORE_NAME                    4: res
        40      PUSH_NULL                     
        42      LOAD_NAME                     5: print
        44      LOAD_NAME                     4: res
        46      CALL                          1
        54      POP_TOP                       
        56      RETURN_CONST                  1: None

z3解出来的还有问题
但是知道了大致的加密逻辑

将其提取出来

m[0] ^ m[1] ^ m[2] ^ pad[0],
m[3] ^ m[4] ^ pad[1] ^ pad[2],
pad[5] ^ m[5] ^ pad[1] ^ pad[3],
m[3] ^ pad[3] ^ pad[4] ^ pad[1],
m[5] ^ pad[0] ^ m[4] ^ pad[1],
m[2] ^ m[4] ^ pad[0] ^ pad[1],
m[2] ^ m[0] ^ m[4] ^ pad[4]

多解

C:\Users\Le\AppData\Local\Programs\Python\Python38\python.exe C:\Users\Le\PycharmProjects\mytest\test5.py 
Solution for group 0:
m_0_0: 102
m_0_1: 108
m_0_2: 97
m_0_3: 103
m_0_4: 123
m_0_5: 84
Solution for group 1:
m_1_0: 81
m_1_1: 8
m_1_2: 115
m_1_3: 95
m_1_4: 49
m_1_5: 115
Solution for group 2:
m_2_0: 107
m_2_1: 0
m_2_2: 110
m_2_3: 95
m_2_4: 102
m_2_5: 117
Solution for group 3:
m_3_0: 0
m_3_1: 0
m_3_2: 121
m_3_3: 95
m_3_4: 99
m_3_5: 104
Solution for group 4:
m_4_0: 88
m_4_1: 0
m_4_2: 108
m_4_3: 101
m_4_4: 110
m_4_5: 103
Solution for group 5:
m_5_0: 56
m_5_1: 2
m_5_2: 108
m_5_3: 111
m_5_4: 108
m_5_5: 108
Solution for group 6:
m_6_0: 32
m_6_1: 32
m_6_2: 108
m_6_3: 108
m_6_4: 126
m_6_5: 125
Solution for pad:
Solution for group 0:
m_0_0: 102
m_0_1: 108
m_0_2: 97
m_0_3: 103
m_0_4: 123
m_0_5: 84
Solution for group 1:
m_1_0: 219
m_1_1: 130
m_1_2: 115
m_1_3: 95
m_1_4: 49
m_1_5: 115
Solution for group 2:
m_2_0: 244
m_2_1: 159
m_2_2: 110
m_2_3: 95
m_2_4: 102
m_2_5: 117
Solution for group 3:
m_3_0: 136
m_3_1: 136
m_3_2: 121
m_3_3: 95
m_3_4: 99
m_3_5: 104
Solution for group 4:
m_4_0: 197
m_4_1: 157
m_4_2: 108
m_4_3: 101
m_4_4: 110
m_4_5: 103
Solution for group 5:
m_5_0: 167
m_5_1: 157
m_5_2: 108
m_5_3: 111
m_5_4: 108
m_5_5: 108
Solution for group 6:
m_6_0: 61
m_6_1: 61
m_6_2: 108
m_6_3: 108
m_6_4: 126
m_6_5: 125
Solution for pad:
Solution for group 0:
m_0_0: 102
m_0_1: 108
m_0_2: 97
m_0_3: 103
m_0_4: 123
m_0_5: 84
Solution for group 1:
m_1_0: 218
m_1_1: 131
m_1_2: 115
m_1_3: 95
m_1_4: 49
m_1_5: 115
Solution for group 2:
m_2_0: 245
m_2_1: 158
m_2_2: 110
m_2_3: 95
m_2_4: 102
m_2_5: 117
Solution for group 3:
m_3_0: 137
m_3_1: 137
m_3_2: 121
m_3_3: 95
m_3_4: 99
m_3_5: 104
Solution for group 4:
m_4_0: 196
m_4_1: 156
m_4_2: 108
m_4_3: 101
m_4_4: 110
m_4_5: 103
Solution for group 5:
m_5_0: 166
m_5_1: 156
m_5_2: 108
m_5_3: 111
m_5_4: 108
m_5_5: 108
Solution for group 6:
m_6_0: 60
m_6_1: 60
m_6_2: 108
m_6_3: 108
m_6_4: 126
m_6_5: 125
Solution for pad:
Solution for group 0:
m_0_0: 102
m_0_1: 108
m_0_2: 97
m_0_3: 103
m_0_4: 123
m_0_5: 84
Solution for group 1:
m_1_0: 218
m_1_1: 131
m_1_2: 115
m_1_3: 95
m_1_4: 49
m_1_5: 115
Solution for group 2:
m_2_0: 245
m_2_1: 158
m_2_2: 110
m_2_3: 95
m_2_4: 102
m_2_5: 117
Solution for group 3:
m_3_0: 137
m_3_1: 137
m_3_2: 121
m_3_3: 95
m_3_4: 99
m_3_5: 104
Solution for group 4:
m_4_0: 197
m_4_1: 157
m_4_2: 108
m_4_3: 101
m_4_4: 110
m_4_5: 103
Solution for group 5:
m_5_0: 166
m_5_1: 156
m_5_2: 108
m_5_3: 111
m_5_4: 108
m_5_5: 108
Solution for group 6:

这里会用到解决形如: a =b ^ c

已知a和b,求c的z3解题脚本

from z3 import *

# 已知的值
a = 157
b = 241

# 创建一个BitVec变量,表示c
c = BitVec('c', 32)

# 创建求解器并添加约束
solver = Solver()
solver.add(a==b^c)

# 检查是否存在符合约束条件的解
if solver.check() == sat:
    model = solver.model()
    # 获取符合约束条件的解
    c_value = model[c].as_long()
    print("满足约束条件的c的值为:", c_value)
else:
    print("无法找到符合约束条件的c的值")

完整解密脚本

from z3 import *

# 定义每个数的位数
num_bits = 8

# 定义每组的数量
num_groups = 7
num_per_group = 6
res=[[154, 209, 184, 205, 152, 173, 85],
[219, 163, 159, 245, 245, 245, 3],
[244, 244, 153, 245, 164, 191, 126],
[136, 241, 132, 245, 188, 173, 93],
[197, 198, 139, 207, 190, 181, 31],
[167, 206, 128, 197, 183, 183, 76],
[157, 223, 145, 198, 180, 165, 87]]

# 定义m变量
m = [[BitVec(f'm_{i}_{j}', num_bits) for j in range(num_per_group)] for i in range(num_groups)]
#pad =[BitVec(f"pad_{i}",num_bits)for i in range(6)]
pad=[0]*6
pad[0]=241
pad[1]=70
pad[2]=139
pad[3]=197
pad[4]=41
pad[5]=111
# 定义求解器
solver = Solver()
solver.add(m[0][0]==0x66)
solver.add(m[0][1]==0x6c)
solver.add(m[0][2]==0x61)
solver.add(m[0][3]==0x67)
solver.add(m[0][4]==0x7b)
solver.add(m[0][5]==84)

# m[0][1]=0x6c
# m[0][2]=0x61
# m[0][3]=0x67
# m[0][4]=0x7b
#pad =[48, 167, 85, 131, 220, 30]
# 添加约束条件
for i in range(num_groups):
    tmp = [
        m[i][0] ^ m[i][1] ^ m[i][2] ^ pad[0],
        m[i][3] ^ m[i][4] ^ pad[1] ^ pad[2],
        pad[5] ^ m[i][5] ^ pad[1] ^ pad[3],
        m[i][3] ^ pad[3] ^ pad[4] ^ pad[1],
        m[i][5] ^ pad[0] ^ m[i][4] ^ pad[1],
        m[i][2] ^ m[i][4] ^ pad[0] ^ pad[1],
        m[i][2] ^ m[i][0] ^ m[i][4] ^ pad[4]
    ]

    # 添加等式约束
    for j in range(num_per_group):
        solver.add(tmp[j] == res[i][j])
# 检查是否存在解
while solver.check() == sat:
    # 获取解
    model = solver.model()
    if model[m[0][0]]==0x66 and model[m[0][1]]==0x6c and model[m[0][2]]==97 :
        for i in range(num_groups):
            print(f'Solution for group {i}:')
            for j in range(num_per_group):
                a=model[m[i][j]]
                print(f'm_{i}_{j}: {a}')
        print('Solution for pad:')
    # 防止得到相同的解
    solver.add(Or([m[i][j] != model[m[i][j]] for i in range(num_groups) for j in range(num_per_group)]))

然后再手动运算一下

from z3 import *

# 定义每个数的位数
num_bits = 8

# 定义每组的数量
num_groups = 7
num_per_group = 6
res=[[154, 209, 184, 205, 152, 173, 85],
[219, 163, 159, 245, 245, 245, 3],
[244, 244, 153, 245, 164, 191, 126],
[136, 241, 132, 245, 188, 173, 93],
[197, 198, 139, 207, 190, 181, 31],
[167, 206, 128, 197, 183, 183, 76],
[157, 223, 145, 198, 180, 165, 87]]

# 定义m变量
#m = [[BitVec(f'm_{i}_{j}', num_bits) for j in range(num_per_group)] for i in range(num_groups)]
pad =[BitVec(f"pad_{i}",num_bits)for i in range(6)]
# 定义求解器
solver = Solver()
m=[0]*6
m[0]=0x66
m[1]=0x6c
m[2]=0x61
m[3]=0x67
m[4]=0x7b
m[5]=84
# m[0][1]=0x6c
# m[0][2]=0x61
# m[0][3]=0x67
# m[0][4]=0x7b
#pad =[48, 167, 85, 131, 220, 30]
# 添加约束条件
pad=[0]*6
pad[0]=241
pad[1]=70
pad[2]=139
pad[3]=197
pad[4]=41
pad[5]=111
# print(m[0] ^ m[1] ^ m[2] ^ pad[0])
# print(m[3] ^ m[4] ^ pad[1] ^ pad[2])
# print(pad[5] ^ m[5] ^ pad[1] ^ pad[3])
# print(m[3] ^ pad[3] ^ pad[4] ^ pad[1])
# print(m[5] ^ pad[0] ^ m[4] ^ pad[1])
# print(m[2] ^ m[4] ^ pad[0] ^ pad[1])
# print(m[2] ^ m[0] ^ m[4] ^ pad[4])

s="kn_fu"
m[0]=108
m[1]=108
m[2]=108
m[3]=108
m[4]=126
m[5]=125
print(m[2]  ^ m[4] ^ pad[4])#最后res[6] m[0]
print(m[0]  ^ m[2] ^ pad[0])#第一 res[0] m[1]
for i in m:
    print(chr(i),end="")
附件:
0 条评论
某人
表情
可输入 255

没有评论