BUUCTF 静静听这么好听的歌(python脚本&&matlab脚本)

txt中是matlab代码:

fid=fopen('33.wav','rb');
a=fread(fid,inf,'uchar');	
n=length(a)-44;
fclose(fid);

io=imread('kkk.bmp');	
[row col]=size(io);	# 返回图像尺寸
wi=io(:);	# 二维转一维
if row*col>n
 error('文件太小');	# 要隐写的目的文件要够大
end
watermarkedaudio=a;
watermarklength=row*col;
for k=1:row*col	# 从1到row*col
 watermarkedaudio(44+k)=bitset(watermarkedaudio(44+k),1,wi(k));
end
figure;
subplot(2,1,1);plot(a);
subplot(2,1,2);plot(watermarkedaudio);
fid = fopen('2.wav', 'wb');
fwrite(fid,watermarkedaudio,'uchar');
fclose(fid);
  • fread:从二进制文件读取数据
    • inf : 读出fid指向的打开的文件的全部数据
  • imread:读取图像
  • bitset(A,pos,V):将A以二进制来表示,并将第pos个位置(从右数), 设置为 V 的值,在将所得到的值转换成10进制数并返回。
  • figure:使用默认属性值创建一个新的图窗窗口
  • subplot:将当前图窗划分为 m×n 网格,并在 p 指定的位置创建坐标区
  • plot(Y) 绘制 Y 对一组隐式 x 坐标的图。
    • 如果 Y 是向量,则 x 坐标范围从 1 到 length(Y)
    • 如果 Y 是矩阵,则对于 Y 中的每个列,图中包含一个对应的行。x 坐标的范围是从 1 到 Y 的行数。

要想逆向算法拿到bmp位示图,要知道图片的正确大小,原题目中的分数提示388,这里脑洞388*height。编写脚本测试height,在height=100时,拿到隐写文件:

# python脚本
import numpy as np
from PIL import Image

wav = open('aaa.wav','rb')
content = wav.read()
wav.close()

bins = []
for i in range(45,45+388*100):
    bins.append(255 if int(bin(content[i])[-1:]) else 0)
flag = np.array(bins,np.uint8).reshape(388,100)

imgg = Image.fromarray(flag).save('res.bmp')
% matlab脚本
clc;
clear;

row = 388;
col = 100;
marklength = row*col;
imgData = [0];

wavFile = fopen('aaa.wav','rb');
data = fread(wavFile,inf,'uchar');
for i=45:marklength+45
    imgData(i-44) = bitget(data(i),1);
end
% 一维数组转二维数组
img = convert(imgData,row,col);
imwrite(img,'flag.bmp');
imshow('flag.bmp');

function A=convert(oi,row,col)
    %创建一个二维空数组
    A = zeros(row,col);
    for i=1:row
        for j=1:col
            A(i,j) = oi((i-1)*col+j);
        end
    end
end
  • clc:清除命令窗口的内容
  • clear:清除工作空间的所有变量

拿到:

flag还镜像了,添加代码反转一下:

# python 
flag = np.flipud(flag) 
# matlab
img = flipud(img);

flag{dce97bd455ae1a00faaebd31c57e7d47}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值