一、4-1
题目链接:https://adworld.xctf.org.cn/task/task_list?type=misc&number=1&grade=1&page=4
二、答题步骤
1.binwalk
输入如下命令
binwalk -e 画风不一样的喵.png
提取文件
发现两张图片
2.盲水印
盲水印脚本bwm.py
#!/usr/bin/env python # -*- coding: utf8 -*- import sys import random cmd = None debug = False seed = 20160930 oldseed = False alpha = 3.0 if __name__ == '__main__': if '-h' in sys.argv or '--help' in sys.argv or len(sys.argv) < 2: print ('Usage: python bwm.py [arg...] [opts...]') print (' cmds:') print (' encode ') print (' image + watermark -> image(encoded)') print (' decode ') print (' image + image(encoded) -> watermark') print (' opts:') print (' --debug, Show debug') print (' --seed , Manual setting random seed (default is 20160930)') print (' --oldseed Use python2 random algorithm.') print (' --alpha , Manual setting alpha (default is 3.0)') sys.exit(1) cmd = sys.argv[1] if cmd != 'encode' and cmd != 'decode': print ('Wrong cmd %s' % cmd) sys.exit(1) if '--debug' in sys.argv: debug = True del sys.argv[sys.argv.index('--debug')] if '--seed' in sys.argv: p = sys.argv.index('--seed') if len(sys.argv) <= p+1: print ('Missing for --seed') sys.exit(1) seed = int(sys.argv[p+1]) del sys.argv[p+1] del sys.argv[p] if '--oldseed' in sys.argv: oldseed = True del sys.argv[sys.argv.index('--oldseed')] if '--alpha' in sys.argv: p = sys.argv.index('--alpha') if len(sys.argv) <= p+1: print ('Missing for --alpha') sys.exit(1) alpha = float(sys.argv[p+1]) del sys.argv[p+1] del sys.argv[p] if len(sys.argv) < 5: print ('Missing arg...') sys.exit(1) fn1 = sys.argv[2] fn2 = sys.argv[3] fn3 = sys.argv[4] import cv2 import numpy as np import matplotlib.pyplot as plt # OpenCV是以(BGR)的顺序存储图像数据的 # 而Matplotlib是以(RGB)的顺序显示图像的 def bgr_to_rgb(img): b, g, r = cv2.split(img) return cv2.merge([r, g, b]) if cmd == 'encode': print ('image<%s> + watermark<%s> -> image(encoded)<%s>' % (fn1, fn2, fn3)) img = cv2.imread(fn1) wm = cv2.imread(fn2) if debug: plt.subplot(231), plt.imshow(bgr_to_rgb(img)), plt.title('image') plt.xticks([]), plt.yticks([]) plt.subplot(234), plt.imshow(bgr_to_rgb(wm)), plt.title('watermark') plt.xticks([]), plt.yticks([]) # print img.shape # 高, 宽, 通道 h, w = img.shape[0], img.shape[1] hwm = np.zeros((int(h * 0.5), w, img.shape[2])) assert hwm.shape[0] > wm.shape[0] assert hwm.shape[1] > wm.shape[1] hwm2 = np.copy(hwm) for i in range(wm.shape[0]): for j in range(wm.shape[1]): hwm2[i][j] = wm[i][j] if oldseed: random.seed(seed,version=1) else: random.seed(seed) m, n = list(range(hwm.shape[0])), list(range(hwm.shape[1])) if oldseed: random.shuffle(m,random=random.random) random.shuffle(n,random=random.random) else: random.shuffle(m) random.shuffle(n) for i in range(hwm.shape[0]): for j in range(hwm.shape[1]): hwm[i][j] = hwm2[m[i]][n[j]] rwm = np.zeros(img.shape) for i in range(hwm.shape[0]): for j in range(hwm.shape[1]): rwm[i][j] = hwm[i][j] rwm[rwm.shape[0] - i - 1][rwm.shape[1] - j - 1] = hwm[i][j] if debug: plt.subplot(235), plt.imshow(bgr_to_rgb(rwm)), \ plt.title('encrypted(watermark)') plt.xticks([]), plt.yticks([]) f1 = np.fft.fft2(img) f2 = f1 + alpha * rwm _img = np.fft.ifft2(f2) if debug: plt.subplot(232), plt.imshow(bgr_to_rgb(np.real(f1))), \ plt.title('fft(image)') plt.xticks([]), plt.yticks([]) img_wm = np.real(_img) assert cv2.imwrite(fn3, img_wm, [int(cv2.IMWRITE_JPEG_QUALITY), 100]) # 这里计算下保存前后的(溢出)误差 img_wm2 = cv2.imread(fn3) sum = 0 for i in range(img_wm.shape[0]): for j in range(img_wm.shape[1]): for k in range(img_wm.shape[2]): sum += np.power(img_wm[i][j][k] - img_wm2[i][j][k], 2) miss = np.sqrt(sum) / (img_wm.shape[0] * img_wm.shape[1] * img_wm.shape[2]) * 100 print ('Miss %s%% in save' % miss) if debug: plt.subplot(233), plt.imshow(bgr_to_rgb(np.uint8(img_wm))), \ plt.title('image(encoded)') plt.xticks([]), plt.yticks([]) f2 = np.fft.fft2(img_wm) rwm = (f2 - f1) / alpha rwm = np.real(rwm) wm = np.zeros(rwm.shape) for i in range(int(rwm.shape[0] * 0.5)): for j in range(rwm.shape[1]): wm[m[i]][n[j]] = np.uint8(rwm[i][j]) for i in range(int(rwm.shape[0] * 0.5)): for j in range(rwm.shape[1]): wm[rwm.shape[0] - i - 1][rwm.shape[1] - j - 1] = wm[i][j] if debug: assert cv2.imwrite('_bwm.debug.wm.jpg', wm) plt.subplot(236), plt.imshow(bgr_to_rgb(wm)), plt.title(u'watermark') plt.xticks([]), plt.yticks([]) if debug: plt.show() elif cmd == 'decode': print ('image<%s> + image(encoded)<%s> -> watermark<%s>' % (fn1, fn2, fn3)) img = cv2.imread(fn1) img_wm = cv2.imread(fn2) if debug: plt.subplot(231), plt.imshow(bgr_to_rgb(img)), plt.title('image') plt.xticks([]), plt.yticks([]) plt.subplot(234), plt.imshow(bgr_to_rgb(img_wm)), plt.title('image(encoded)') plt.xticks([]), plt.yticks([]) if oldseed: random.seed(seed,version=1) else: random.seed(seed) m, n = list(range(int(img.shape[0] * 0.5))), list(range(img.shape[1])) if oldseed: random.shuffle(m,random=random.random) random.shuffle(n,random=random.random) else: random.shuffle(m) random.shuffle(n) f1 = np.fft.fft2(img) f2 = np.fft.fft2(img_wm) if debug: plt.subplot(232), plt.imshow(bgr_to_rgb(np.real(f1))), \ plt.title('fft(image)') plt.xticks([]), plt.yticks([]) plt.subplot(235), plt.imshow(bgr_to_rgb(np.real(f1))), \ plt.title('fft(image(encoded))') plt.xticks([]), plt.yticks([]) rwm = (f2 - f1) / alpha rwm = np.real(rwm) if debug: plt.subplot(233), plt.imshow(bgr_to_rgb(rwm)), \ plt.title('encrypted(watermark)') plt.xticks([]), plt.yticks([]) wm = np.zeros(rwm.shape) for i in range(int(rwm.shape[0] * 0.5)): for j in range(rwm.shape[1]): wm[m[i]][n[j]] = np.uint8(rwm[i][j]) for i in range(int(rwm.shape[0] * 0.5)): for j in range(rwm.shape[1]): wm[rwm.shape[0] - i - 1][rwm.shape[1] - j - 1] = wm[i][j] assert cv2.imwrite(fn3, wm) if debug: plt.subplot(236), plt.imshow(bgr_to_rgb(wm)), plt.title(u'watermark') plt.xticks([]), plt.yticks([]) if debug: plt.show()
保存requirements.txt文件
opencv-python==4.2.0.34 matplotlib==2.1.1
执行命令安装对应包
pip install -r requirements.txt
提取图中的盲水印
python bwm.py decode day1.png day2.png day3.png --oldseed
Flag:wdflag{My_c4t_Ho}
总结
binwalk
盲水印
数字水印(Digital Watermark)一种应用计算机算法嵌入载体文件的保护信息。数字水印技术,是一种基于内容的、非密码机制的计算机信息隐藏技术。它是将一些标识信息(即数字水印)直接嵌入数字载体当中(包括多媒体、文档、软件等)或是间接表示(修改特定区域的结构),且不影响原载体的使用价值,也不容易被探知和再次修改。但可以被生产方识别和辨认。通过这些隐藏在载体中的信息,可以达到确认内容创建者、购买者、传送隐秘信息或者判断载体是否被篡改等目的。数字水印是保护信息安全、实现防伪溯源、版权保护的有效办法,是信息隐藏技术研究领域的重要分支和研究方向。
通用安全
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。