动态漏洞利用框架:从静态Exploit到自适应运行时攻击引擎

news2026/5/8 14:09:25
1. 项目概述一个动态化的运行时漏洞利用框架在安全研究领域漏洞利用Exploit的开发与测试是核心且极具挑战性的工作。传统的漏洞利用代码往往是静态、一次性的针对特定版本的程序、特定的操作系统环境编写。一旦目标环境稍有变化比如系统补丁更新、内存布局随机化ASLR强度不同、甚至只是程序的一个小版本迭代之前精心构造的利用链就可能完全失效。这导致安全研究员和渗透测试人员需要花费大量时间进行重复性的环境适配和代码调整工作。DynamicExploit/runtm这个项目从其命名上就透露出一种截然不同的思路。DynamicExploit直译为“动态漏洞利用”而runtm很可能意指“运行时管理器”Runtime Manager。结合起来看这个项目的核心目标是构建一个能够在运行时动态适应目标环境、智能调整利用策略的漏洞利用框架。它不是一个单一的漏洞利用脚本PoC而是一个平台或引擎旨在将研究员从繁琐的、与漏洞本质无关的环境适配工作中解放出来专注于漏洞原理本身和利用逻辑的构建。简单来说你可以把它想象成一个“智能漏洞利用机器人”。你告诉它目标程序存在一个什么样的漏洞比如栈溢出、UAF、类型混淆并提供一些基础的利用原语比如能读能写或者能调用某个函数这个框架就能自动探测当前运行时的具体状态如库版本、内存地址、保护机制开启情况并动态地组合利用链最终稳定地获取你想要的执行效果如弹个计算器、获取反向Shell。这对于面对复杂多变的内网环境、开启了全量防护机制的现代应用以及进行大规模自动化安全评估的场景具有革命性的意义。本篇文章我将从一个安全从业者的角度深度拆解这类动态漏洞利用框架的核心思想、技术实现难点、以及如何构建一个最小可用的原型。无论你是想深入理解高级利用技术还是有意参与此类开源项目抑或是单纯想提升自己的漏洞利用编写水平相信都能从中获得启发。2. 核心设计思想与技术架构拆解一个动态漏洞利用框架其设计必然围绕“动态”和“自适应”这两个关键词展开。这不仅仅是代码编写技巧更是一套系统工程思维。2.1 从静态Exploit到动态引擎的范式转变传统的静态Exploit其工作流程是线性的、确定的环境分析研究员手动分析目标环境OS版本、GLIBC版本、防护机制。静态构造基于分析结果硬编码所有必要地址如system地址、/bin/sh字符串地址、Gadget地址和偏移量到Exploit代码中。一次性执行运行Exploit成功或失败。失败后回到步骤1重新分析调整。这种模式的痛点非常明显脆弱和低效。DynamicExploit/runtm所代表的动态范式其流程是循环的、自适应的目标与约束定义用户定义利用的最终目标如执行任意命令和提供的初始能力如一个任意地址写漏洞。运行时探测框架自动发起一系列安全的、非破坏性的探测操作收集运行时信息。策略规划与链生成根据探测结果和内置的漏洞利用知识库动态规划一条或多条可能的利用路径利用链。动态执行与反馈调整执行利用链并监控执行结果。如果某一步失败例如因为地址随机化导致跳转失败框架能根据失败反馈回溯到策略规划阶段选择备用路径或动态计算新的地址然后继续尝试直至达到目标或尝试耗尽。这个范式的核心在于将环境感知和策略调整的过程自动化、内化到框架中。2.2 核心架构模块设计要实现上述动态范式框架的架构通常需要包含以下几个关键模块执行环境抽象层这是框架的基石。它需要抽象不同目标本地进程、远程服务、不同操作系统/架构的交互接口。提供统一的读写内存、执行代码、查询模块信息等原语。例如对本地进程可能通过ptrace或FUSE进行交互对远程服务则通过网络套接字。运行时信息收集器这是框架的“眼睛”。负责自动化收集所有影响利用的关键信息内存布局通过解析/proc/self/mapsLinux或类似接口获取所有加载模块的基地址从而绕过ASLR。它需要能区分主程序、共享库libc, ld、堆、栈等区域。防护机制状态检测NXDEP、Stack Canary、RELROFull/Partial、CFI等是否启用及具体强度。例如可以通过尝试执行堆栈上的代码来探测NX通过观察特定结构体的函数指针是否可写来探测RELRO。符号与Gadget数据库虽然动态探测能获取地址但需要知道符号名。框架需要内置或能动态生成一个针对当前目标模块的Gadget数据库。这通常通过集成类似ROPgadget、ropper的工具或者自己解析ELF/PE文件的代码段来实现。堆状态与分配器信息对于堆相关漏洞需要探测堆分配器的类型glibc ptmalloc, tcmalloc, jemalloc及其内部状态如main_arena地址。利用策略规划器这是框架的“大脑”。它包含一个漏洞利用知识图谱。当用户指定漏洞类型如“栈溢出可控返回地址”和期望目标如“获取shell”后规划器会根据当前收集的运行时信息从知识库中匹配可行的利用技术如ret2libc, ROP, JOP, COP, 堆风水等并动态计算出具体的利用链。例如如果探测到NX开启且ASLR开启规划器会自动选择ROP技术并动态搜索可用的pop rdi; retgadget和system函数地址。动态Payload生成与注入器这是框架的“双手”。根据规划器输出的利用链生成最终的二进制Payload。这个Payload可能不是完全静态的可能包含一些“占位符”框架在注入前才会将动态计算出的地址填充进去。同时它要负责以最合适的方式覆盖返回地址、修改函数指针、堆块塑造等将Payload送入目标进程。执行监控与反馈循环这是框架的“小脑”。负责监控利用链的执行过程。如果发生崩溃Segmentation Fault或执行流偏离预期监控器需要能捕获这些信号例如通过信号处理或调试器事件并将失败信息反馈给规划器触发重试或策略切换。2.3 关键技术难点与应对思路构建这样一个框架面临诸多挑战探测的隐蔽性与安全性探测行为本身不能导致目标崩溃或触发异常警报。例如探测栈地址时可能需要通过一些合法的函数调用链来间接推断而不是直接读取栈指针。这需要精巧的设计。状态空间的爆炸面对一个复杂的漏洞和开启了多种防护的目标可能的利用路径组合非常多。规划器需要高效的搜索算法如基于约束求解、图搜索算法来快速找到可行解而不是暴力枚举。通用性与性能的权衡为了通用性框架可能会引入一定开销如动态Gadget搜索。需要在设计时考虑缓存机制将一次探测的结果缓存起来和启发式规则优先尝试最常见、最稳定的利用技术。对抗高级防护面对CFGControl Flow Guard、PACPointer Authentication CodeARM等更高级的防护动态框架也需要集成相应的绕过研究。这要求框架具备良好的可扩展性方便安全研究员为其添加新的利用策略模块。3. 构建一个最小化动态ROP框架原型为了更具体地理解DynamicExploit/runtm这类项目的内涵我们不妨动手设计一个最小化的动态ROP框架原型。这个原型将聚焦于Linux x86_64环境下针对有NX和ASLR保护、存在栈溢出漏洞的程序实现自动化的ret2libc攻击。3.1 原型目标与组件定义我们的最小化原型称之为MiniDynROP需要完成以下任务自动附加到目标进程。自动探测libc的加载基地址绕过ASLR。自动在libc中搜索system函数和字符串/bin/sh的地址。自动在libc中搜索必要的ROP gadget如pop rdi; ret。根据栈溢出偏移量动态构造ROP链并注入。执行并获取shell。核心组件如下调试器模块使用ptrace系统调用实现进程附着、内存读写、寄存器控制、继续执行等基础调试功能。内存映射解析器读取目标进程的/proc/[pid]/maps文件解析出libc.so的映射基地址。ELF解析与符号查找器解析libc的ELF文件头动态定位system函数和字符串/bin/sh在libc内的偏移。结合基地址得到运行时绝对地址。Gadget查找器对libc的代码段进行简单的反汇编扫描寻找形如5f c3pop rdi; ret的字节序列。更复杂的原型可以集成capstone反汇编引擎。ROP链构建与注入器根据用户提供的栈溢出偏移量或自动探测计算好ROP链各部分的地址通过调试器模块将链写入目标进程栈上的合适位置并控制指令指针RIP跳转到链的起始处。3.2 详细实现步骤与代码要点以下是一个高度简化的概念性代码流程用于阐述原理#!/usr/bin/env python3 import struct from elftools.elf.elffile import ELFFile import subprocess import sys class MiniDynROP: def __init__(self, target_bin): self.target_bin target_bin self.pid None self.libc_base 0 self.libc_path self.system_addr 0 self.binsh_addr 0 self.pop_rdi_ret_addr 0 def attach_and_find_libc(self): 启动并附加进程查找libc基地址 # 启动目标进程这里假设是一个有漏洞的本地程序 proc subprocess.Popen([self.target_bin], stdinsubprocess.PIPE, stdoutsubprocess.PIPE, stderrsubprocess.PIPE) self.pid proc.pid # 读取 /proc/[pid]/maps 找到libc映射 with open(f/proc/{self.pid}/maps, r) as f: for line in f: if libc in line and r-xp in line: # 可执行代码段 self.libc_base int(line.split(-)[0], 16) self.libc_path line.split()[-1] break if not self.libc_base: raise Exception(Could not find libc in memory maps) def analyze_libc(self): 解析libc文件获取符号和gadget偏移 with open(self.libc_path, rb) as f: elf ELFFile(f) # 1. 查找 system 函数地址 symtab elf.get_section_by_name(.symtab) if symtab: for symbol in symtab.iter_symbols(): if symbol.name system: self.system_addr self.libc_base symbol[st_value] break # 2. 查找字符串 /bin/sh 地址 strtab elf.get_section_by_name(.strtab) # 这里简化处理实际需要遍历 .dynstr 或 .strtab # 假设我们通过其他方式知道了偏移或遍历查找 # 为简化我们假设有一个函数能获取到偏移 offset_binsh offset_binsh self._find_string_offset(elf, b/bin/sh) self.binsh_addr self.libc_base offset_binsh # 3. 在 .text 段搜索 gadget pop rdi; ret (操作码: 5f c3) text_section elf.get_section_by_name(.text) data text_section.data() # 简单字节搜索 (实际应用需更严谨考虑指令对齐) for i in range(len(data) - 1): if data[i] 0x5f and data[i1] 0xc3: # pop rdi; ret self.pop_rdi_ret_addr self.libc_base text_section[sh_addr] i break def _find_string_offset(self, elf, target_string): 在ELF文件的字符串表中查找目标字符串的偏移简化示例 # 实际实现需遍历 .dynstr 或 .strtab 节 # 这里返回一个假设的偏移量 return 0x1b45e5 # 示例偏移实际需要动态计算 def build_rop_chain(self, overflow_offset): 构建ROP链 payload # 假设栈布局 [垃圾数据...][溢出点] # overflow_offset 是从溢出点到返回地址的字节数 payload bA * overflow_offset # ROP链: pop rdi; ret - /bin/sh - system payload struct.pack(Q, self.pop_rdi_ret_addr) # 返回地址被覆盖为 pop rdi; ret payload struct.pack(Q, self.binsh_addr) # pop rdi 的参数即rdi的新值 payload struct.pack(Q, self.system_addr) # ret 跳转到的地址 return payload def exploit(self, overflow_offset): 执行完整利用流程 print([*] Attaching to target and finding libc...) self.attach_and_find_libc() print(f[] Libc base address: {hex(self.libc_base)}) print([*] Analyzing libc for symbols and gadgets...) self.analyze_libc() print(f[] system {hex(self.system_addr)}) print(f[] /bin/sh {hex(self.binsh_addr)}) print(f[] pop rdi; ret {hex(self.pop_rdi_ret_addr)}) print([*] Building ROP chain...) rop_chain self.build_rop_chain(overflow_offset) print([*] Injecting payload...) # 这里需要实际的 ptrace 操作来写入目标进程内存并控制RIP # 例如通过 /proc/[pid]/mem 或 ptrace POKEDATA # self._write_memory(stack_pointer, rop_chain) # self._set_register(rip, address_of_first_gadget) print([] (模拟) Payload injected. Triggering exploit...) # self._continue_execution() print([] Exploit finished (模拟).) if __name__ __main__: if len(sys.argv) 3: print(fUsage: {sys.argv[0]} target_binary overflow_offset) sys.exit(1) target sys.argv[1] offset int(sys.argv[2]) exploiter MiniDynROP(target) exploiter.exploit(offset)注意以上代码是高度概念化和简化的省略了实际的ptrace交互、通过/proc/[pid]/mem的内存读写、寄存器设置、以及处理进程状态等复杂且易错的细节。真实的实现需要大量底层系统编程知识。3.3 从原型到成熟框架的演进路径这个MiniDynROP原型仅仅实现了最基础的功能。一个像DynamicExploit/runtm这样成熟的框架需要在以下方面进行深度扩展多漏洞类型支持从栈溢出扩展到堆溢出、UAF、整数溢出、格式化字符串等。每种漏洞类型都需要特定的原语抽象如“任意地址读”、“任意地址写”、“有限写”和利用策略。多平台与多架构支持 Linux、Windows、macOS、Android 以及 x86, x64, ARM, ARM64, MIPS 等架构。这需要抽象出跨平台的调试接口和CPU上下文处理模块。高级策略规划集成更复杂的利用技术如ret2dlresolve、FSOPFile Stream Oriented Programming、House of系列堆利用技术等。规划器需要能够评估不同策略的成功率和隐蔽性。交互式与自动化结合提供交互式Shell允许研究员手动干预利用过程如手动搜索gadget、手动修改内存同时保留自动化能力。资源与配置管理管理不同的Gadget数据库、符号文件、漏洞模板允许用户自定义脚本扩展框架功能。4. 实战应用场景与高级技巧理解了框架的构造我们来看看它在实际安全工作中能如何大显身手。4.1 场景一CTF竞赛与自动化解题在CTFCapture The Flag比赛中Pwn题目的环境往往是统一的但开启了ASLR和NX。传统做法是写一个静态的Exploit脚本。但如果题目有多个版本或者需要频繁切换本地/远程测试手动调整地址很麻烦。使用动态框架可以编写一个通用的“解题脚本”框架自动连接远程服务或启动本地二进制。自动完成上述的libc基址泄露、gadget查找等步骤。根据题目交互动态构造Payload。如果题目是“菜单堆题”框架甚至可以模拟交互自动进行堆块布局塑造。这不仅能节省比赛时间其脚本本身也更具可读性和可复用性。4.2 场景二企业内部红队评估与自动化武器库在企业红队行动中面对成百上千台主机系统版本、补丁级别、安装的软件可能各不相同。手工为每个目标编写利用代码是不可能的。智能投递框架可以作为自动化攻击链的一部分。当扫描器发现某个服务存在特定漏洞CVE编号时可以自动调用对应的动态利用模块。环境自适应模块会先对目标进行轻量级指纹识别操作系统、服务版本、防护状态然后从知识库中选择或生成最合适的利用载荷。降级利用如果第一选择如64位ROP失败框架可以自动回退到其他技术如32位兼容模式下的ret2libc或尝试信息泄露后二次攻击。这极大地提升了红队行动的效率和成功率。4.3 场景三漏洞研究与利用开发对于漏洞研究员动态框架是一个强大的“试验场”。快速验证发现一个新的漏洞原语如一个特殊的写操作后可以快速在框架中建模让框架尝试自动组合出完整的利用链验证漏洞的可利用性。防护机制评估可以方便地测试新的操作系统防护机制如Linux内核的STATIC_USERMODEHELPER对现有利用技术的影响并探索绕过方法。利用链复现与学习可以将公开的复杂漏洞利用如某个浏览器的RCE链分解成步骤用框架的模块重新实现便于学习和教学。4.4 高级技巧与避坑指南在实际使用或开发此类框架时有一些经验性的技巧和常见的“坑”探测的稳健性不要依赖单一的探测方法。例如获取libc基址除了读/proc/self/maps还可以通过解析link_map结构、利用printf等函数的GOT表泄露等方式进行交叉验证。远程目标可能无法读取maps。处理地址中的空字节在构造Payload时特别是针对字符串操作漏洞如strcpy空字节\x00会截断输入。动态框架在生成Payload时需要智能选择地址避免使用包含空字节的地址或使用编码技术如xor编码来绕过。应对堆对齐与缓存堆利用对内存布局极其敏感。框架的堆操作模块需要考虑不同分配器的对齐规则如glibc的16字节对齐并且在多次尝试时需要有办法“清理”堆状态或重新初始化目标进程确保每次尝试的起点一致。超时与错误处理自动化利用可能陷入死循环或导致目标进程无响应。必须为每一个探测和利用步骤设置合理的超时并有完善的异常处理机制确保框架自身稳定。日志与调试输出详细的日志是调试动态框架的生命线。需要记录下每一个关键决策、探测到的地址、尝试的利用链步骤。这有助于在失败时快速定位问题。5. 常见问题排查与框架调试心得即使有了强大的框架在实际操作中依然会遇到各种问题。这里记录一些典型问题的排查思路。5.1 利用链执行后进程崩溃而非获得Shell问题现象Payload成功注入并执行但目标进程以SIGSEGV崩溃告终。排查思路检查栈对齐在x86_64的System V ABI中call指令执行前要求栈指针RSP16字节对齐。如果你的ROP链以ret跳转到system那么在进入system时RSP可能未对齐。解决方法是在ROP链中加入一个简单的retgadget仅包含c3来调整栈对齐。框架应能自动检测并插入对齐gadget。检查参数位置确认传给system的字符串地址是否正确存入了RDI寄存器x64第一个参数。使用框架的调试功能在跳转前检查寄存器状态。检查内存映射权限确认system函数地址和字符串地址所在的内存页具有可执行X权限。虽然libc的代码段通常可执行但某些极端配置或自定义内存区域可能不是。检查栈空间过长的ROP链或数据可能会覆盖到关键的栈数据导致崩溃。尝试减少链长度或在栈上预留更多空间。5.2 动态探测到的地址与静态分析不一致问题现象框架运行时计算的system地址与用gdb附加后print system命令看到的地址不同。排查思路确认libc版本目标进程使用的libc可能与你本地分析的libc不是同一个文件。检查/proc/[pid]/maps中libc文件的路径和哈希值。框架应记录并报告它正在分析的libc文件路径。检查偏移计算确保框架正确解析了ELF文件。st_value是符号在文件内的偏移需要加上映射基地址而不是节section的虚拟地址sh_addr。sh_addr是节在进程虚拟内存中的地址对于可执行文件加载时通常等于其在文件内的偏移加上基地址。这里容易混淆。考虑PIE位置无关可执行文件如果目标程序本身也是PIE那么它的.text段基址也是随机的。框架需要先泄露或计算程序本身的基址然后才能正确解析程序内部的gadget。5.3 针对远程服务的利用不稳定问题现象本地测试成功率100%但打远程服务时成功率很低。排查思路网络延迟与连接状态远程利用对网络稳定性敏感。框架的网络通信模块需要有重试机制并且要处理好TCP连接在利用过程中可能断开的情况。环境差异远程服务器的libc版本、内核版本、安全策略如seccomp沙箱可能与本地不同。框架的指纹识别模块需要更全面并且要有备用的利用策略。竞争条件特别是堆利用在多线程服务中极易产生竞争条件。框架可能需要引入精确的时序控制如sleep或多次尝试来稳定利用。信息泄露的可靠性如果利用依赖于先泄露一个地址如通过格式化字符串或堆溢出读需要确保泄露的Payload在远程环境下能稳定工作并且解析泄露数据的代码足够健壮能处理网络字节序和可能的传输错误。5.4 框架自身在复杂利用中行为异常问题现象框架在控制进程执行流时卡住或出现不可预知的错误。排查思路ptrace陷阱ptrace是一个强大但棘手的接口。单步执行PTRACE_SINGLESTEP、处理信号SIGTRAP,SIGSTOP需要非常小心。一个常见的坑是在用ptrace继续执行PTRACE_CONT后如果没有正确等待waitpid子进程状态变化可能会导致父子进程同步错乱。务必遵循attach - waitpid - 各种操作 - detach的标准流程。内存操作原子性通过ptrace或/proc/[pid]/mem写内存时如果目标进程是多线程的其他线程可能在你写入的过程中修改同一内存区域。对于关键Payload最好能暂停所有目标线程这本身很复杂或者选择原子性更高的写入方式。资源泄漏确保框架在利用结束后无论成功与否都能正确地detach目标进程并关闭所有打开的文件描述符如/proc/[pid]/mem。否则会导致僵尸进程或资源占用。开发和使用动态漏洞利用框架是一个不断与系统底层细节和不确定性作斗争的过程。它要求开发者不仅精通漏洞利用技术还要深刻理解操作系统进程模型、调试原理和软件工程。尽管道路崎岖但构建这样一个工具所带来的能力提升和对漏洞利用本质的深入理解无疑是每一位严肃的安全研究员值得投入的方向。DynamicExploit/runtm这类项目正是这条道路上的先行者和集大成者为我们展示了自动化、智能化安全测试的未来图景。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2594935.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…