January 1, 2022

羊城杯 2020-Bytecode

0x00 日常查壳

无壳纯字节码,难得又碰到pyc字节码的题了

image-20220102222946868

0x01 看题

这种题怎么看?慢慢分析即可

配合着python文档一起看即可,具体过程可以看我录过的一期bilibili教程

https://www.bilibili.com/video/BV1JL4y1p7Tt?spm_id_from=333.999.0.0

PS:文档我是用的utools里的程序员手册里的python文档

程序一共分为三段

  1. 前五个字符 类似于大数比赛 前五个说实话盲才也知道 不是flag{ 就是GWHT{

  2. 中间二十六个字符 虽然有些花里胡哨但是直接就一个异或

  3. 最后7个就是Z3库直接求

0x02 GetFlag

题目不难,就是要耐心看

关于文档里栈的关系

image-20220102223057628

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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
from z3 import * 
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('welcome to GWHT2020')
# flag长度为 38
flag = [0 for i in range(38)]
# for i in range(0, len(flag)):
#     print(flag[i])
flag[0] = ord('G')
flag[1] = ord('W')
flag[2] = ord('H')
flag[3] = ord('T')
flag[4] = ord('{')
key = (((flag[0] * 2020 + flag[1]) * 2020 + flag[2]) * 2020 + flag[3]) * 2020 + flag[4]
# print(key) 直接盲猜前五位

k = 0
for i in range(13):
    b = output[k]
    c = output[k + 1]
    a11 = c ^ en[i % 6]
    a22 = b ^ en[i % 6]
    # x.append(a11)
    # x.append(a22)
    # print(chr(a22), end = "")
    # print(chr(a11), end = "")
    flag[k + 5] = a11
    flag[k + 6] = a22
    k += 2
# The point is 把中心放在 我们取出第五位放在b 异或完后放在了ouput的第二位
# 当我们解密的时候 output第二位(也就是原来的第五位)放再c 解密完放在a11 这时候就是我们的加密前的第五位
# 于是直接把a11放在第五位 a22放在第六位 正序解毕

l = 38
a6 = 51
a1 = 97
a3 = 102
a4 = 102
a5 = 55
a2 = 101
flag[l - 7] = a1
flag[l - 6] = a2
flag[l - 5] = a3
flag[l - 4] = a4
flag[l - 3] = a5
flag[l - 2] = a6
# S = Solver()
# a1, a2, a3, a4, a5, a6 = BitVecs('a1 a2 a3 a4 a5 a6', 7)
# S.add((a1 * 3 + a2 * 2 + a3 * 5) == 1003)
# S.add((a1 * 4 + a2 * 7 + a3 * 9) == 2013)
# S.add((a1 + a2 * 8 + a3 * 2) == 1109)
# S.add((a4 * 3 + a5 * 2 + a6 * 5) == 671)
# S.add((a4 * 4 + a5 * 7 + a6 * 9) == 1252)
# S.add((a4 + a5 * 8 + a6 * 2) == 644 )
# if S.check() == sat:
#     print(S.model())

flag[37] = 125 #盲猜最后一位
for i in range(0, 38):
    print(chr(flag[i]), end = "")

# x = [0 for i in range(26)] 这里是我在验证有没有反
# k = 5
# for i in range(13):
#     b = flag[k]
#     c = flag[k + 1]
#     a11 = c ^ en[i % 6]
#     a22 = b ^ en[i % 6]
#     x.append(a11)
#     x.append(a22)
#     print(a22, end = "")
#     print(a11, end = "")
#     k += 2
# for i in range(0, len(x)):
#     print(x[i], end = ", ")

GetFlag!

image-20220102223430632

DASCTF X SU
🍬
HFCTF2022
🍪

About this Post

This post is written by P.Z, licensed under CC BY-NC 4.0.