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

手把手教你用Z3求解器破解GXYCTF2019的CPP逆向题(附完整脚本)

用Z3求解器高效破解CTF逆向题的实战指南在CTF竞赛中逆向工程类题目往往需要选手分析二进制程序理解其内部逻辑并提取关键信息。本文将深入探讨如何利用Z3求解器这一强大的数学工具高效解决复杂的逆向题目。我们以GXYCTF2019的一道典型CPP逆向题为例展示从分析到求解的完整流程。1. 逆向工程与Z3求解器基础逆向工程的核心在于理解程序的行为逻辑而Z3求解器则能帮助我们处理复杂的约束条件。Z3是由微软研究院开发的高性能定理证明器特别适合解决包含位运算、算术运算和逻辑关系的约束系统。1.1 Z3求解器的核心优势自动化求解自动寻找满足所有约束条件的变量值支持多种理论包括位向量、整数、实数、数组等高效性能能处理包含数百个变量的复杂系统Python接口易于集成到逆向分析工作流中安装Z3 Python包非常简单pip install z3-solver1.2 CTF逆向题的常见模式大多数CTF逆向题会采用以下一种或多种保护机制输入验证对用户输入进行复杂校验加密变换使用自定义或标准加密算法混淆技术增加反调试和代码混淆数学约束通过数学关系隐藏flag2. 题目分析与约束提取以GXYCTF2019的simple CPP为例我们需要从二进制程序中提取关键约束条件。2.1 初步分析使用IDA Pro分析64位无壳程序定位到主要验证逻辑。关键函数中包含以下重要变量关系v18 [v11, v12, v13, v14] # 存储处理后的输入数据 v22 v18[1] v18[0] v23 v18[2] ~v18[0] v24 ~v18[1] v25 v18[2] v24 v26 v18[0] v242.2 约束条件整理通过逆向分析我们识别出以下核心约束(~x) z 1176889593874((z~x)|(xy)|(z~y)|(x~y))^w 4483974543195470111((z~y)x|z((xy)|y~x|~(y|x))) 577031497978884115((z~x)|(xy)|(z~y)|(x~y)) 44839745440374126393. 构建Z3求解模型将提取的约束转化为Z3可理解的表达式是解题的关键步骤。3.1 变量定义与求解器初始化from z3 import * # 定义64位位向量变量 x, y, z, w BitVecs(x y z w, 64) s Solver()3.2 添加约束条件将逆向得到的约束逐一添加到求解器中s.add((~x) z 1176889593874) s.add(((z ~x) | (x y) | (z ~y) | (x ~y)) ^ w 4483974543195470111) s.add(((z ~y) x | z ((x y) | y ~x | ~(y | x))) 577031497978884115) s.add(((z ~x) | (x y) | (z ~y) | (x ~y)) 4483974544037412639)3.3 求解与结果验证执行求解并检查结果if s.check() sat: m s.model() for var in [x, y, z, w]: print(f{var} {hex(m[var].as_long())}) else: print(无法找到满足条件的解)4. 数据处理与Flag重构获得求解结果后还需要进行适当的数据处理才能得到最终flag。4.1 异或解密处理题目通常会对输入数据进行额外处理如异或操作key i_will_check_is_debug_or_noi_wil encrypted [0x3E,0x3A,0x46,0x05,0x33,0x28,0x6F,0x0D,0x8C,0x00, 0x8A,0x09,0x78,0x49,0x2C,0xAC,0x08,0x02,0x07,0x17, 0x15,0x3E,0x30,0x13,0x32,0x31,0x06] flag .join([chr(ord(key[i]) ^ encrypted[i]) for i in range(len(encrypted))]) print(flag)4.2 多解处理技巧有时Z3会给出多个解需要结合题目上下文判断正确解# 已知部分flag格式 partial_flag e!P0or_a if partial_flag in flag: print(找到有效flag片段)5. 高级技巧与优化策略提升Z3求解效率的几个实用技巧5.1 约束简化在添加约束前尽可能简化表达式# 原始约束 expr (z ~x) | (x y) | (z ~y) | (x ~y) # 可简化为 simplified (x y) | (z ~y) | ((x | z) ~(x y))5.2 求解策略调整Z3支持多种求解策略针对不同问题可优化性能tactic Then(simplify, solve-eqs, bit-blast, sat) s tactic.solver()5.3 并行求解对于大型问题可尝试并行求解from multiprocessing import Pool def solve_with_seed(seed): s Solver() s.add(conditions) s.set(random_seed, seed) return s.check() pool Pool(4) results pool.map(solve_with_seed, range(4))6. 实战案例扩展让我们再看一个典型例子展示Z3在逆向中的灵活应用。6.1 复杂校验函数分析假设遇到如下校验逻辑if ((input[0] * input[1] - input[2]) ^ input[3] 0x1234 (input[4] | input[5]) input[6] 0x56 ~input[7] 0xFF input[8]) { // 验证通过 }6.2 对应的Z3模型in_vars [BitVec(fin_{i}, 8) for i in range(9)] s.add((in_vars[0] * in_vars[1] - in_vars[2]) ^ in_vars[3] 0x1234) s.add((in_vars[4] | in_vars[5]) in_vars[6] 0x56) s.add(~in_vars[7] 0xFF in_vars[8])6.3 结果提取技巧处理多字节结果时的实用方法if s.check() sat: m s.model() solution bytes([m[v].as_long() for v in in_vars]) print(fFound solution: {solution.hex()})7. 常见问题与调试技巧在使用Z3求解逆向问题时可能会遇到各种挑战。7.1 求解时间过长尝试简化约束条件添加已知的变量范围限制分段求解先解部分变量再解剩余部分7.2 结果不符合预期检查约束是否正确转换验证位宽是否设置正确如32位vs64位添加中间变量辅助调试7.3 性能优化示例# 优化前 s.add(x y 100) s.add(x - y 20) # 优化后减少变量数量 s.add(x 60) s.add(y 40)8. 工具链整合建议将Z3集成到逆向工作流中的几种方式8.1 IDA Python脚本直接在IDA中运行Z3求解import idaapi from z3 import * def solve_constraints(): # 从IDA获取约束 constraints get_constraints_from_ida() # 建立Z3模型 s Solver() for cond in constraints: s.add(cond) # 求解并返回结果 if s.check() sat: return s.model()8.2 与angr框架结合import angr from z3 import * proj angr.Project(challenge, auto_load_libsFalse) state proj.factory.entry_state() # 使用angr符号执行获取路径约束 simgr proj.factory.simgr(state) simgr.explore(find0x401234) found simgr.found[0] constraints found.solver.constraints # 转换为Z3表达式 z3_constraints [c.to_z3() for c in constraints]8.3 自动化脚本模板一个通用的Z3求解模板from z3 import * def solve_ctf_challenge(): # 1. 定义变量 vars define_variables() # 2. 初始化求解器 s Solver() # 3. 添加约束 add_constraints(s, vars) # 4. 求解并验证 if s.check() sat: model s.model() return extract_solution(model, vars) else: return None def define_variables(): # 根据题目需求定义变量 pass def add_constraints(solver, vars): # 添加具体约束条件 pass def extract_solution(model, vars): # 从模型中提取并格式化结果 pass9. 数学理论基础深化理解Z3背后的理论能帮助我们更好地应用它。9.1 可满足性模理论(SMT)Z3基于SMT它结合了布尔可满足性(SAT)命题逻辑理论求解器处理特定领域理论如算术、位向量9.2 位向量理论CTF逆向常用的是位向量理论特点包括固定位宽的整数表示支持位级操作AND/OR/XOR等算术运算有明确的溢出语义9.3 量词与存在性虽然CTF逆向中较少使用但Z3支持量词x Int(x) y Int(y) # 对于所有x存在y使得x y s.add(ForAll([x], Exists([y], x y)))10. 扩展应用场景Z3不仅适用于CTF逆向还可用于10.1 软件验证验证程序是否满足特定性质def max(a, b): return If(a b, a, b) a, b Ints(a b) s Solver() s.add(max(a, b) a) assert s.check() unsat # 验证max函数定义正确10.2 符号执行辅助增强符号执行的能力import claripy from z3 import * # 将claripy约束转换为Z3 claripy_constraints get_constraints_from_analysis() z3_constraints [translate_to_z3(c) for c in claripy_constraints] s Solver() s.add(z3_constraints)10.3 算法逆向逆向未知算法的输入输出关系# 假设观察到多组输入输出 inputs [...] outputs [...] # 尝试推断算法逻辑 for i, o in zip(inputs, outputs): s.add(unknown_function(inputs[i]) outputs[i])11. 性能对比与基准测试了解不同求解方法的效率差异11.1 Z3 vs 暴力破解对于8字节以下的输入暴力破解可能更快from itertools import product def brute_force(charset, length): for attempt in product(charset, repeatlength): if check(attempt): return attempt return None11.2 Z3配置调优调整Z3参数提升性能s Solver() s.set(timeout, 60000) # 设置超时(毫秒) s.set(random_seed, 42) # 固定随机种子12. 资源与进阶学习要精通Z3在逆向中的应用推荐以下资源官方文档Z3 GitHub Wiki《Programming Z3》官方指南CTF Writeups学习实战案例SMTLIB标准了解底层理论一个实用的学习方法是分析经典CTF题目的Z3解法# 参考其他选手的解题脚本 def learn_from_others(): # 1. 查找类似题目的writeup # 2. 理解他们的建模方法 # 3. 尝试改进或简化 pass13. 实际案例分析让我们详细分析GXYCTF2019题目的完整解法。13.1 完整解题脚本from z3 import * import struct def solve(): x, y, z, w BitVecs(x y z w, 64) s Solver() # 添加所有约束条件 s.add((~x) z 1176889593874) s.add(((z ~x) | (x y) | (z ~y) | (x ~y)) ^ w 4483974543195470111) s.add(((z ~y) x | z ((x y) | y ~x | ~(y | x))) 577031497978884115) s.add(((z ~x) | (x y) | (z ~y) | (x ~y)) 4483974544037412639) if s.check() sat: m s.model() x_val m[x].as_long() y_val m[y].as_long() z_val m[z].as_long() w_val m[w].as_long() # 转换为字节序列 x_bytes struct.pack(Q, x_val) y_bytes struct.pack(Q, y_val) z_bytes struct.pack(Q, z_val) w_bytes struct.pack(Q, w_val) # 异或处理 key bi_will_check_is_debug_or_noi_wil encrypted bytes([ 0x3E,0x3A,0x46,0x05,0x33,0x28,0x6F,0x0D,0x8C,0x00, 0x8A,0x09,0x78,0x49,0x2C,0xAC,0x08,0x02,0x07,0x17, 0x15,0x3E,0x30,0x13,0x32,0x31,0x06 ]) flag bytes([key[i] ^ encrypted[i] for i in range(len(encrypted))]) return flag.decode(latin1) else: return No solution found if __name__ __main__: print(Flag:, solve())13.2 关键步骤解析变量定义使用64位位向量表示程序中的关键变量约束转换将逆向得到的复杂位运算关系准确转换为Z3表达式结果处理将求解得到的数值转换为字节序列解密处理通过异或操作还原原始flag13.3 经验总结约束准确性确保Z3约束完全对应程序逻辑字节序处理注意平台字节序小端/大端编码问题处理非ASCII字符时注意编码转换14. 创新解法探讨除了标准解法外还可以尝试以下创新方法14.1 分段求解策略将大问题分解为小问题逐步求解def staged_solving(): # 第一阶段先解x和z s1 Solver() s1.add((~x) z 1176889593874) # ...其他仅涉及x,z的约束 if s1.check() sat: m1 s1.model() # 固定x,z的值解y,w s2 Solver() s2.add(y m1[y]) # ...添加剩余约束14.2 机器学习辅助使用机器学习预测变量关系from sklearn.ensemble import RandomForestRegressor # 基于已有解训练模型 model RandomForestRegressor() model.fit(features, targets) # 预测可能的变量值作为Z3初始值 initial_guess model.predict(new_features)14.3 并行多解搜索from concurrent.futures import ThreadPoolExecutor def solve_with_assumption(assumption): s Solver() s.add(assumption) # ...添加其他约束 return s.check() with ThreadPoolExecutor() as executor: results list(executor.map(solve_with_assumption, assumptions))15. 安全编程实践在编写Z3解题脚本时也要注意代码安全15.1 输入验证def safe_eval(expr, env): allowed_vars {x, y, z, w} if not set(expr.get_vars()).issubset(allowed_vars): raise ValueError(禁止使用未授权变量) # ...安全评估表达式15.2 资源限制import resource def set_memory_limit(): # 限制内存使用(MB) resource.setrlimit(resource.RLIMIT_AS, (512*1024*1024, 512*1024*1024))15.3 沙箱执行import tempfile import os def run_in_sandbox(): with tempfile.TemporaryDirectory() as tmpdir: os.chdir(tmpdir) # 在沙箱中执行求解 result solve_challenge() return result16. 调试与验证技巧确保Z3模型正确性的方法16.1 单元测试为约束条件编写测试用例def test_constraints(): x, y BitVecs(x y, 32) s Solver() s.add(x y 10, x - y 2) assert s.check() sat assert s.model()[x].as_long() 6 assert s.model()[y].as_long() 416.2 可视化调试绘制约束关系图辅助理解import networkx as nx import matplotlib.pyplot as plt def visualize_constraints(expr): G nx.DiGraph() # 构建表达式树 # ...添加节点和边 nx.draw(G, with_labelsTrue) plt.show()16.3 交叉验证使用不同方法验证结果正确性def cross_validate(): z3_result solve_with_z3() brute_result brute_force_solution() assert z3_result brute_result17. 教育意义与学习路径掌握Z3求解器对逆向工程师的长期价值思维训练培养抽象和建模能力效率提升自动化解决复杂数学问题技术拓展为学习形式化方法打下基础建议的学习路径基础布尔代数、位运算中级SMT理论、Z3 Python API高级符号执行、程序验证18. 社区与资源活跃的Z3和CTF社区Z3 GitHub问题讨论和最新进展CTFtime比赛平台和writeup收集Reddit逆向工程版块经验分享专业博客如符号执行实战系列19. 未来趋势Z3在安全领域的应用前景自动化漏洞发现结合符号执行智能模糊测试指导测试用例生成协议逆向分析网络协议格式反混淆研究对抗代码混淆技术20. 持续实践建议保持技能的几种方式定期参加CTF比赛实战是最好的学习复现经典题目深入理解各种技巧开源项目贡献如Z3或相关工具技术分享写作巩固自身知识在实际使用Z3求解器解决CTF逆向题时我发现最有效的策略是先静态分析理清程序逻辑然后逐步构建约束系统。对于复杂的位运算关系画出真值表往往能帮助理解。当遇到多解情况时结合动态调试或题目给出的部分提示可以有效缩小解空间范围。

