llurry
文章6
标签5
分类3

文章分类

文章归档

JQCTF wp

JQCTF wp

JQCTF re复现

第一题-writeup-customize-vm

这个比赛对我来说还是比较难的,re里这道题稍微简单一点,所以先复现了它。

输入长度50,构造关键逻辑在这里,此处是取输入的字符与一组密文进行异或,func_len中所存的即是每一组密文的长度,而\func_data即是所存储的函数(加密之后的),那么就是一个smc了,input只要能满足正常解密出所有的函数逻辑即可
example.png

使用解密出的函数做后面的约束
re.png
然后这里有点卡了,看了别人的wp后才懂了,只要能fuzz出那个满足正常异或出函数逻辑的输入即可,单字节的一个爆破,翻看一下待解密的模块,找到一点小技巧,0异或一个字节是那个字节本身,那么正确的字节是0的话异或目标字节就会是那个字节,就像下面这块,有连续的z出现,那么目标字节大概率就是z。

输入z之后修一下,成功修复,找一下规律,每个函数最后的retn就是最好的标志
ree.jpg

写个脚本fuzz一下,retn对应的字节码是c3,手动替换一下bytes_array。

脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 定义字节数组
bytes_array = [
0x90, 0xFB, 0xF1, 0x17, 0x89, 0x89, 0x89, 0xF5, 0x86, 0x7D,
0xF5, 0xB6, 0x73, 0xB5
]

# 获取最后一个字节并与目标值进行异或运算
last_byte = bytes_array[-1]
target = 0xC3
xor_char = last_byte ^ target

# 检查计算结果是否在 [0-9], [a-z], _ 范围内
is_number = (48 <= xor_char <= 57)
is_lowercase = (97 <= xor_char <= 122)
is_underscore = (xor_char == 95)

if is_number or is_lowercase or is_underscore:
print(f"找到的异或字符: '{chr(xor_char)}'")
else:
print("没有找到符合条件的异或字符。")

跳转测试
第一题

— END —

本文作者:llurry
本文链接:https://llurry.github.io/2025/06/04/JQCTF-wp/
版权声明:本文采用 CC BY-NC-SA 3.0 CN 协议进行许可