文章目录

  • 一、warmup
  • 二、答题步骤
    • 1.下载附件
    • 2.ARCHPR
    • 3.盲水印
    • 4.得到图片
  • 总结

一、warmup

题目链接:https://adworld.xctf.org.cn/task/task_list?type=misc&number=1&grade=1&page=4

二、答题步骤

1.下载附件

拿到题目,发现有一个图片和一个压缩包,尝试打开压缩包发现需要密码,因此猜测图片即为压缩包的明文。

用WINRAR压缩png图片, 进行两个raar进行明文crc验证,用WINRAR软件打开两个文件对比cec32

发现crc32一样可以进行明文工具,因为此处要使用ARCHPR进行压缩包的破解工作

2.ARCHPR

使用ARCHPR进行明文攻击

Advanced Archive Password Recovery 统计信息:
加密的 ZIP/RAR/ACE/ARJ 文件: C:\Users\Administrator\Desktop\warmup_3D87119B1FD69603E77BA1292A007C4B.zip
总计口令: n/a
总计时间: 3m 32s 157ms
平均速度(口令/秒): n/a
这个文件的口令 : 未找到
加密密钥: [ e43a642a 8e424cdb eb7c6331 ]

解密文件会出现在目录下

3.盲水印

盲水印脚本bwm.py

#!/usr/bin/env python
# -*- coding: utf8 -*-import sys
import randomcmd = None
debug = False
seed = 20160930
oldseed = False
alpha = 3.0if __name__ == '__main__':if '-h' in sys.argv or '--help' in sys.argv or len(sys.argv) < 2:print ('Usage: python bwm.py <cmd> [arg...] [opts...]')print ('  cmds:')print ('    encode <image> <watermark> <image(encoded)>')print ('           image + watermark -> image(encoded)')print ('    decode <image> <image(encoded)> <watermark>')print ('           image + image(encoded) -> watermark')print ('  opts:')print ('    --debug,          Show debug')print ('    --seed <int>,     Manual setting random seed (default is 20160930)')print ('    --oldseed         Use python2 random algorithm.')print ('    --alpha <float>,  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 = Truedel sys.argv[sys.argv.index('--debug')]if '--seed' in sys.argv:p = sys.argv.index('--seed')if len(sys.argv) <= p+1:print ('Missing <int> 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 = Truedel sys.argv[sys.argv.index('--oldseed')]if '--alpha' in sys.argv:p = sys.argv.index('--alpha')if len(sys.argv) <= p+1:print ('Missing <float> 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 = 0for 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]) * 100print ('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) / alpharwm = 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) / alpharwm = 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

提取图中的盲水印

python3 bwm.py decode day1.png day2.png day3.png --oldseed

4.得到图片


falg为:flag{bWm_Are_W0nderfu1}

总结

  • 盲水印
  • 明文攻击
  • crc32碰撞