相关文章:

手把手教你用Z3求解器破解GXYCTF2019的CPP逆向题(附完整脚本)

用Z3求解器高效破解CTF逆向题的实战指南 在CTF竞赛中,逆向工程类题目往往需要选手分析二进制程序,理解其内部逻辑并提取关键信息。本文将深入探讨如何利用Z3求解器这一强大的数学工具,高效解决复杂的逆向题目。我们以GXYCTF2019的一道典型CPP…...

Hackintool实战指南:零基础掌握黑苹果系统配置

Hackintool实战指南:零基础掌握黑苹果系统配置 【免费下载链接】Hackintool The Swiss army knife of vanilla Hackintoshing 项目地址: https://gitcode.com/gh_mirrors/ha/Hackintool 黑苹果系统配置过程中,硬件识别不准确、驱动不匹配、启动参…...

STM32L476G-DISCO BSP驱动库深度解析与低功耗实战

1. BSP_DISCO_L476VG:STM32L476G-Discovery开发板底层驱动库深度解析1.1 项目定位与工程价值BSP_DISCO_L476VG 是 STMicroelectronics 官方为 STM32L476G-DISCO 开发板提供的板级支持包(Board Support Package),版本号 V1.0.0。该…...

Pulse1:轻量级NEC红外协议嵌入式解码库

