misc
前面几题基本来源于这篇文章> https://blog.csdn.net/qq_45894840/article/details/128346180?spm=1001.2014.3001.5502 算是misc的入门级题目,就不多说了
1.easy_stego_1
是盲水印分离的题目
首先拿到题目附件> http://nnd.edaker.com:8999/directlink/2/misc_easy_stego_1.png ,是一张图片,没有发现宽高存在问题
再用winhex查看,发现结尾有png、zip字样,那就直接上binwalk,果然图片中隐藏着压缩文件
foremost分离,解压缩,得到day1.png和day2.png两张图片,以及一个tips.txt
提示如图
上网搜索相关内容,猜测是盲水印
在> https://github.com/chishaxie/BlindWaterMark 找到分离盲水印的脚本,配置相关环境后进行分离
结果发现并没有得到预期图片
之后陷入了好长一段时间的迷茫,以为做错了。最后搜索得知是python版本的问题,需要在原有命令后加上--oldseed
成功分离出水印,得到flag
2.Wav测一测
附件是一段音频> https://nnd.edaker.com/assets/b39a726bafd0fdf7530779d42d09c36891ee1126f81d31b9e041a4a59ed325ca/output.wav
用Audacity查看,发现和传统的波形图、频谱图都不太一样
一开始以为是摩斯密码,一番尝试后发现不合规律,只能放弃。后来一想,把上下的竖线分别看作1和0,不就是一串二进制数?
由于代码水平有限,我最终还是选择了最原始(愚蠢)的方法——手动数。得到了下列数字:
1011010011011010111100001101000010110100011001101110100001100110101100101011000010110100100101001001101001100000011010001110111011001000100010101101000011010000110001101101101010100010111100001100110010100010011110100111101
发现只有223位,显然不符合什么密码的格式。(也有可能是我眼睛迷糊数错了)
后来发现如果再多一位的话 224可以被8整除,于是便创造性(狗运)地决定在前面加上一位数字0,结果!
这不就是base64嘛,转换后直接得到flag
最后附上正确的代码解法
点击查看代码
import base64
import wave
import numpy as np
from Crypto.Util.number import *
def wav_to_binary(filename, threshold=16384): # 阈值设为16位整数范围的一半
with wave.open(filename, 'r') as wav_file:
# 读取WAV文件的参数
num_channels, sampwidth, framerate, num_frames, comptype, compname = wav_file.getparams()
# 确保是单声道和16位PCM
if num_channels != 1 or sampwidth * 8 != 16:
raise ValueError("WAV file must be 16-bit PCM mono.")
# 读取PCM数据
pcm_data = wav_file.readframes(num_frames)
# 将PCM数据转换为numpy数组
data = np.frombuffer(pcm_data, dtype=np.int16)
# 将整数数据解码为二进制字符串
# 使用阈值来确定是1还是0
binary_str = ''.join('1' if val > threshold else '0' for val in data)
return binary_str
# 使用函数
filename = 'output.wav' # 假设这是之前生成的WAV文件名
flag_bin = wav_to_binary(filename)
flag=int(flag_bin,2)
print(base64.b64decode(long_to_bytes(flag)))
flag=flag.to_bytes(28,'big')
print(flag)