【愚公系列】2022年01月 攻防世界-进阶题-MISC-76(warmup)相关推荐

  1. 【愚公系列】2022年01月 攻防世界-进阶题-WEB-013(upload1)

    文章目录 一.upload1 二.使用步骤 1.点击获取在线场景 2.场景分析 2.中国蚁剑 总结 一.upload1 题目链接:https://adworld.xctf.org.cn/task/ta ...

  2. 【愚公系列】2022年01月 攻防世界-进阶题-MISC-78(Avatar)

    文章目录 一.Avatar 二.答题步骤 1.下载附件 2.outguess算法 总结 一.Avatar 题目链接:https://adworld.xctf.org.cn/task/task_list ...

  3. 【愚公系列】2022年01月 攻防世界-简单题-PWN-001(level0)

    文章目录 一.level0 二.答题步骤 1.获取在线场景 2.查壳 3.IDA 总结 一.level0 题目链接:https://adworld.xctf.org.cn/task/task_list ...

  4. 【愚公系列】2022年01月 攻防世界-简单题-PWN-003(string)

    文章目录 一.string 二.答题步骤 1.获取在线场景 2.查壳 3.IDA 总结 一.string 题目链接:https://adworld.xctf.org.cn/task/task_list ...

  5. 【愚公系列】2022年02月 攻防世界-进阶题-MISC-85(Disk)

    文章目录 一.Disk 二.答题步骤 1.下载附件 2.winhex 3.二进制转字符串 总结 一.Disk 题目链接:https://adworld.xctf.org.cn/task/task_li ...

  6. 【愚公系列】2021年11月 攻防世界-进阶题-MISC-025(Miscellaneous-200)

    文章目录 一.Miscellaneous-200 二.答题步骤 1.python 总结 一.Miscellaneous-200 文件:攻防世界下载对应文件 二.答题步骤 1.python 下载附件得到 ...

  7. 【愚公系列】2021年11月 攻防世界-进阶题-MISC-030(red_green)

    文章目录 一.red_green 二.答题步骤 1.zsteg 总结 一.red_green 文件:攻防世界下载对应文件 二.答题步骤 1.zsteg 下载得到一张图片 解法一:pytho脚本 #生成 ...

  8. 【愚公系列】2021年11月 攻防世界-进阶题-MISC-032(就在其中)

    文章目录 一.就在其中 二.答题步骤 1.ssl 总结 一.就在其中 文件:攻防世界下载对应文件 二.答题步骤 1.ssl 下载附件得到流量包,使用 binwalk 查看文件中有些什么,发现一个 ke ...

  9. 【愚公系列】2021年11月 攻防世界-进阶题-MISC-007(Aesop_secret)

    文章目录 一.Aesop_secret 二.答题步骤 1.stegsolve 2.AES解密 总结 一.Aesop_secret 文件:攻防世界下载对应文件 二.答题步骤 1.stegsolve 使用 ...

最新文章

  1. Android实战简易教程-第三十四枪(基于ViewPager和FragmentPagerAdapter实现滑动通用Tab)...
  2. pandas使用shift函数对数数据进行向上偏移(-1)或者向下偏移(1)、索引不移动,移动之后无值的赋值为NaN、将原数据列与偏移后的数据列相加生成新的数据列
  3. 解决Linux中使用google chrome浏览器出现:ERR_PROXY_CONNECTION_FAILED 代理错误,导致不能够上网
  4. linux下根据进程查找文件启动文件
  5. 如何评审功能测试用例?
  6. python正则表达式函数match()和search()的区别详解
  7. HashMap和ArrayList初始大小和扩容后的大小
  8. 【学神】1-4 用户及用户组管理
  9. json web token没有哪个成分_SpringBoot 2.1.4集成JWT实现token验证
  10. 实体首部字段-四大首部字段之一
  11. geohash redis mysql_Redis geohash 地理位置存储
  12. vscode风格超酷个人主页源码
  13. 《Solar Energy Materials and Solar Cells》期刊介绍(SCI 2区)
  14. css3新单位vw、vh、vmin、vmax的使用详解
  15. retrofit 响应时间_HTTP Retrofit 网络传输
  16. 微信公众号token验证问题
  17. 算法工程师实习校招面经 (上篇)
  18. 如何安装操作系统?过程、图文。
  19. 1000桶水,其中一桶有毒,猪喝毒水后会在15分钟内死去,想用一个小时找到这桶毒水,至少需要几头猪?具体该如何实现方法讲解
  20. 很不错的点餐系统应用ios源代码完整版

热门文章

  1. SLAM——ORB-SLAM3代码分析(七)Converter
  2. 渲染管线中的坐标空间和相关变换
  3. hibernate一对一主键唯一外键关联(二)
  4. python爬虫网易云音乐评论最多的歌_使用Python爬一爬网易云音乐上那些评论火爆的歌曲...
  5. SAP MM 进销存报表与标准报表MB5B
  6. 看完电视剧“天道“的第一次感想记录
  7. 月饼电商“内卷”?看数据如何驱动营销,全链路精细化运营抢占C位!
  8. FL Studio21云盘水果FL21版有什么新功能?
  9. 未来十年,互联网将如何颠覆17个传统行业
  10. 专访许长敬:移动互联网将进入电子商务阶段