1. 项目概述Pulse1 是一个面向嵌入式系统的轻量级红外(IR)遥控协议解析库,专为 NEC(Nuclear Electronic Corporation)红外通信协议设计与实现而优化。该库由开发者 tony63 原创编写,并明确声明“Usada bajo…...

B端拓客号码核验困境破解:行业痛点审视与技术赋能路径氪迹科技法人股东号码核验系统

在B端客户拓展的实践过程中,企业法人、股东及核心决策人号码的核验与筛选,是所有拓客团队都必须面对的关键前置工作。人工手动筛选不仅消耗大量人力与时间成本,更无法适配规模化拓客的发展需求;而借助工具开展核验,又往…...

收藏!小白程序员必看:轻松分清 Automation/Workflow/Agent,AI 应用不再难!

很多团队现在最容易犯的错,不是不会做 AI,而是一上来就说自己要做 Agent。 结果最后做出来的,可能只是: 一个固定规则的自动化脚本一个接了几个大模型节点的工作流一个看起来很聪明、实际上既贵又不稳的半成品系统 问题往往不在模…...

Windows触控板驱动终极指南:让苹果设备在Windows上完美运行

Windows触控板驱动终极指南:让苹果设备在Windows上完美运行 【免费下载链接】mac-precision-touchpad Windows Precision Touchpad Driver Implementation for Apple MacBook / Magic Trackpad 项目地址: https://gitcode.com/gh_mirrors/ma/mac-precision-touchp…...

