第十六届CISCN复现MISC——国粹

这篇具有很好参考价值的文章主要介绍了第十六届CISCN复现MISC——国粹。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

国粹

不是我说,我当时比赛的时候,在那里叭叭叭的数的老用心了结果他是一道非常不常规的图片密码题,又是一种我没见过的题型

第十六届CISCN复现MISC——国粹

 看了一些大佬的解题,知道他是一个坐标类型的图片拼凑

发现很多都提到了opencv,又是一个知识点盲区

浅浅了解一下

opencv:

OpenCV是一个基于Apache2.0许可(开源)发行的跨平台计算机视觉和机器学习软件库,可以运行在Linux、Windows、Android和Mac OS操作系统上。它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。

OpenCV主要用途的一些例子:

    图像处理:OpenCV提供了一系列用于处理图像的函数和算法,包括图像滤波、图像变换、图像分割、形态学操作等。

    特征检测与描述:OpenCV提供了用于检测和描述图像中的特征的函数和算法,例如SIFT、SURF、ORB、FAST等。

    目标检测与识别:OpenCV提供了用于目标检测和识别的函数和算法,例如Haar Cascade分类器、HOG+SVM分类器等。

    视频处理:OpenCV提供了一些用于处理视频的函数和算法,包括视频捕捉、视频压缩、视频分析等。

    机器学习:OpenCV提供了一些用于机器学习的函数和算法,例如支持向量机、神经网络、K均值聚类等。

下载题目

第十六届CISCN复现MISC——国粹

 点开图片a.png和图片k.png发现

两个图片大小一样

第十六届CISCN复现MISC——国粹

 我还认真数了一波a,k,当中图片的数量,发现都是341

但是这个地方,看了一下其他的方法,发现完全是可以因式分解的

看他宽的像素值,用在线因式分解的网站对其进行分解,因为每张牌的大小都是一样的,这个数一定可以被每张牌的宽度整除;

第十六届CISCN复现MISC——国粹

 然后再画图里看一下第一张牌和第二张牌的界限宽度,没有办法准确确定,只知道大概是 50
左右的样子,然后看到有因数是 53,那么大概率每张牌的宽度就是 53 了;

然后用18073/53

大概就是一共是341张牌;

题目的图片中牌数比较少,可以直接数出来是 42 张,第二排下面多了一张 1 万,按照思路题目这
样表是作为一个对照,这些牌按照顺序依次是 1,2,3 往后推,所以已经有了一张一万,下面
多的那张是没有用的;
a、k 两张图片的牌数一样,同时发现 a 的牌会出现一些重复,非常像坐标,所以我们下面
要做的任务就是把 a、k 两张图里的牌转化为相应的数字,再把牌一一对应,组合成 x、y 坐
标;
我们首先对图片进行切割,去网上找个脚本,改改就可以;

# -*- coding: utf-8 -*-
# 青少年网络安全 2022 03 30
from PIL import Image
 
filename = r'what.png'
img = Image.open(filename)
size = img.size
print(size)
# 大小为根号100
# 准备将图片切割成100张小图片
weight = int(size[0] // 10)
height = int(size[1] // 10)
# 切割后的小图的宽度和高度
print(weight, height)
 
for j in range(10):
    for i in range(10):
        box = (weight * i, height * j, weight * (i + 1), height * (j + 1))
        region = img.crop(box)
        region.save('misc\\zxsctf_{}{}.png'.format(j, i))
 

图像切分脚本:

第十六届CISCN复现MISC——国粹

 a第十六届CISCN复现MISC——国粹

 第十六届CISCN复现MISC——国粹

 文章来源地址https://www.toymoban.com/news/detail-510880.html

 k第十六届CISCN复现MISC——国粹

 了解过程中,发现又是一个陌生的库,PIL库

Pillow 是 Python 中较为基础的图像处理库,主要用于图像的基本处理,比如裁剪图像、调整图像大小和图像颜色处理等。与 Pillow 相比,OpenCV 和 Scikit-image 的功能更为丰富,所以使用起来也更为复杂,主要应用于机器视觉、图像分析等领域,比如众所周知的“人脸识别”应用 。
 

Python 中的 PIL 库_python pil_SteveKenny的博客-CSDN博客

一开始我想通过比较图片 md5 的方式进行,将 key 里面的图片按照顺序生成 md5 值,将
md5 值作为键,对应的序号作为值创建字典,然后 a、k 的文件夹用 for 循环依次遍历,每
次都计算图片的 md5 值,然后去查字典,取出相应的数值,由此可以得到两个坐标数组,
但是我在 md5 的代码写完运行之后发现,两张不同图片分割后虽然内容相同,但是图片的
md5 值不同,所以要想别的办法;

将a与k图像进行识别匹配,并将坐标保存,绘制为图像

图像识别+绘图脚本

import cv2
import numpy as np
import os
import turtle as t
import time
images=[]
x=[0 for i in range(343)]
y=[0 for i in range(343)]
 
 
for cuedir,dirs,filename in os.walk('C:\\Users\\Lenovo\\Desktop\\cuted'):
    for files in filename:
        f=eval(files.split(".")[0])#将.前面文件名单独储存,并化为数字
        images.append(f)#储存文件夹内的图片名称
images.sort()#整理文件名顺序
 
 
img_rgb = cv2.imread('C:\\Users\\Lenovo\\Desktop\\a.png')#识别图
img_gray = cv2.cvtColor(img_rgb, cv2.COLOR_BGR2GRAY)
#shape函数是numpy.core.fromnumeric中的函数,它的功能是读取矩阵的长度
for i in range(len(images)):
    template = cv2.imread(f'C:\\Users\\Lenovo\\Desktop\\cuted\\{images[i]}.png', 0)  # 识别模板
    h, w = template.shape[:2]  # 读取宽高
    result = cv2.matchTemplate(img_gray, template, cv2.TM_CCOEFF_NORMED)#标准相关匹配
    threshold = 0.9
    # 取匹配程度大于%90的坐标
    loc = np.where(result >= threshold)
    #print(loc)
    # np.where返回的坐标值(x,y)是(h,w),注意h,w的顺序
    for pt in zip(*loc[::-1]):
        #print(pt)
        m=pt[0]//53
        x[m]=images[i]
        bottom_right = (pt[0] + w, pt[1] + h)
        cv2.rectangle(img_rgb, pt, bottom_right, (0, 0, 255), 2)
cv2.imwrite("C:\\Users\\Lenovo\\Desktop\\x.jpg", img_rgb)
img_rgb = cv2.imread('C:\\Users\\Lenovo\\Desktop\\k.png')#识别图
img_gray = cv2.cvtColor(img_rgb, cv2.COLOR_BGR2GRAY)
#shape函数的功能是读取矩阵的长度
for i in range(len(images)):
    template = cv2.imread(f'C:\\Users\\Lenovo\\Desktop\\cuted\\{images[i]}.png', 0)  # 识别模板
    h, w = template.shape[:2]  # 读取宽高
    result = cv2.matchTemplate(img_gray, template, cv2.TM_CCOEFF_NORMED)#标准相关匹配
    threshold = 0.9
    # 取匹配程度大于%90的坐标
    loc = np.where(result >= threshold)
    #print(loc)
    # np.where返回的坐标值(x,y)是(h,w),注意h,w的顺序
    for pt in zip(*loc[::-1]):
        #print(pt)
        m=pt[0]//53
        y[m]=images[i]
        bottom_right = (pt[0] + w, pt[1] + h)
        cv2.rectangle(img_rgb, pt, bottom_right, (0, 0, 255), 2)
cv2.imwrite("C:\\Users\\Lenovo\\Desktop\\y.jpg", img_rgb)#保存识别后的图片
cv2.waitKey(0)
for i in range(0,343):
    print(f'{x[i]} {y[i]}')
'''with open('C:\\Users\\Lenovo\\Desktop\\gnuplot.txt','w') as gn:
    for i in range(0,342):
        gn.write(f'{x[i]} {y[i]}\n')#坐标导出为一个txt文件'''
#绘制模块
t.speed(100)
t.pu()
for i in range(0,343):
    t.goto(y[i]*5,-x[i]*5)
    t.pd()
    t.circle(1,360)
    t.pu()
time.sleep(1000)#方便截图

 如果发现输出图片是反的,可以将x,y的位置互换一下

第十六届CISCN复现MISC——国粹

 

到了这里,关于第十六届CISCN复现MISC——国粹的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 2022第十五届全国大学生信息安全竞赛(ciscn)西南赛区部分WP

    EzSignin 访问题目flag是假的,F12源代码,看到base64解码 解码得到flag CODE 访问题目,有个aid.php直接访问不行,使用PHP为协议进行读取,input2需要等于Welcone!,这里要使用data协议编码一下,input3可以随便输入 得到aid.php的代码 很明显的反序列化,直接构造payload: exp: base64解码得

    2024年02月06日
    浏览(50)
  • 第十六届“华中杯”大学生数学建模挑战赛C题思路

    光纤传感技术是伴随着光纤及光通信技术发展起来的一种新型传感器技术。它是以光波为传感信号、光纤为传输载体来感知外界环境中的信号,其基本原理是当外界环境参数发生变化时,会引起光纤传感器中光波参量(如波长、相位、强度等)的变化,即外界信号变化会对光

    2024年04月25日
    浏览(32)
  • 2023第十六届“认证杯”数学建模网络挑战赛第一阶段比赛经历分享

    个人名片: 🐅作者简介:一名大二在校生,热爱生活,爱好敲码! 💅个人主页 🥇:holy-wangle ➡系列内容: 🖼️ tkinter前端窗口界面创建与优化 🖼️ Java实现ATP小系统 ✨个性签名: 🍭不积跬步,无以至千里;不积小流,无以成江海          好久没写文章了,今天

    2024年02月10日
    浏览(47)
  • 第十六届“华中杯”大学生数学建模挑战赛(B题)深度剖析|建模完整过程+详细思路+代码全解析

    问题1的建模过程如下: 假设信号灯周期固定不变,且已知所有车辆的行车轨迹,我们可以建立如下模型来估计信号灯的红绿周期: 首先,我们需要定义一些符号: T s i g n a l T_{signal} T s i g na l ​ :信号灯的红绿周期,单位为秒 T t r a c k T_{track} T t r a c k ​ :车辆行车轨迹数

    2024年04月28日
    浏览(86)
  • "科来杯"第十届山东省大学生网络安全技能大赛决赛复现WP

    🆑 从朋友那里得来的附件,感觉题目有意思,简单复现一下 1、题目信息 2、解题方法 考察二进制和八进制转换 首先写个脚本把数据转化为字符串便于使用 然后进行转化 exp: 得到 Cyber解即可 1、题目信息 2、解题方法 Base64换表爆破 exp: 直接控制台运行   1、题目信息 一张

    2024年02月08日
    浏览(50)
  • 【中医推荐】33部中医书籍,中医医书精品(在线免费阅读),值得珍藏的国粹,涵盖中药、针灸、推拿、按摩、拔罐、气功,食疗等诸多领域

    中医诞生于原始社会,春秋战国时期中医理论已基本形成,之后历代均有总结发展。除此之外对汉字文化圈国家影响深远,如日本医学、韩国韩医学、朝鲜高丽医学、越南东医学等都是以中医为基础发展起来的。 中医承载着中国古代人民同疾病作斗争的经验和理论知识,是在

    2024年02月05日
    浏览(52)
  • 聊聊CentOS停止维护,要我说这是件大好事!

    大家好,我是飞哥! 相信大家都听说过CentOS即将停止维护的事。今天就这件事,我来聊聊我的看法。 我认为这在国内的技术圈内是个利大于弊的好消息 。 关于这件事,可能大部分同学还都只是粗浅地吃过1-2次瓜而已,并没有搞懂其中的缘由。其背景是这样的。 在过去的很

    2024年02月10日
    浏览(38)
  • 我说用count(*)统计行数,面试官让我回去等消息...

    前言 1 count(*)为什么性能差? 2 如何优化count(*)性能? 2.1 增加redis缓存 2.2 加二级缓存 2.3 多线程执行 2.4 减少join的表 2.5 改成ClickHouse 3 count的各种用法性能对比 最近我在公司优化过几个慢查询接口的性能,总结了一些心得体会拿出来跟大家一起分享一下,希望对你会有

    2024年02月08日
    浏览(44)
  • 【Linux】天天直接IO?我说停停,不如试试文件缓冲区

    收录于【Linux】文件系统 专栏 关于文件描述符与文件重定向的相关内容可以移步 文件描述符与重定向操作。 可以到 浅谈文件原理与操作 了解文件操作的系统接口。 目录 系列文章 揭秘C库文件结构体  文件缓冲区 为什么需要文件缓冲区 刷新机制 内核文件缓冲区 模拟实

    2024年02月09日
    浏览(104)
  • ciscn2022-线上-半决-pwn

    一个简单的可见字符shellcode 用杭电师傅的工具直接出shellcode,直接写进出就可以拿到shell。 epx: number是4个字节,后面malloc的参数也是4个字节,可以利用溢出使number很大,然后malloc申请的大小也在一个合理的范围之内。 malloc函数的实现会根据分配内存的size来决定使用哪个分配

    2024年02月06日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包