2021深育杯线上wp

本文最后更新于:2 年前

签到

公众号回复 签到

Press

该程序实现了一个 braninfuck 多了一个符号 *

通过跟踪数据流,我们可以拿到算法逻辑

image-20211113172108746

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
分析记录:
输入 111111111 之后反馈的结果


初始:
31 a0 0

0 6f 5
0 2b 5

0 2d 5


第一轮:
31 cd 5

0 9c 5
0 c 5

0 e 5



0xae 0x73
0x13 0x6c
0xc
0xe9
0x3a
0xcf
0xb8
0x45

x , y , z

一开始操作 x, y, 一直到 0, 0xa0, 0 这个状态

然后 读取 字符到 x 中, 将x 的字符 累加到 y 中, z 也赋值成 5

然后将 y * 5 之后 拿到的值的 最低位放到 y 中

再经过运算 y + 2 , 得到最后的 值,保存到新文件内容数组中

然后操作下一个字节, 这时 x, y z 的值分别是 0, 上一个 字节的值, 5

再对 y 累加 0xa0 , z 不变 一直循环到最后

通过观察上面的算法逻辑之后,直接写脚本跑

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
#!/usr/bin/python3
# coding = utf-8

with open("out", "rb") as f:
content = f.read()

print(content)

s = 0x60
cur_ = 0xa0

flag = ''

for c in content:
s1 = c - 2
for i in range(0xff):
if (i * 5) & 0xff == s1:
s3 = cur_ - i if i - cur_ < 0 else i - cur_
if s3 > 0x7f:
s4 = chr(0xff - s3 + 1)
else:
s4 = chr(s3)
#print(s4, hex(i - cur_), hex(cur_ - i), hex(c), hex(i), hex(cur_))
flag += s4
break

cur_ = (c + 0xa0) & 0xff

print(flag)

import base64

print(base64.b64decode(flag))

XOR_Exercise

原题 roarctf 2019 polpre , 改了数据

去 平坦化之后,直接硬看就行, 改了 xor key

然后刚开始的时候是跑不出来的,然后主办方修了一次,就能跑出来了

直接提出数据拿原脚本跑即可

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
#!/usr/bin/python3
# coding = utf-8
import libnum


secret = [0x32E9A65483CC9671, 0x0EC92A986A4AF329C, 0x96C8259BC2AC4673,
0x74BF5DCA4423530F, 0x59D78EF8FDCBFAB1, 0x0A65257E5B13942B1]
key = 0xB1234B7679FC4B3D

flag = ""

# 产生CRC32查表法所用的表
for s in secret:
for i in range(64):
sign = s & 1
# 判断是否为负
if sign == 1:
s ^= key
s //= 2
# 防止负值除2,溢出为正值
if sign == 1:
s |= 0x8000000000000000
# 输出表
print(hex(s))
# 计算CRC64
j = 0
while j < 8:
flag += chr(s&0xFF)
s >>= 8
j += 1
print(flag)


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!