MLX90614红外测温模块的SMBus驱动与嵌入式实现

1. MLX90614红外测温模块技术解析与嵌入式驱动实现1.1 非接触式测温原理与器件选型依据在工业控制、医疗设备及消费电子领域,温度测量的精度、响应速度与测量方式直接影响系统可靠性。传统接触式测温依赖热传导建立热平衡,存在响应滞后(典型值…...

跨模态融合Transformer在多光谱目标检测中的技术深度解析与应用实践

跨模态融合Transformer在多光谱目标检测中的技术深度解析与应用实践 【免费下载链接】multispectral-object-detection Multispectral Object Detection with Yolov5 and Transformer 项目地址: https://gitcode.com/gh_mirrors/mu/multispectral-object-detection 多光…...

CH9329串口转键鼠实战:从硬件对接到HID指令解析

1. CH9329模块初探:串口转键鼠的神奇桥梁 第一次拿到CH9329这个拇指大小的模块时,我完全没想到它能通过串口指令精准控制电脑的键鼠操作。这个由南京沁恒推出的USB转串口芯片,本质上是个HID协议翻译器——它把串口传来的原始数据包转换成电脑…...

RK3566 SPI设备节点实战:从内核配置到用户空间spidev3.0测试

1. RK3566 SPI开发基础与实战意义 SPI总线作为嵌入式系统中最常用的通信协议之一,在RK3566这类高性能处理器上的应用尤为广泛。我最近在立创泰山派开发板上折腾SPI设备时,发现很多新手都会卡在内核配置和用户空间测试的衔接环节。这篇文章就来手把手带你…...

FPGA设计效率翻倍:深度拆解Quartus中RAM与FIFO IP核的选型、配置与在DDS中的实战应用

FPGA设计效率翻倍:深度拆解Quartus中RAM与FIFO IP核的选型、配置与在DDS中的实战应用 在FPGA开发中,IP核的高效利用往往是区分普通工程师与资深专家的关键分水岭。当项目复杂度提升到需要处理高速数据流、多时钟域交互或大容量存储时,RAM和FI…...

ESP32实战:SD卡存储与HUB75点阵屏的GIF动态播放系统

1. ESP32与HUB75点阵屏的完美组合 ESP32作为一款功能强大的微控制器,凭借其双核处理器、丰富的外设接口和出色的无线连接能力,已经成为物联网和嵌入式开发的热门选择。而HUB75接口的LED点阵屏,则以其高亮度、高刷新率和模块化拼接特性&#x…...

【技术干货】Google 全新 AI Studio Build Mode 深度解析:从多人与物理仿真到全栈应用的自动生成

摘要 Google 全新升级的 AI Studio(构建模式 / Agent 模式)已经从“写点前端 Demo”进化为“自动搭建可上线的全栈应用平台”:支持实时多人游戏、三维粒子交互、物理仿真、Firebase 深度集成、GitHub 自动发布等。本文结合视频内容&#xff0…...

MMA8452Q加速度传感器原理与嵌入式低功耗集成实践

1. MMA8452Q加速度传感器技术深度解析与嵌入式系统集成实践MMA8452Q是NXP(现为恩智浦半导体)推出的一款超低功耗、高精度、三轴数字加速度传感器,采用331 mm QFN-16封装,专为便携式消费电子、工业状态监测、可穿戴设备及物联网终端…...

Jetson Nano新手必看:VMware虚拟机+Ubuntu18.04环境搭建全攻略(避坑指南)

Jetson Nano开发环境搭建:VMware虚拟机与Ubuntu 18.04实战指南 为什么选择Jetson Nano与Ubuntu 18.04组合 Jetson Nano作为NVIDIA推出的边缘计算设备,凭借其强大的AI推理能力和亲民的价格,迅速成为开发者和研究人员的宠儿。而Ubuntu 18.04 LT…...

《OpenClaw架构与源码解读》· 第 17 章 架构复盘与未来展望:当个人 AI Agent 成为标配

第 17 章 架构复盘与未来展望:当个人 AI Agent 成为标配 走到这里,你已经把 OpenClaw 从头到脚拆了一遍。Part I 用产品视角理解了 OpenClaw 是什么以及它「个人 Agent OS」的定位。Part II 深入了 Session、Agent、Channel、Nodes/Browser 四大核心抽象…...

CYBER-VISION模型部署:Anaconda创建虚拟环境,避免版本冲突

CYBER-VISION模型部署:Anaconda创建虚拟环境,避免版本冲突 1. 为什么需要虚拟环境? 在开发CYBER-VISION这类计算机视觉项目时,最令人头疼的问题莫过于"昨天还能跑通的代码,今天突然报错了"。这种情况十有八…...

Youtu-Parsing教育AI助手:学生作业图片→文字+公式+图表全要素解析

Youtu-Parsing教育AI助手:学生作业图片→文字公式图表全要素解析 1. 引言:当AI遇见学生作业 想象一下这个场景:一位老师收到了50份学生提交的物理作业照片,每份作业都包含了手写的解题步骤、复杂的数学公式、手绘的电路图&#…...

利用Wan2.1 VAE自动化生成产品包装设计初稿

利用Wan2.1 VAE自动化生成产品包装设计初稿 每次接到一个新产品的包装设计需求,你是不是也经历过这样的场景?市场部给了一堆模糊的brief:“要高端大气,还要有亲和力,最好带点科技感,哦对了,预算…...

【Dify企业级Rerank实战白皮书】:3大工业级重排序算法选型指南,92%的AI应用性能提升源自这一步优化

第一章:Dify企业级Rerank实战白皮书导论在构建高精度、可解释、可审计的企业级检索增强生成(RAG)系统时,重排序(Rerank)已从可选优化模块演变为关键质量守门人。Dify 作为开源低代码 LLM 应用开发平台&…...

工业4.0数据枢纽:FreeSCADA开源监控系统的跨协议融合方案

工业4.0数据枢纽:FreeSCADA开源监控系统的跨协议融合方案 【免费下载链接】FreeSCADA 项目地址: https://gitcode.com/gh_mirrors/fr/FreeSCADA 在工业自动化领域,设备协议碎片化、数据孤岛严重、定制成本高昂一直是制造业数字化转型的三大痛点。…...

Wiley期刊投稿返修实战:手把手教你搞定Response Letter和Graphical Abstract

Wiley期刊投稿返修实战:手把手教你搞定Response Letter和Graphical Abstract 收到Wiley期刊的大修通知时,那种既兴奋又焦虑的复杂心情,每个科研工作者都深有体会。兴奋的是论文没有被直接拒稿,说明研究有价值;焦虑的是…...

如何在Linux系统下快速搭建vaspkit1.5.1+Anaconda3计算环境

科研计算环境搭建指南:Anaconda3与VASPKIT高效配置方案 对于从事材料模拟和量子化学研究的科研人员来说,一个稳定高效的计算环境是开展工作的基础。本文将详细介绍如何在Linux系统中快速搭建Anaconda3与VASPKIT1.5.1的集成计算环境,帮助研究人…...

大模型Token计费揭秘:如何避免花冤枉钱,高效使用AI工具?

本文深入解析了大模型Token计费机制,揭示了对话本质是单向请求-响应,Token作为语言积木处理文本,中文Token消耗显著高于英文。文章详细阐述了上下文窗口(Context Window)作为模型“工作记忆”的容量限制,以…...

Bugku SQL注入实战:绕过黑名单的5种骚操作(附完整Payload)

Bugku SQL注入高阶技巧:突破黑名单的实战艺术 在网络安全攻防演练中,SQL注入始终占据着OWASP Top 10的重要位置。而真实环境中的防御机制往往比CTF题目更加复杂,其中黑名单过滤是最常见的防护手段之一。本文将深入剖析五种突破黑名单限制的创…...

实战Oracle存储过程:用PL/SQL实现电商订单自动对账(附完整代码)

实战Oracle存储过程:用PL/SQL实现电商订单自动对账(附完整代码) 电商平台的订单与支付流水对账是财务核算中的关键环节。传统人工对账不仅效率低下,还容易因人为疏忽导致误差。本文将深入探讨如何利用Oracle存储过程构建一套自动化…...

南北阁 Nanbeige 4.1-3B Streamlit应用监控:推理延迟与并发数实时看板

南北阁 Nanbeige 4.1-3B Streamlit应用监控:推理延迟与并发数实时看板 1. 引言:为什么需要监控看板? 当你把一个AI模型部署成服务,尤其是像南北阁 Nanbeige 4.1-3B 这样轻量化的本地对话工具后,一个很自然的问题就会…...

Nanbeige 4.1-3B实战教程:添加成就系统(Achievement Badge)激励用户探索功能

Nanbeige 4.1-3B实战教程:添加成就系统(Achievement Badge)激励用户探索功能 1. 项目背景与目标 Nanbeige 4.1-3B像素冒险聊天终端是一款充满游戏风格的AI对话前端,采用复古JRPG视觉设计。为了让用户更有动力探索系统功能&#…...

Leather Dress Collection 企业级应用:Java八股文面试题库自动生成与评估

Leather Dress Collection 企业级应用:Java八股文面试题库自动生成与评估 最近和几个做技术招聘的朋友聊天,大家普遍头疼一个问题:面试题怎么出?尤其是Java这种成熟技术栈,题目既要覆盖核心知识点,又不能太…...