今年网鼎杯赶上感冒发烧,发挥不佳,只做了个MISC01,其他都是队友做的。MISC01这题做出的人不多,分享一下解法吧
题目:
点我可以下载这个题目原始文件(2.1M),有兴趣的大家可以自行尝试一下,建议使用vscode之类的编辑器打开。
操作内容:
打开这个文件以后眼睛瞎了,一堆的0和1排列组合,琢磨了很久,想到2020年的网鼎杯“朱雀组”出过曼彻斯特编码,这个01也很像,那就试一下吧。结果因为这个文本实在太长了,我之前写的那个曼彻斯特编码工具顶不住压力,直接卡死。。。
这个题实际上考的是差分曼彻斯特,那就写python来解决这个问题吧,代码如下:
def differential_manchester_decode(encoded_signal):
decoded_bits = []
previous_bit = 1 # 初始状态,假设上一个比特为 1
for i in range(0, len(encoded_signal), 2):
# 每个比特周期有两个字符,分别表示前半部分和后半部分的电平
first_half = int(encoded_signal[i])
second_half = int(encoded_signal[i + 1])
if first_half == previous_bit:
decoded_bits.append('1') # 保持电平,解码为 1
else:
decoded_bits.append('0') # 切换电平,解码为 0
# 更新上一个比特为当前比特周期的后半部分电平
previous_bit = second_half
return ''.join(decoded_bits)
def binary_to_hex(binary_data):
# 将二进制字符串转换为十六进制字符串
hex_value = ''
for i in range(0, len(binary_data), 4):
nibble = binary_data[i:i + 4] # 取出4位
if len(nibble) == 4: # 确保是一个完整的半字节
hex_value += hex(int(nibble, 2))[2:] # 转换为十六进制,并去掉前缀 '0x'
return hex_value
# 测试解码和转换
if __name__ == "__main__":
encoded_data = "(data文本太长在这里略写)" # 编码信号
decoded_data = differential_manchester_decode(encoded_data)
# 假设 decoded_data 是完整的二进制数据字符串,填充到完整字节
decoded_data = decoded_data.zfill(len(decoded_data) + (8 - len(decoded_data) % 8) % 8)
hex_result = binary_to_hex(decoded_data)
# 将结果保存到文件中
with open('output.txt', 'w') as file:
file.write(f"{hex_result}\n")
print("解码结果已保存到 output.txt 文件中")
打开output.txt文件,一开始几位有点奇怪,但是后面看到504B,这不是一个zip吗,看看文件特征,好像有很多乱七八糟的捣乱项,用正则给他都过滤出来删掉
处理完以后,放到010editor里面,使用copy from hex粘贴,保存得到一个zip压缩文件,打开发现需要密码,但是很奇怪的是我用各种爆破软件一直提示我这个压缩包格式不对,怀疑刚刚删捣乱项的时候,有数据删错了或者漏删了什么。又重新捣鼓了几次,还是不行,干脆猜吧,结果真的密码就是12345678。。。直接解压出来了一张图片。
这是一张png,把它拖到010editor中,看了看,最后有个奇怪的字符串,看到最后有个“=”,觉得有点像base64,把这个字符串提取出来转一下base64,还真有结果:ppaasswd,看着像是个密码。
一个png图片,又提供了个密码,正好年初的一个比赛中,遇到了个PixelJihad的加密方法,用当时保存下来的工具进行解密,拿到flag
FLAG值:
wdflag{9b1960ec9f880415cf495a0bf823fcdb}
(本文为作者原创。转载请注明:转自carlzhang.xyz)