MISC
签个到吧
Brainfuck 语言,’+-+-+-‘无效操作会影响解释器运行,删除拿去解密即可

RE
WARMUP
将前面的Execute改成 wscript.echo, 然后输入
1
|
cscript chal.vbs >> output.txt
|
将执行结果重定向到 txt 文本中,提取 rc4 key 解密
然后 flag 里面内容 md 5 加密提交即可
Dragon
Window 环境 LLVM clang 编写的 bc 文件,需要将它继续编译
1
|
clang dragon.bc -o dragon
|
根据字符串定位到主函数,并进入比较函数:

有个常量 0x42F0E1EBA9EA3693,搜索发现是 CRC-64 算法

小端序存储,每次传入两个字节,直接让 ds 写个脚本:
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
|
import struct
def compute_crc(data):
v5 = 0xFFFFFFFFFFFFFFFF
for byte in data:
v5 ^= (byte << 56) & 0xFFFFFFFFFFFFFFFF
for _ in range(8):
if v5 & (1 << 63):
v5 = (v5 << 1) ^ 0x42F0E1EBA9EA3693
else:
v5 = (v5 << 1)
v5 &= 0xFFFFFFFFFFFFFFFF # 保持64位
v5 = ~v5 & 0xFFFFFFFFFFFFFFFF
return v5
# 将十六进制数据按小端序转换为目标值
data = bytes.fromhex("477B9F414EE363DCC6BFB2E7D4F81E039ED85F62BC2FD612E85557CCE1B6E883CC65B62AEBB17BFC6BD9622A1BCA829387C37376A0F8FFB1E1058E382716A80DB7AAD0E81AE6F19E4561F2E7D23F78920BE66FF5A17CC963AB3AB743B0A8D39B")
targets = [struct.unpack('<Q', data[i*8:(i+1)*8])[0] for i in range(12)] # 修正为小端序
flag = bytearray()
for idx, target in enumerate(targets):
found = None
# 枚举所有可能的两个字节组合
for b0 in range(256):
for b1 in range(256):
candidate = bytes([b0, b1])
crc = compute_crc(candidate)
if crc == target:
found = candidate
break
if found:
flag.extend(found)
print(f"目标值 {idx+1}: {hex(target)} 匹配到: {found}")
break
if not found:
print(f"未找到匹配目标值: {hex(target)}")
exit()
print("Flag:", flag.decode())
|
Moon
信息收集,定位到 pyd 字符串常量存放位置,找到目标字符串:
Pyd 总共定义了两个函数 check_flag 和 xor_crypt, Check_flag 函数调用了 xor_crypt 函数,因此只需要调试 check_flag 函数即可。

Pyd 函数真正的入口:

这里函数逻辑运算入口:

直接到比较处下断点:

查看 v45 和 v10 处,发现一个为目标字符,另一个应该加密产生的字符,结合函数名,猜测该字符为异或所产生,只需要将输入字符 byte 改为 0 即可得到密钥

定位到此处,将 rax 处的输入字符修改为 0 byte

得到密钥:

解密:
