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

路由器安全研究:D-Link DIR-823G v1.02 B05 复现与利用思路

前言

D-Link DIR-823G v1.02 B05存在命令注入漏洞,攻击者可以通过POST的方式往 /HNAP1发送精心构造的请求,执行任意的操作系统命令。

漏洞分析

Image

binwalk提取固件,成功获取到固件。

Image

Image

现在我们已经进入到应用里了,那么我们在进行分析固件的时候,应该怎么去分析这个情况?首先,我们去分析别人的漏洞,别人是会告诉哪里会出现问题。但是我们现在假设我们是分析一个未知固件,我们就得先知道这个固件有哪些应用,启动了哪些服务,最清晰和简便的方式就是去看我们etc文件下面,里面有个叫init.d的目录,里面是关于启动项的内容。

Image

我们首先来看rcS下面的内容 vim rcS

首先是设置ip,然后挂载了两个文件系统分别是proc,这是与进程相关的文件系统,包括当前进程启动存放在哪个地址。

还有ramfs文件系统,根据以前的笔记,可知ramfs文件系统跟RAM相关。

帮助网安学习,全套资料S信免费领取:
① 网安学习成长路径思维导图
② 60+网安经典常用工具包
③ 100+SRC分析报告
④ 150+网安攻防实战技术电子书
⑤ 最权威CISSP 认证考试指南+题库
⑥ 超1800页CTF实战技巧手册
⑦ 最新网安大厂面试题合集(含答案)
⑧ APP客户端安全检测指南(安卓+IOS)

然后下面就是判断是否还有挂载别的文件系统。

然后mkdir就是创建各种各样的文件夹,都有对应的功能,比如说创建了pptp文件夹,针对拨号上网的功能,然后还有smbd服务,可以看到创建了一个usb的文件夹,说明该固件有可以跟usb也就是U盘相关的操作,接下来都是一些配置信息。

Image

继续往下翻

可以看到该固件启动了web server的web服务,也就是httpd的内容,这里启动的是goahead,通过这个名字,我们可以确定web服务就是goahead,如果想要分析web服务的话,就直接分析goahead就可以。

Image

我们回到squashfs-root目录下,搜索goahead的一些简单情况

grep -ir "goahead" .

Image

最下面是两个启动项的内容,可以忽略,然后第一行是bin的可执行应用,这个其实就是我们最后分析的内容。

那如何分析呢?它是一个HNAP1请求,那就可以去检索我们的HANP1请求

grep -ir "HNAP1" .

Image

可以看到它检索到一些js代码,js代码对我们来说一般,(比较我们是找二进制相关的漏洞)

但是,我们可以发现它匹配了一个二进制程序,也就是goahead。

这里我们先科普一下goahead的一些情况:

GoAhead ,它是一个源码,免费、功能强大、可以在多个平台运行的嵌入式WebServer。

goahead的websUrlHandlerDefine函数允许用户自定义不同url的处理函数。

它在进行编写与它相关的请求,是通过websUrlHandlerDefine来确定的。

websUrlHandlerDefine(T("/HNAP1"),NULL,0, websHNAPHandler,0);
websUrlHandlerDefine(T("/goform"),NULL,0, websFormHandler,0);
websUrlHandlerDefine(T("/cgi.bin"),NULL,0, websCgiHandler,0);

使用ghidra进行逆向分析,goahead二进制文件在squashfs-root目录下的bin目录下

Image

那进入到goahead反编译界面该如何分析呢?一种是找到main函数去进行分析,比较耗时

一种是通过关键字来搜索,反推调用情况,来推测每个功能的解析情况 ctrl+shift+E

Image

匹配成功,停在指定区域

Image

但是它所对应的反编译代码还是很多的,所以我们可以通过反编译出来的函数名,进行查看它的调用关系。

Image

一路往下翻,终于找到我们所要的东西

Image

而且我们看到,这个函数继续往上调的话就是main函数了,所以其实一开始也是可以从main函数来分析的(0.0)

所以现在我们可以重点来分析这个函数

Image

前面还是做一些判断,然后请求还有不止HNAP1,对应的都是一个函数。

同一个函数做的事情,类似于websUrlHandlerDefine这个函数,那HANP1对应的函数是

FUN_0042383c,那就双击进去看看

Image

这里就是漏洞点,这里执行了memset和snprintf,一般来说这里应该是不存在漏洞点,但是下面一条语句是system,也就是把格式化化的字符串直接就拿到了system函数作为参数传递进去,而snprintf这里的参数有个echo,有个单引号问题。

比如说正常代码

#!/bin/bash
read -p "Enter your name: " name
echo 'Hello, '$name'!'

攻击步骤

正常输入:用户输入 Alice,输出:

Hello, Alice!

恶意输入:用户输入 '$(id)',此时脚本实际执行的命令变为:

echo 'Hello, ''$(id)'!'

输出:

Hello, $(id)!

单引号内的 $(id) 不会被执行,暂时安全。

更危险的输入:用户输入 ' && rm -rf / #,命令变为:

echo 'Hello, '' && rm -rf / #'!

此时,第一个单引号被用户输入的 ' 闭合。&& rm -rf / 成为独立命令,在 echo 之后执行。# 注释掉后续的 '!,避免语法错误。

那么会导致rm -rf / 会被执行,删除系统文件!

所以,如果我们构造一些恶意的代码写入到snprintf中,再传递到system函数,就会造成命令注入漏洞。

但是我们要进到漏洞点的话,还需要满足函数上面的一些要求。

所以我们得符合上面函数的一些限制才能进入到漏洞点来,这里先取了PTR_s_SetMultipleActions_00588d80的首地址,赋值给DAT_0058a6c4,然后DAT_0058a6c4自身判断和自加2来进行循环判断,用strstr函数查找DAT_0058a6c4在param_+0x524中出现的位置,并赋值给pcVar1,如果pcVar1的值不为0的话,就会进入到我们的漏洞点来。

Image

DAT_0058a6c4与PTR_s_SetMultipleActions_00588d80相关,双击进去看看

Image

可以看到里面都是它对应的一些方法,比如说SetMultipleActions之类的。

固件模拟

分析到这里,基本上是明朗了,接下来就要进行固件模拟操作,使用firmadyne模拟固件启动。

Image

sudo ./DIR823G_V1.0.2B05_20181207.sh

然后firmadyne默认的密码就是firmadyne

Image

得等一段时间,然后192.168.0.1

但是这个一直搞不定,模拟不起来,也不知道是什么原因,排查不出。

然后换成了firmware analysis plus (fap)这个框架,就模拟起来了

Image

等一段时间后,回车,就可以模拟起来了,输入192.168.0.1

Image

进入向导,随便输入点东西

Image

Image

密码8位,输入12345678

Image

然后就开始配置一些内容,同时可以注意到左侧已经把一些数据写入到关键的文件夹中

Image

配置完毕,登录,成功进入路由器

Image

exp编写

#!/usr/bin/env python
#-*- coding:utf-8 -*-import requestsip='192.168.0.1'command="'`echo aaaaaaaaa > /web_mtn/test.txt`'"
length=len(command)headers=requests.utils.default_headers()
headers["Content-Length"]=str(length)
headers["User-Agent"]="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.76 Safari/537.36"
headers["SOAPAction"]='"http://purenetworks.com/HNAP1/GetClientInfo"'
headers["Content-Type"]="text/xml; charset=UTF-8"
headers["Accept"]="*/*"
headers["Accept-Encoding"]="gzip, deflate"
headers["Accept-Language"]="zh-CN,zh;q=0.9,en;q=0.8"payload=command
r=requests.post('http://'+ip+'/HNAP1/', headers=headers, data=payload)

因为是http请求,所以我们使用requests,然后设置ip,设置命令,构造报头,最后post请求将HNAP1,headers和payload都传过去。

Image

Image

复现完毕,ctrl+a 然后x结束固件模拟。

相关文章:

路由器安全研究:D-Link DIR-823G v1.02 B05 复现与利用思路

前言 D-Link DIR-823G v1.02 B05存在命令注入漏洞,攻击者可以通过POST的方式往 /HNAP1发送精心构造的请求,执行任意的操作系统命令。 漏洞分析 binwalk提取固件,成功获取到固件。 现在我们已经进入到应用里了,那么我们在进行分析…...

【蓝桥杯python研究生组备赛】005 数学与简单DP

题目1 01背包 有 N 件物品和一个容量是 V 的背包。每件物品只能使用一次。 第 i 件物品的体积是 vi,价值是 wi。 求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。 输出最大价值。 输入格式 第一行两个整数&a…...

数据仓库是什么,跟数据集成有什么关系

在当今数字化时代,数据已成为企业决策的重要依据。数据仓库作为企业数据管理的核心组件,其重要性不言而喻。那么,数据仓库到底是什么?它与数据集成又有着怎样的关系呢?本文将深入探讨这些问题。 一、数据仓库&#xf…...

鸿蒙NEXT项目实战-百得知识库01

代码仓地址,大家记得点个star IbestKnowTeach: 百得知识库基于鸿蒙NEXT稳定版实现的一款企业级开发项目案例。 本案例涉及到多个鸿蒙相关技术知识点: 1、布局 2、配置文件 3、组件的封装和使用 4、路由的使用 5、请求响应拦截器的封装 6、位置服务 7、三…...

【微服务】SpringBoot整合LangChain4j 操作AI大模型实战详解

目录 一、前言 二、Langchain4j概述 2.1 Langchain4j 介绍 2.1.1 Langchain4j 是什么 2.1.2 主要特点 2.2 Langchain4j 核心组件介绍 2.3 Langchain4j 核心优势 2.4 Langchain4j 核心应用场景 三、SpringBoot 整合 LangChain4j 组件使用 3.1 前置准备 3.1.1 获取apik…...

rust学习笔记16-206.反转链表(递归)

rust函数递归在14中已经提到,接下来我们把206.反转链表,用递归法实现 递归函数通常包含两个主要部分: 基准条件(Base Case):递归终止的条件,避免无限递归。 递归步骤(Recursive Ste…...

Unity 中实例化预制体的完整过程

1.资源加载(Load Asset to Memory) Unity 的资源加载是指将各种资源(如模型、纹理、音频、预制体 等)从存储介质(如磁盘、AssetBundle、远程服务器)到运行时内存的过程,使其成为可用的资源&…...

Unity动画片段丢失(AnimationClip),如何进行重新绑定

从外部导入的AnimationClip存在黄色丢失的missing提示,这时候不需要重新制作动画,只需要重新绑定动画即可。 我们以第一条Intro1:Anchored Position(缺失!)为例 第一步:双击动画中的Intro1条目,可以查看片段存储该动画的对应路径…...

mysql5.7主从部署(docker-compose版本)

mysql5.7主从部署(docker-compose版本) 1:docker-compose-test.yml 文件信息 version: 3services:# MySQL 数据库mysql-master:image: mysql:5.7container_name: mysql-masterenvironment:MYSQL_ROOT_PASSWORD: 123456MYSQL_DATABASE: nacosports:- 23…...

模型部署实战:PyTorch生产化指南

‌一、为什么要做模型部署?‌ 模型部署是将训练好的模型‌投入实际应用‌的关键步骤,涉及: 模型格式转换(TorchScript/ONNX)性能优化(量化/剪枝)构建API服务移动端集成 本章使用ResNet18实现图…...

SQLMesh 系列教程:Airbnb数据分析项目实战

在本文中,我们将探讨如何利用dbt项目的代码库来实现一个简单的SQLMesh项目。本文的基础是基于Udemy讲师为dbt课程创建的示例项目,可以在这个GitHub repo中获得。这个dbt项目是相对完整的示例,我们将使用它作为模板来演示SQLMesh(下…...

LeetCode hot 100 每日一题(11)——189. 轮转数组

这是一道难度为中等的题目,让我们来看看题目描述: 给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。 示例 1: 输入: nums [1,2,3,4,5,6,7], k 3 输出: [5,6,7,1,2,3,4] 解释: 向右轮转 1 步: [7,1,2,3…...

VLAN综合实验

一、实验拓扑 二、实验要求 1、PC1/3处于同一个网段,所在接口为access,属于VLAN 2。 2、PC2/4/5/6处于同一网段。 3、PC2可以访问PC4/5/6。 4、PC4可以访问PC5,但不能访问PC6。 5、PC5不能访问PC6。 6、所有PC通过DHCP获取IP地址&#…...

杨辉三角(js实现,LeetCode118)

看到这道题我的第一反应是找规律,核心突破点是numRows这个参数,杨辉三角的第numRows行拥有的元素数量为numRows个,并且头尾都是1,由此我们可以通过双层for循环,先生成每一行的数组,然后将每一行的数组push进…...

C语言复习笔记--数组

今天继续来浅浅推进一下C语言的复习,这次是数组的复习,话不多说,正文开始. 数组的概念 数组是⼀组相同类型元素的集合,一种自定义类型.数组中元素个数不能为0.数组分为⼀维数组和多维数组,多维数组⼀般⽐较多⻅的是⼆维数组. 下面从一维数组说起. 一维数组的创建和…...

Linux操作系统实验报告单(3)文本编辑器vi/vim

一、实验目的 掌握vi/vim编辑器的进入和退出方式了解vi/vim的三种模式熟练vi/vim的操作命令 二、实验内容 1.在家目录下新建一个名为“vitest_name”(“name”为学生姓名拼音)的目录。 ●创建用户目录命令:sudo mkdir /home/vitest_lw3613 …...

docker linux 常用操作命令

以下是 Docker 的常见操作命令及其简单介绍,帮助你快速上手 Docker 的基本使用: 1. 镜像操作 拉取镜像 docker pull 镜像名称:标签示例: docker pull ubuntu:20.04从 Docker Hub 拉取 Ubuntu 20.04 镜像。 拉取镜像 docker build -t"…...

除自身以外数组的乘积——面试经典150题(力扣)

题目 给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O(n) 时…...

打破煤矿通信屏障,无线系统赋能生产安全与智能进阶

项目背景 在煤矿行业智能化转型的浪潮中,七台河矿业局积极回应国家煤矿智能化建设的号召,采取了具有前瞻性的战略举措——在七台河地区的煤矿部署了“井上井下”无线覆盖与广播一体化系统。此举旨在消除井上与井下之间的通信障碍,加强矿业局与…...

DeepSeek + Kimi 自动生成 PPT

可以先用deepseek生成ppt大纲,再把这个大纲复制到Kimi的ppt助手里: https://kimi.moonshot.cn/kimiplus/conpg18t7lagbbsfqksg 选择ppt模板: 点击生成ppt就制作好了。...

Blender标注工具

按住键盘D键 鼠标左键绘制 / 右键擦除 也可以在上方选择删除...

鸿蒙开发:远场通信服务rcp拦截器问题

前言 本文基于Api13。 上篇文章,简单的对rcp中的会话问题做了概述,本篇文章,我们聊一聊rcp中的拦截器问题,按照正常开发,其实拦截器中也不存在问题的,毕竟都是很官方的开发方式,但是在结合了创建…...

调研报告:Hadoop 3.x Ozone 全景解析

Ozone 是 Hadoop 的分布式对象存储系统,具有易扩展和冗余存储的特点。 Ozone 不仅能存储数十亿个不同大小的对象,还支持在容器化环境(比如 Kubernetes)中运行。 Apache Spark、Hive 和 YARN 等应用无需任何修改即可使用 Ozone。Ozone 提供了 Java API、S3 接口和命令行接口…...

Thinkphp 多文件压缩

控制器 <?phpnamespace app\api\controller; use think\Controller; use think\facade\Db; use think\facade\Request;use ZipArchive;class DrugTestResult {public function download(){if(Request::isPost()){$data Request::post();$idnumber Request::param(idnumb…...

NGINX中的反向代理实践

以下是一个全面和优化的配置示例&#xff0c;包括了错误处理、超时设置、头部信息调整等&#xff1a; server {listen 80;server_name your.domain.name; # 替换为你的实际域名或IP地址# 前端应用的静态资源处理location / {root /path/to/vue/dist; # Vue 应用的dist目录try_…...

redis分布式锁实现Redisson+redlock中watch dog是如何判断当前线程是否持有锁进行续租的呢?

在 Redis 中&#xff0c;Watch Dog&#xff08;看门狗&#xff09;机制主要用于实现分布式锁的自动续期&#xff08;如 Redisson 的 RedLock 实现&#xff09;。其核心目的是确保当业务逻辑执行时间超过锁的初始过期时间&#xff08;leaseTime&#xff09;时&#xff0c;锁不会…...

[spring] Spring JPA - Hibernate 多表联查 1

[spring] Spring JPA - Hibernate 多表联查 1 之前在 [spring] spring jpa - hibernate 名词解释&配置 和 [spring] spring jpa - hibernate CRUD 简单的学习了一下怎么使用 Hibernate 实现 CRUD 操作&#xff0c;不过涉及到的部分都是逻辑上比较简单的实现——只在一张表…...

在 Elasticsearch 中探索基于 NVIDIA 的 GPU 加速向量搜索

作者&#xff1a;来自 Elastic Chris Hegarty 及 Hemant Malik 由 NVIDIA cuVS 提供支持&#xff0c;此次合作旨在为开发者在 Elasticsearch 中的向量搜索提供 GPU 加速。 在 Elastic Engineering 组织内&#xff0c;我们一直致力于优化向量数据库的性能。我们的使命是让 Lucen…...

2025年图生视频模型技术全景解析

一、开源图生视频模型 阿里通义万象Wan2.1系列 I2V-14B-480P&#xff1a; 14B参数基础模型支持480P分辨率图生视频显存需求16GB以上 I2V-14B-720P&#xff1a; 高清增强版模型采用分帧渲染技术&#xff0c;输出分辨率达1280720 技术特性&#xff1a; 支持中文提示词自动解析内置…...

Docker build 会在本地产生巨大的文件

Docker build 会在本地产生巨大的文件&#xff0c; 比如 用 这个命令列出本地镜像 docker images 可见size都是很大的&#xff0c; 到docker目录下&#xff0c;看到ext4.vhdx的大小 80多G 那只能用这个命令把不用的镜像删掉了&#xff1a; &#xff08;rmi后面是镜像id&a…...

使用LLaMA Factory微调导出模型,并用ollama运行,用open webui使用该模型

本篇记录学习使用llama factory微调模型的过程&#xff0c;使用ollama运行微调好的模型&#xff0c;使用open webui前端调用ollama的模型&#xff1b; 测试机信息&#xff1a; 系统&#xff1a;Ubuntu 24.04.2 LTS&#xff08;桌面版&#xff09; cpu&#xff1a;i9-14900KF …...

Git远程拉取和推送配置

Git进行远程代码拉取和推送时候提示配置user.name 和 user.email 背景&#xff1a;换新电脑后使用Git进行代码拉取和推送过程中&#xff0c;提示“Make sure you configure your “user.name” and “user.email” in git.”。这个配置针对git的正常使用仅需要配置一次&#xf…...

正则魔法:解码 return /^\d+$/.test(text) ? text : ‘0‘ 的秘密

&#x1f680; 正则魔法&#xff1a;解码 return /^\d$/.test(text) ? text : 0 的秘密 &#x1f31f; 嘿&#xff0c;技术探险家们&#xff01;&#x1f44b; 今天我们要破解一段看似简单的代码&#xff1a;return /^\d$/.test(text) ? text : 0。它藏在一个 Vue 前端组件中…...

[023-01-47].第47节:组件应用 - GetWay与 Sentinel 集成实现服务限流

SpringCloud学习大纲 一、需求说明&#xff1a; 实现网关cloudalibaba-sentinel-gateway9528模块保护cloudalibaba-provider-payment9001 二、编码实现&#xff1a; 2.1.建module: 新建模块&#xff0c;名称是&#xff1a;cloudalibaba-sentinel-gateway9528 2.2.改pom &l…...

【自用】NLP算法面经(5)

一、L1、L2正则化 正则化是机器学习中用于防止过拟合并提高模型泛化能力的技术。当模型过拟合时&#xff0c;它已经很好地学习了训练数据&#xff0c;甚至是训练数据中的噪声&#xff0c;所以可能无法在新的、未见过的数据上表现良好。 比如&#xff1a; 其中&#xff0c;x1和…...

AI视频生成产品体验分享(第2趴):Vidu、Hailuo、Runway、Pika谁更胜一筹?

hi&#xff0c;大家&#xff0c;继上次体验完可灵、即梦和pixverse&#xff0c;今天打算从产品经理的角度再研究下Vidu、Hailuo、Runway、Pika这几款产品&#xff01;欢迎加入讨论&#xff01; 一、产品简介 1. Vidu&#xff1a;国产自研的「一致性标杆」 &#x1f4cc;官网…...

火绒终端安全管理系统V2.0——行为管理(软件禁用+违规外联)

火绒终端安全管理系统V2.0&#xff1a;行为管理策略分为软件禁用和违规外联两部分&#xff0c;能够管理终端用户软件的使用&#xff0c;以及终端用户违规连接外部网络的问题。 l 软件禁用 软件禁用策略可以选择软件名单的属性、添加软件名单以及设置发现终端使用禁用软件时的…...

台式机电脑组装---电脑机箱与主板接线

台式机电脑组装—电脑机箱与主板接线 1、机箱连接主板的跳线一般主要有USB 2.0、USB 3.0、前置音频接口(HD_AUDIO)以及POWER SW、RESET SW、POWER LED、HDD LED四个主板跳线&#xff0c;这些跳线分别的含义如下。 RESET SW&#xff1a;机箱重启按键&#xff1b;注&#xff1a…...

【总结】常用API架构类型

引言 在现代软件开发中&#xff0c;API(应用程序编程接口)已经成为各类系统之间交互的核心。不同的 API 架构类型适用于不同的业务需求和技术场景&#xff0c;选择合适的架构可以提高系统的性能、可维护性和扩展性。本文将介绍几种常见的 API 架构类型&#xff0c;并分析它们的…...

ffmpeg库视频硬解码使用流程

FFmpeg 的硬解码&#xff08;Hardware Decoding&#xff09;通过调用 GPU 或专用硬件的编解码能力实现&#xff0c;能显著降低 CPU 占用率。 ‌一、FFmpeg 支持的硬件解码类型‌ FFmpeg 原生支持多种硬件加速类型&#xff0c;具体由 AVHWDeviceType 定义&#xff0c;包括&…...

两个常用的用于读写和操作DXF文件C#库:netDxf 和 DXF.NET

netDxf 和 DXF.NET 是两个常用的C#库&#xff0c;用于读取、写入和操作DXF文件。以下是它们的详细介绍和用法示例。 1. netDxf 简介 netDxf 是一个开源的DXF文件读写库&#xff0c;支持AutoCAD DXF格式的读取和写入。它支持大多数DXF实体和对象&#xff0c;并且易于使用。 Gi…...

jmeter吞吐量控制器-Throughput Controller

jmeter吞吐量控制器-Throughput Controller 新增吞吐量控制器名词解释测试场景场景1&#xff1a;场景2&#xff1a;场景3场景4场景5场景6场景7场景8 测试结论 根据百分比执行不同的接口测试场景测试结果 新增吞吐量控制器 名词解释 Based on: Total Executions(总执行数)/Perc…...

windows 平台编译openssl

文章目录 准备环境安装perl安装NASM获取源码 源码编译配置编译 准备环境 安装perl 下载Perl 5.40.0.1 Portable zip strawberryperl 解压后设置系统环境变量 测试安装是否成功 perl --versionThis is perl 5, version 40, subversion 0 (v5.40.0) built for MSWin32-x64-m…...

【Linux】Makefile秘籍

> &#x1f343; 本系列为Linux的内容&#xff0c;如果感兴趣&#xff0c;欢迎订阅&#x1f6a9; > &#x1f38a;个人主页:【小编的个人主页】 >小编将在这里分享学习Linux的心路历程✨和知识分享&#x1f50d; >如果本篇文章有问题&#xff0c;还请多多包涵&a…...

Python散点图(Scatter Plot):数据探索的“第一张图表”

在数据可视化领域,散点图是一种强大而灵活的工具,它能够帮助我们直观地理解和探索数据集中变量之间的关系。本文将深入探讨散点图的核心原理、应用场景以及如何使用Python进行高效绘制。 后续几篇将介绍高级技巧、复杂应用场景。 Python散点图(Scatter Plot):高阶分析、散点…...

Spring AI Alibaba快速使用

AI 时代&#xff0c;Java 程序员也需要与时俱进&#xff0c;这两个框架必须掌握。 一个是 Spring AI一个是 Spring Alibaba AI。 Spring AI 是一个AI工程领域的应用程序框架&#xff0c;它的目标是将 Spring生态系统的设计原则应用于人工智能领域。 但是&#xff0c; Spring…...

Redis 跳表原理详解

一、引言 在 Redis 中&#xff0c;有序集合&#xff08;Sorted Set&#xff09;是一种非常重要的数据结构&#xff0c;它可以实现元素的有序存储和高效查找。而实现有序集合的底层数据结构之一就是跳表&#xff08;Skip List&#xff09;。跳表是一种随机化的数据结构&#xff…...

安全地自动重新启动 Windows 资源管理器Bat脚本

安全地自动重新启动 Windows 资源管理器脚本 可以直接运行的 Windows 批处理脚本&#xff0c;用于安全地自动重新启动 Windows 资源管理器。该脚本会在杀死资源管理器之前检查是否有其他进程正在使用资源管理器相关的文件。 Bat脚本 echo off title 资源管理器安全重启工具 co…...

【C++模板】

模板初阶 前言1.定义模板2.函数模板2.1定义2.2实例化函数模板2.3模板参数的匹配原则 3.类模板3.1类模板实例化 前言 模板是C中泛型编程的基础&#xff0c;一个模板就是一个创建类和函数的蓝图或公式。 1.定义模板 假定我们希望编写一个函数来比较两个值&#xff0c;并指出第…...

基于Debian搭建FTP服务器

操作系统 Debian-9.6.0-amd64&#xff0c;图形化安装 基础操作 1.软件安装管理 命令方式&#xff1a; 在线安装 sudo apt-get install vim/ifconfig 查看安装软件 dpkg -l 图形化桌面方式 &#xff1a; 通过“软件管理”工具管理 2.网络管理 /etc/network/interfaces 3.文本…...