经gpt观察后发现,每 4 字节的第 1 个字节都像是被异或了 0x44。
with open(‘Driver.sys’, ‘rb’) as f:raw bytearray(f.read())repaired bytearray(raw)for i in range(0, len(repaired), 4):repaired[i] ^ 0x44with open(‘Driver_repaired.sys’, ‘wb’) as f:f.write(repaired)按这个规律恢复后Driver.sys 重新变成正常 PE 驱动并能看到关键字符串??\DeviceDrive\Device\MYDEVICEflag is you inputwrong真正缺失的符号是 Drive并且 Drive的md5刚好是f2c6151d6c0d99f3666129b97e2100f5再把exe修改好然后回到Driver.sys看看哪里引用了flag is you inputfor ( i 0; i v5; i )*((_BYTE *)buf (int)i) Format[i];for ( n32 1; n32 32; n32 )*((_BYTE)buf n32 - 1) ^ (unsigned __int8)(((_BYTE *)buf n32 - 1) % 0x12u *((_BYTE *)buf n32) 5) ^ 0x34;if ( (unsigned int)sub_140001000(buf, 32) ){strcpy(Format, “flag is you input”);Irp_1-IoStatus.Information 18;DbgPrint(Format__2);}跟踪sub_140001000__int64 __fastcall sub_140001000(__int64 buf, __int64 n32){char n52; // [rsp20h] [rbp-28h]char n52_1; // [rsp21h] [rbp-27h]char n52_2; // [rsp22h] [rbp-26h]int n32_3; // [rsp24h] [rbp-24h]int n32_2; // [rsp28h] [rbp-20h]_BYTE *PoolWithTag; // [rsp30h] [rbp-18h]int n32_1; // [rsp58h] [rbp10h]n32_1 n32;PoolWithTag ExAllocatePoolWithTag(NonPagedPool, 0x100u, 0x504F4F4Cu);n52 52;for ( n32_2 0; n32_2 n32_1; n32_2 ){ //每一个字节都是和上一个原始字节进行异或n52_1 *(_BYTE *)(buf n32_2);PoolWithTag[n32_2] n52 ^ n52_1;n52 n52_1;}for ( n32_3 0; n32_3 n32_1; n32_3 ){n52_2 PoolWithTag[n32_3];PoolWithTag[n32_3] n52 ^ n52_2;n52 n52_2;if ( (unsigned __int8)PoolWithTag[n32_3] ! byte_140003000[n32_3] )return 0;}return 1;}两次链式异或结果与byte_140003000[n32_3]比较去找byte_140003000[n32_3]shiftE0x66,0xA,0x9,0xE0,0xE2,0xE3,0xCB,0x9,0x14,0x15,0xC,0x38,0x1,0x1F,0x5,0x42,0x71,0x6E,0x56,0x7A,0x0,0x20,0xE4,0xBF,0xE6,0xCD,0x28,0x30,0x2C,0x75,0xA0,0x3A重新梳理下逻辑第一轮从前往后每个字节跟前一个字节或初始值 0x34XORtmp[0] in[0] ^ 0x34 ← 第0个字节用初始值 0x34tmp[1] in[1] ^ in[0] ← 第1个字节用 in[0]tmp[2] in[2] ^ in[1] ← 第2个字节用 in[1]tmp[3] in[3] ^ in[2]…tmp[31] in[31] ^ in[30]第二轮从前往后每个字节跟前一个字节或 in31XORout[0] tmp[0] ^ in[31] ← 第0个字节用 in[31]out[1] tmp[1] ^ tmp[0] ← 第1个字节用 tmp[0]out[2] tmp[2] ^ tmp[1] ← 第2个字节用 tmp[1]out[3] tmp[3] ^ tmp[2]…out[31] tmp[31] ^ tmp[30]我们把第一轮的公式代入第二轮去out[0] (in[0] ^ 0x34) ^ in[31]out[1] (in[1] ^ in[0]) ^ (in[0] ^ 0x34)看 out1in[0] 出现了两次XOR 抵消了out[1] in[1] ^ 0x34继续out[2] (in[2] ^ in[1]) ^ (in[1] ^ in[0]) in[2] ^ in[0] ← in[1] 抵消了out[3] (in[3] ^ in[2]) ^ (in[2] ^ in[1]) in[3] ^ in[1] ← in[2] 抵消了out[4] (in[4] ^ in[3]) ^ (in[3] ^ in[2]) in[4] ^ in[2] ← in[3] 抵消了最后out[31] (in[31] ^ in[30]) ^ (in[30] ^ in[29]) in[31] ^ in[29] ← in[30] 抵消了合并后的完整公式out[0] in[0] ^ 0x34 ^ in[31]out[1] in[1] ^ 0x34out[2] in[2] ^ in[0]out[3] in[3] ^ in[1]out[4] in[4] ^ in[2]out[5] in[5] ^ in[3]…out[31] in[31] ^ in[29]out已知可以推出in尝试借助刚学的z3from z3 import *s Solver()out[0x66, 0xA, 0x9, 0xE0, 0xE2, 0xE3, 0xCB, 0x9, 0x14, 0x15, 0xC, 0x38, 0x1, 0x1F, 0x5, 0x42, 0x71, 0x6E, 0x56, 0x7A, 0x0, 0x20, 0xE4, 0xBF, 0xE6, 0xCD, 0x28, 0x30, 0x2C, 0x75, 0xA0, 0x3A]inn[BitVec(f’x_{i}, 8) for i in range(32)]s.add(out[0] inn[0] ^ 0x34 ^ inn[31],out[1] inn[1] ^ 0x34,)for i in range(2, 32):s.add(out[i] inn[i] ^ inn[i-2])assert s.check() satm s.model()flag bytes([m.eval(inn[i]).as_long() for i in range(32)])print(list(flag))输出[47, 62, 38, 222, 196, 61, 15, 52, 27, 33, 23, 25, 22, 6, 19, 68, 98, 42, 52, 80, 52, 112, 208, 207, 54, 2, 30, 50, 50, 71, 146, 125]别忘了在sub_140001000的两次异或前还有一次处理简化一下代码buf[n32-1] ^ (buf[n32-1] % 18 buf[n32] 5) ^ 0x34;自己除以18加5加下一位与0x34异或再与自己异或赋值给自己from z3 import *s Solver()buf_new[47, 62, 38, 222, 196, 61, 15, 52, 27, 33, 23, 25, 22, 6, 19, 68, 98, 42, 52, 80, 52, 112, 208, 207, 54, 2, 30, 50, 50, 71, 146, 125]buf_old[BitVec(f’x_{i}, 8) for i in range(32)]for n32 in range(1,32):s.add(buf_new[n32-1] (buf_old[n32-1] % 18 buf_old[n32] 5) ^ 0x34 ^ buf_old[n32-1])assert s.check() satm s.model()flag bytes([m.eval(buf_old[i]).as_long() for i in range(32)])print(flag.hex())但是发现这个输出很奇怪转换成字符是乱码我们加一段代码看是不是有多解s.add(Or([buf_old[i] ! m[buf_old[i]] for i in range(32)]))if s.check() sat:print(“many”)m2 s.model()else:print(“only one”)输出many说明有多解我们再加一些关于输出格式为flag的限制限制第一个字符为f(0x66)最终脚本from z3 import *s Solver()buf_new[47, 62, 38, 222, 196, 61, 15, 52, 27, 33, 23, 25, 22, 6, 19, 68, 98, 42, 52, 80, 52, 112, 208, 207, 54, 2, 30, 50, 50, 71, 146, 125]buf_old[BitVec(f’x_{i}, 8) for i in range(32)]for n32 in range(1,32):s.add(buf_new[n32-1] (buf_old[n32-1] % 18 buf_old[n32] 5) ^ 0x34 ^ buf_old[n32-1],buf_old[0]0x66)assert s.check() satm s.model()flag bytes([m.eval(buf_old[i]).as_long() for i in range(32)])print(flag)s.add(Or([buf_old[i] ! m[buf_old[i]] for i in range(32)]))if s.check() sat:print(“many”)m2 s.model()else:print(“only one”)flag{wnNCZJbBOqL3QA1C1cypiKYII4}

相关新闻

如何快速部署CasparCG Server:面向新手的完整广播级视频服务器指南

如何快速部署CasparCG Server:面向新手的完整广播级视频服务器指南

如何快速部署CasparCG Server:面向新手的完整广播级视频服务器指南 【免费下载链接】server CasparCG Server is a Windows and Linux software used to play out professional graphics, audio and video to multiple outputs. It has been in 24/7 broadcast prod…

2026/7/24 14:03:37 阅读更多 →
告别重复点击:AI如何重塑浏览器自动化

告别重复点击:AI如何重塑浏览器自动化

告别重复点击:AI如何重塑浏览器自动化 【免费下载链接】Chrome-GPT An AutoGPT agent that controls Chrome on your desktop 项目地址: https://gitcode.com/gh_mirrors/ch/Chrome-GPT 三步实现智能表单处理,动态内容捕获技巧 场景引入&#xf…

2026/7/25 6:26:12 阅读更多 →
Fun-ASR安全部署与优化:生产环境下的最佳实践与性能调优

Fun-ASR安全部署与优化:生产环境下的最佳实践与性能调优

Fun-ASR安全部署与优化:生产环境下的最佳实践与性能调优 【免费下载链接】Fun-ASR Open-source LLM-based ASR model family for Chinese, dialect, accent, and multilingual speech, with FunASR, vLLM, streaming, and llama.cpp runtimes. 项目地址: https://…

2026/7/23 14:47:40 阅读更多 →

最新新闻

【电脑智能自动化工具】 OpenClaw 安装踩坑指南,各类异常解决方案汇总

【电脑智能自动化工具】 OpenClaw 安装踩坑指南,各类异常解决方案汇总

🦞 OpenClaw 一键整合包搭建实录|快速构建本地电脑自动化智能环境 [TOC] ⚠️ 部署前置须知(规避报错关键要点) 准备下载、解压以及运行程序之前,建议暂时关闭电脑上所有安全防护程序🛡️ 涵盖 360 安全…

2026/7/25 6:25:51 阅读更多 →
修改 Ollama 模型存储目录,搭配 OpenClaw 本地运行大模型(含安装包)

修改 Ollama 模型存储目录,搭配 OpenClaw 本地运行大模型(含安装包)

OpenClaw v2.7.9 接入 Ollama 本地大模型完整配置教程 接入前置条件 本地设备已部署 OpenClaw v2.7.9 Windows 客户端,程序能够正常启动运行;OpenClaw 界面顶部 Gateway 服务保持在线状态;电脑网络连通正常,可以正常访问 Ollama…

2026/7/25 6:25:51 阅读更多 →
【搭建私人桌面 AI 助手】,OpenClaw 整合包部署全流程实践(含安装包)

【搭建私人桌面 AI 助手】,OpenClaw 整合包部署全流程实践(含安装包)

OpenClaw v2.7.9 整合包部署实践|搭建可自主执行任务的本地桌面 AI 智能体 核心亮点 可视化图形操作|免除复杂环境搭建|预装全部运行依赖|支持本地数据存储|配备充足上下文处理额度 前言 OpenClaw,圈内…

2026/7/25 6:25:51 阅读更多 →
Qt与C++跨进程共享内存连接失败:编码、命名空间与权限问题全解析

Qt与C++跨进程共享内存连接失败:编码、命名空间与权限问题全解析

1. 项目概述:跨进程通信的“暗礁”在Windows平台上,使用C和Qt进行跨进程数据交换,共享内存(Shared Memory)是一个非常高效的选择。它允许两个或多个进程直接读写同一块物理内存区域,避免了数据拷贝&#xf…

2026/7/25 6:25:51 阅读更多 →
C语言字符串操作实战:利用strstr与memmove高效删除子串

C语言字符串操作实战:利用strstr与memmove高效删除子串

1. 项目概述:一个看似简单却暗藏玄机的字符串操作今天想聊一个在C语言学习和面试中高频出现,但又常常被轻视的经典问题:如何实现删除字符串中的指定子串。乍一看,这问题简单得有点“小儿科”——不就是找到子串,然后把…

2026/7/25 6:25:51 阅读更多 →
FigmaCN中文汉化插件:3分钟快速安装与使用指南

FigmaCN中文汉化插件:3分钟快速安装与使用指南

FigmaCN中文汉化插件:3分钟快速安装与使用指南 【免费下载链接】figmaCN 中文 Figma 插件,设计师人工翻译校验 项目地址: https://gitcode.com/gh_mirrors/fi/figmaCN 还在为Figma的英文界面而苦恼吗?作为中文设计师,你是否…

2026/7/25 6:24:51 阅读更多 →

日新闻

突破文档下载限制:kill-doc让你看到的都能保存

突破文档下载限制:kill-doc让你看到的都能保存

突破文档下载限制:kill-doc让你看到的都能保存 【免费下载链接】kill-doc 看到经常有小伙伴们需要下载一些免费文档,但是相关网站浏览体验不好各种广告,各种登录验证,需要很多步骤才能下载文档,该脚本就是为了解决您的…

2026/7/25 0:00:35 阅读更多 →
C++ string类模拟实现:从深拷贝到内存管理的完整指南

C++ string类模拟实现:从深拷贝到内存管理的完整指南

1. 项目概述:为什么我们要“手撕”string类?在C的学习道路上,尤其是从C语言过渡到C的“初阶”阶段,string类绝对是一个绕不开的核心。标准库里的std::string用起来太方便了,、find、substr,几个操作符和函数…

2026/7/25 0:00:35 阅读更多 →
三角洲寻宝鼠工具:高效文件搜索与资源管理实战指南

三角洲寻宝鼠工具:高效文件搜索与资源管理实战指南

1. 先搞清楚“三角洲寻宝鼠”到底是什么工具从名称来看,“三角洲寻宝鼠”更像是一个资源查找或文件检索类工具,而不是游戏或娱乐软件。这类工具的核心价值在于帮助用户快速定位特定资源,比如文档、图片、压缩包或特定格式的文件。如果你经常需…

2026/7/25 0:00:35 阅读更多 →

周新闻

Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/25 5:08:22 阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/25 5:13:53 阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/24 18:52:18 阅读更多 →

月新闻