2024夏令营CTF部分wp

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)

posted @ 2024-07-30 18:03  m0NIS  阅读(68)  评论(0)    收藏  举报