{"componentChunkName":"component---src-templates-post-template-js","path":"/windows-windbg-011-rc4-en","result":{"data":{"markdownRemark":{"id":"e0ecaf55-06a0-5e12-85bc-770a6ca52ad5","html":"<blockquote>\n<p>This page has been machine-translated from the <a href=\"/windows-windbg-011-rc4\">original page</a>.</p>\n</blockquote>\n<p>This time I wanted to implement the RC4 cipher in C and reverse-engineer it with WinDbg.</p>\n<p>At <a href=\"https://harekaze.com/ctf/2021.html\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Harekaze mini CTF 2021</a>, held on 2021/12/24, there was a Rev challenge that required identifying RC4 usage from static analysis alone. Unfortunately, I was unable to identify it from the decompiler output at the time.</p>\n<p>Reference: <a href=\"https://github.com/TeamHarekaze/harekaze-mini-ctf-2021-challenges-public/blob/main/rev/pack-program/solution/Pack%20Program-solve.pdf\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">harekaze-mini-ctf-2021 Pack</a></p>\n<p>As a review exercise, I decided to implement RC4 myself and reverse-engineer it.</p>\n<!-- omit in toc -->\n<h2 id=\"table-of-contents\" style=\"position:relative;\"><a href=\"#table-of-contents\" aria-label=\"table of contents permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"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\"></path></svg></a>Table of Contents</h2>\n<ul>\n<li>\n<p><a href=\"#what-is-rc4-encryption\">What Is RC4 Encryption?</a></p>\n<ul>\n<li><a href=\"#stream-ciphers\">Stream Ciphers</a></li>\n<li><a href=\"#rc4-cipher\">RC4 Cipher</a></li>\n<li><a href=\"#ksa\">KSA</a></li>\n<li><a href=\"#generating-the-key-stream-and-encrypting-with-prga\">Generating the Key Stream and Encrypting with PRGA</a></li>\n<li><a href=\"#decryption\">Decryption</a></li>\n</ul>\n</li>\n<li><a href=\"#source-code\">Source Code</a></li>\n<li>\n<p><a href=\"#reversing-the-rc4-program\">Reversing the RC4 Program</a></p>\n<ul>\n<li><a href=\"#decompiling-the-calling-function\">Decompiling the Calling Function</a></li>\n<li><a href=\"#analyzing-the-ttd-trace\">Analyzing the TTD Trace</a></li>\n<li><a href=\"#decompiling-the-ksa-function\">Decompiling the KSA Function</a></li>\n<li><a href=\"#decompiling-the-prga-function\">Decompiling the PRGA Function</a></li>\n<li><a href=\"#addendum-202212\">Addendum (2022/1/2)</a></li>\n</ul>\n</li>\n<li><a href=\"#summary\">Summary</a></li>\n<li><a href=\"#references\">References</a></li>\n</ul>\n<h2 id=\"what-is-rc4-encryption\" style=\"position:relative;\"><a href=\"#what-is-rc4-encryption\" aria-label=\"what is rc4 encryption permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"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\"></path></svg></a>What Is RC4 Encryption?</h2>\n<p>RC4 is a type of stream cipher that was used in protocols such as WEP and SSL.</p>\n<p>It is now widely known to have vulnerabilities and its use is not recommended.</p>\n<p>Reference: <a href=\"https://en.wikipedia.org/wiki/RC4\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">RC4 - Wikipedia</a></p>\n<h3 id=\"stream-ciphers\" style=\"position:relative;\"><a href=\"#stream-ciphers\" aria-label=\"stream ciphers permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"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\"></path></svg></a>Stream Ciphers</h3>\n<p>A stream cipher is a type of symmetric cipher (one that uses the same key for both encryption and decryption) that encrypts data sequentially, bit by bit or byte by byte.</p>\n<p>Block ciphers are another form of symmetric cipher and are frequently compared with stream ciphers.</p>\n<p>Reference: <a href=\"https://amzn.to/3zi4Pew\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Practical Guide to Applied Cryptography</a></p>\n<h3 id=\"rc4-cipher\" style=\"position:relative;\"><a href=\"#rc4-cipher\" aria-label=\"rc4 cipher permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"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\"></path></svg></a>RC4 Cipher</h3>\n<p>Because RC4 is a stream cipher, it encrypts plaintext by XORing it with a generated pseudorandom sequence.</p>\n<p>The encryption flow with RC4 is roughly as follows:</p>\n<ul>\n<li>Using the given key, KSA generates an initial state S used to derive the encryption key stream.</li>\n<li>Using the initial state S, PRGA (the Pseudo-Random Generation Algorithm) generates the key stream for encrypting the plaintext.</li>\n<li>The generated key stream is used to XOR-encrypt the plaintext.</li>\n</ul>\n<h3 id=\"ksa\" style=\"position:relative;\"><a href=\"#ksa\" aria-label=\"ksa permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"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\"></path></svg></a>KSA</h3>\n<p>In RC4, a predefined array S is initialized using the KSA (Key Scheduling Algorithm).</p>\n<p>The implementation follows the Wikipedia sample.</p>\n<p>Reference: <a href=\"https://en.wikipedia.org/wiki/RC4\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">RC4 - Wikipedia</a></p>\n<div class=\"gatsby-highlight\" data-language=\"c\"><pre class=\"language-c\"><code class=\"language-c\"><span class=\"token macro property\"><span class=\"token directive-hash\">#</span><span class=\"token directive keyword\">define</span> <span class=\"token macro-name\">N</span> <span class=\"token expression\"><span class=\"token number\">256</span></span></span>\n\n<span class=\"token keyword\">void</span> <span class=\"token function\">swap</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">unsigned</span> <span class=\"token keyword\">char</span> <span class=\"token operator\">*</span>a<span class=\"token punctuation\">,</span> <span class=\"token keyword\">unsigned</span> <span class=\"token keyword\">char</span> <span class=\"token operator\">*</span>b<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">int</span> tmp <span class=\"token operator\">=</span> <span class=\"token operator\">*</span>a<span class=\"token punctuation\">;</span>\n    <span class=\"token operator\">*</span>a <span class=\"token operator\">=</span> <span class=\"token operator\">*</span>b<span class=\"token punctuation\">;</span>\n    <span class=\"token operator\">*</span>b <span class=\"token operator\">=</span> tmp<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">return</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">int</span> <span class=\"token function\">KSA</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">char</span> <span class=\"token operator\">*</span>key<span class=\"token punctuation\">,</span> <span class=\"token keyword\">unsigned</span> <span class=\"token keyword\">char</span> <span class=\"token operator\">*</span>S<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">{</span>\n\n    <span class=\"token comment\">// Initialize array S (S[0]=0, S[1]=1...S[255]=255)</span>\n    <span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">int</span> i <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span> i <span class=\"token operator\">&lt;</span> N<span class=\"token punctuation\">;</span> i<span class=\"token operator\">++</span><span class=\"token punctuation\">)</span> S<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> i<span class=\"token punctuation\">;</span>\n    \n    <span class=\"token comment\">// Generate the initial stream with KSA</span>\n    <span class=\"token keyword\">int</span> j <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">int</span> len <span class=\"token operator\">=</span> <span class=\"token function\">strlen</span><span class=\"token punctuation\">(</span>key<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">int</span> i <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span> i <span class=\"token operator\">&lt;</span> N<span class=\"token punctuation\">;</span> i<span class=\"token operator\">++</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">{</span>\n        j <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span>j <span class=\"token operator\">+</span> S<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span> <span class=\"token operator\">+</span> key<span class=\"token punctuation\">[</span>i <span class=\"token operator\">%</span> len<span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">%</span> N<span class=\"token punctuation\">;</span>\n        <span class=\"token function\">swap</span><span class=\"token punctuation\">(</span><span class=\"token operator\">&amp;</span>S<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> <span class=\"token operator\">&amp;</span>S<span class=\"token punctuation\">[</span>j<span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token keyword\">return</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>As shown above, the initial stream is generated by KSA based on the input key.</p>\n<h3 id=\"generating-the-key-stream-and-encrypting-with-prga\" style=\"position:relative;\"><a href=\"#generating-the-key-stream-and-encrypting-with-prga\" aria-label=\"generating the key stream and encrypting with prga permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"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\"></path></svg></a>Generating the Key Stream and Encrypting with PRGA</h3>\n<p>The steps from PRGA to encryption are implemented as follows:</p>\n<ul>\n<li>Increment i: <code class=\"language-text\">i = (i + 1) % 256</code></li>\n<li>Add S[i] to j: <code class=\"language-text\">j = (j + S[i]) % 256</code></li>\n<li>Swap S[i] and S[j]</li>\n<li>Compute key stream K as <code class=\"language-text\">S[(S[i] + S[j]) % 256]</code> and XOR it with the plaintext</li>\n</ul>\n<p>The implementation is very straightforward.</p>\n<div class=\"gatsby-highlight\" data-language=\"c\"><pre class=\"language-c\"><code class=\"language-c\"><span class=\"token keyword\">int</span> <span class=\"token function\">PRGA</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">unsigned</span> <span class=\"token keyword\">char</span> <span class=\"token operator\">*</span>S<span class=\"token punctuation\">,</span> <span class=\"token keyword\">char</span> <span class=\"token operator\">*</span>text<span class=\"token punctuation\">,</span> <span class=\"token keyword\">unsigned</span> <span class=\"token keyword\">char</span> <span class=\"token operator\">*</span>encrypted_text<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">{</span>\n\n    <span class=\"token keyword\">int</span> i <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">int</span> j <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span><span class=\"token class-name\">size_t</span> n <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span> len <span class=\"token operator\">=</span> <span class=\"token function\">strlen</span><span class=\"token punctuation\">(</span>text<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> n <span class=\"token operator\">&lt;</span> len<span class=\"token punctuation\">;</span> n<span class=\"token operator\">++</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">{</span>\n        i <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span>i <span class=\"token operator\">+</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">%</span> N<span class=\"token punctuation\">;</span>\n        j <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span>j <span class=\"token operator\">+</span> S<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">%</span> N<span class=\"token punctuation\">;</span>\n        <span class=\"token function\">swap</span><span class=\"token punctuation\">(</span><span class=\"token operator\">&amp;</span>S<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> <span class=\"token operator\">&amp;</span>S<span class=\"token punctuation\">[</span>j<span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token keyword\">int</span> K <span class=\"token operator\">=</span> S<span class=\"token punctuation\">[</span><span class=\"token punctuation\">(</span>S<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span> <span class=\"token operator\">+</span> S<span class=\"token punctuation\">[</span>j<span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">%</span> N<span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n        encrypted_text<span class=\"token punctuation\">[</span>n<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> K <span class=\"token operator\">^</span> text<span class=\"token punctuation\">[</span>n<span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token keyword\">return</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>This completes the RC4 encryption implementation.</p>\n<h3 id=\"decryption\" style=\"position:relative;\"><a href=\"#decryption\" aria-label=\"decryption permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"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\"></path></svg></a>Decryption</h3>\n<p>RC4 encrypts data using XOR with a pseudorandom sequence.</p>\n<p>Because the pseudorandom generation algorithm is deterministic, the same key always produces the same pseudorandom sequence.</p>\n<p>Therefore, you can decrypt ciphertext by XORing it again with the pseudorandom sequence generated from the same key that was used for encryption.</p>\n<h2 id=\"source-code\" style=\"position:relative;\"><a href=\"#source-code\" aria-label=\"source code permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"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\"></path></svg></a>Source Code</h2>\n<p>The full source code is shown below.</p>\n<p>It is also available in the following repository.</p>\n<p>Reference: <a href=\"https://github.com/kash1064/Try2WinDbg/blob/master/build/c/rc4_encrypt.c\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Try2WinDbg/rc4_encrypt.c</a></p>\n<div class=\"gatsby-highlight\" data-language=\"c\"><pre class=\"language-c\"><code class=\"language-c\"><span class=\"token macro property\"><span class=\"token directive-hash\">#</span><span class=\"token directive keyword\">include</span> <span class=\"token string\">&lt;stdio.h></span></span>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#</span><span class=\"token directive keyword\">include</span> <span class=\"token string\">&lt;string.h></span></span>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#</span><span class=\"token directive keyword\">include</span> <span class=\"token string\">&lt;stdlib.h></span></span>\n\n<span class=\"token macro property\"><span class=\"token directive-hash\">#</span><span class=\"token directive keyword\">define</span> <span class=\"token macro-name\">N</span> <span class=\"token expression\"><span class=\"token number\">256</span></span></span>\n\n<span class=\"token keyword\">void</span> <span class=\"token function\">swap</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">unsigned</span> <span class=\"token keyword\">char</span> <span class=\"token operator\">*</span>a<span class=\"token punctuation\">,</span> <span class=\"token keyword\">unsigned</span> <span class=\"token keyword\">char</span> <span class=\"token operator\">*</span>b<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">int</span> tmp <span class=\"token operator\">=</span> <span class=\"token operator\">*</span>a<span class=\"token punctuation\">;</span>\n    <span class=\"token operator\">*</span>a <span class=\"token operator\">=</span> <span class=\"token operator\">*</span>b<span class=\"token punctuation\">;</span>\n    <span class=\"token operator\">*</span>b <span class=\"token operator\">=</span> tmp<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">return</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">int</span> <span class=\"token function\">KSA</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">char</span> <span class=\"token operator\">*</span>key<span class=\"token punctuation\">,</span> <span class=\"token keyword\">unsigned</span> <span class=\"token keyword\">char</span> <span class=\"token operator\">*</span>S<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">{</span>\n\n    <span class=\"token comment\">// Initialize array S (S[0]=0, S[1]=1...S[255]=255)</span>\n    <span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">int</span> i <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span> i <span class=\"token operator\">&lt;</span> N<span class=\"token punctuation\">;</span> i<span class=\"token operator\">++</span><span class=\"token punctuation\">)</span> S<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> i<span class=\"token punctuation\">;</span>\n    \n    <span class=\"token comment\">// Generate the initial stream with KSA</span>\n    <span class=\"token keyword\">int</span> j <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">int</span> len <span class=\"token operator\">=</span> <span class=\"token function\">strlen</span><span class=\"token punctuation\">(</span>key<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">int</span> i <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span> i <span class=\"token operator\">&lt;</span> N<span class=\"token punctuation\">;</span> i<span class=\"token operator\">++</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">{</span>\n        j <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span>j <span class=\"token operator\">+</span> S<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span> <span class=\"token operator\">+</span> key<span class=\"token punctuation\">[</span>i <span class=\"token operator\">%</span> len<span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">%</span> N<span class=\"token punctuation\">;</span>\n        <span class=\"token function\">swap</span><span class=\"token punctuation\">(</span><span class=\"token operator\">&amp;</span>S<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> <span class=\"token operator\">&amp;</span>S<span class=\"token punctuation\">[</span>j<span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token keyword\">return</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">int</span> <span class=\"token function\">PRGA</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">unsigned</span> <span class=\"token keyword\">char</span> <span class=\"token operator\">*</span>S<span class=\"token punctuation\">,</span> <span class=\"token keyword\">char</span> <span class=\"token operator\">*</span>text<span class=\"token punctuation\">,</span> <span class=\"token keyword\">unsigned</span> <span class=\"token keyword\">char</span> <span class=\"token operator\">*</span>encrypted_text<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">{</span>\n\n    <span class=\"token keyword\">int</span> i <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">int</span> j <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span><span class=\"token class-name\">size_t</span> n <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span> len <span class=\"token operator\">=</span> <span class=\"token function\">strlen</span><span class=\"token punctuation\">(</span>text<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> n <span class=\"token operator\">&lt;</span> len<span class=\"token punctuation\">;</span> n<span class=\"token operator\">++</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">{</span>\n        i <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span>i <span class=\"token operator\">+</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">%</span> N<span class=\"token punctuation\">;</span>\n        j <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span>j <span class=\"token operator\">+</span> S<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">%</span> N<span class=\"token punctuation\">;</span>\n        <span class=\"token function\">swap</span><span class=\"token punctuation\">(</span><span class=\"token operator\">&amp;</span>S<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> <span class=\"token operator\">&amp;</span>S<span class=\"token punctuation\">[</span>j<span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token keyword\">int</span> K <span class=\"token operator\">=</span> S<span class=\"token punctuation\">[</span><span class=\"token punctuation\">(</span>S<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span> <span class=\"token operator\">+</span> S<span class=\"token punctuation\">[</span>j<span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">%</span> N<span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n        encrypted_text<span class=\"token punctuation\">[</span>n<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> K <span class=\"token operator\">^</span> text<span class=\"token punctuation\">[</span>n<span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token keyword\">return</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">int</span> <span class=\"token function\">RC4</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">char</span> <span class=\"token operator\">*</span>key<span class=\"token punctuation\">,</span> <span class=\"token keyword\">char</span> <span class=\"token operator\">*</span>text<span class=\"token punctuation\">,</span> <span class=\"token keyword\">unsigned</span> <span class=\"token keyword\">char</span> <span class=\"token operator\">*</span>encrypted_text<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">{</span>\n\n    <span class=\"token keyword\">unsigned</span> <span class=\"token keyword\">char</span> S<span class=\"token punctuation\">[</span>N<span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token function\">KSA</span><span class=\"token punctuation\">(</span>key<span class=\"token punctuation\">,</span> S<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token function\">PRGA</span><span class=\"token punctuation\">(</span>S<span class=\"token punctuation\">,</span> text<span class=\"token punctuation\">,</span> encrypted_text<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">return</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">int</span> <span class=\"token function\">main</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">int</span> argc<span class=\"token punctuation\">,</span> <span class=\"token keyword\">char</span> <span class=\"token operator\">*</span>argv<span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">{</span>\n    <span class=\"token function\">printf</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"RC4 module\\n\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token comment\">// Note: a short RC4 key is easily guessable; exercise caution in production use</span>\n    <span class=\"token keyword\">char</span> <span class=\"token operator\">*</span>key <span class=\"token operator\">=</span> <span class=\"token string\">\"testkey\"</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">char</span> <span class=\"token operator\">*</span>text <span class=\"token operator\">=</span> <span class=\"token string\">\"this is test.\"</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token keyword\">unsigned</span> <span class=\"token keyword\">char</span> <span class=\"token operator\">*</span>encrypted_text <span class=\"token operator\">=</span> <span class=\"token function\">malloc</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">sizeof</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">int</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">*</span> <span class=\"token function\">strlen</span><span class=\"token punctuation\">(</span>text<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token function\">RC4</span><span class=\"token punctuation\">(</span>key<span class=\"token punctuation\">,</span> text<span class=\"token punctuation\">,</span> encrypted_text<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token function\">printf</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"This is encrypted text\\n\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token function\">printf</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"==> \"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span><span class=\"token class-name\">size_t</span> i <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span> len <span class=\"token operator\">=</span> <span class=\"token function\">strlen</span><span class=\"token punctuation\">(</span>text<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> i <span class=\"token operator\">&lt;</span> len<span class=\"token punctuation\">;</span> i<span class=\"token operator\">++</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">{</span>\n        <span class=\"token function\">printf</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"%02hhX\"</span><span class=\"token punctuation\">,</span> encrypted_text<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n    <span class=\"token function\">printf</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"\\n\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token keyword\">unsigned</span> <span class=\"token keyword\">char</span> <span class=\"token operator\">*</span>decrypted_text <span class=\"token operator\">=</span> <span class=\"token function\">malloc</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">sizeof</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">int</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">*</span> <span class=\"token function\">strlen</span><span class=\"token punctuation\">(</span>encrypted_text<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token function\">RC4</span><span class=\"token punctuation\">(</span>key<span class=\"token punctuation\">,</span> encrypted_text<span class=\"token punctuation\">,</span> decrypted_text<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token function\">printf</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"This is decrypted text\\n\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token function\">printf</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"==> \"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span><span class=\"token class-name\">size_t</span> i <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span> len <span class=\"token operator\">=</span> <span class=\"token function\">strlen</span><span class=\"token punctuation\">(</span>text<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> i <span class=\"token operator\">&lt;</span> len<span class=\"token punctuation\">;</span> i<span class=\"token operator\">++</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">{</span>\n        <span class=\"token function\">printf</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"%c\"</span><span class=\"token punctuation\">,</span> decrypted_text<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token keyword\">return</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Finally, let’s reverse-engineer this program.</p>\n<h2 id=\"reversing-the-rc4-program\" style=\"position:relative;\"><a href=\"#reversing-the-rc4-program\" aria-label=\"reversing the rc4 program permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"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\"></path></svg></a>Reversing the RC4 Program</h2>\n<p>First, I loaded the compiled binary into Ghidra for analysis.</p>\n<p>I will skip over the process of locating the main function.</p>\n<h3 id=\"decompiling-the-calling-function\" style=\"position:relative;\"><a href=\"#decompiling-the-calling-function\" aria-label=\"decompiling the calling function permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"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\"></path></svg></a>Decompiling the Calling Function</h3>\n<p>Let’s start by looking at the RC4 calling function.</p>\n<p>In terms of the source code, this corresponds to the following section:</p>\n<div class=\"gatsby-highlight\" data-language=\"c\"><pre class=\"language-c\"><code class=\"language-c\"><span class=\"token keyword\">int</span> <span class=\"token function\">RC4</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">char</span> <span class=\"token operator\">*</span>key<span class=\"token punctuation\">,</span> <span class=\"token keyword\">char</span> <span class=\"token operator\">*</span>text<span class=\"token punctuation\">,</span> <span class=\"token keyword\">unsigned</span> <span class=\"token keyword\">char</span> <span class=\"token operator\">*</span>encrypted_text<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">unsigned</span> <span class=\"token keyword\">char</span> S<span class=\"token punctuation\">[</span>N<span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n    <span class=\"token function\">KSA</span><span class=\"token punctuation\">(</span>key<span class=\"token punctuation\">,</span> S<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token function\">PRGA</span><span class=\"token punctuation\">(</span>S<span class=\"token punctuation\">,</span> text<span class=\"token punctuation\">,</span> encrypted_text<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">return</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Looking at the decompiled output, something seems off:</p>\n<div class=\"gatsby-highlight\" data-language=\"c\"><pre class=\"language-c\"><code class=\"language-c\"><span class=\"token keyword\">void</span> __cdecl <span class=\"token function\">RC4</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">char</span> <span class=\"token operator\">*</span>param_1<span class=\"token punctuation\">,</span><span class=\"token keyword\">char</span> <span class=\"token operator\">*</span>param_2<span class=\"token punctuation\">,</span><span class=\"token keyword\">int</span> param_3<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">{</span>\n  uint uVar1<span class=\"token punctuation\">;</span>\n  undefined extraout_DL<span class=\"token punctuation\">;</span>\n  undefined in_stack_fffffef8<span class=\"token punctuation\">;</span>\n  \n  uVar1 <span class=\"token operator\">=</span> DAT_00471090 <span class=\"token operator\">^</span> <span class=\"token punctuation\">(</span>uint<span class=\"token punctuation\">)</span><span class=\"token operator\">&amp;</span>stack0xfffffffc<span class=\"token punctuation\">;</span>\n  <span class=\"token function\">thunk_FUN_004071b0</span><span class=\"token punctuation\">(</span>param_1<span class=\"token punctuation\">,</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">int</span><span class=\"token punctuation\">)</span><span class=\"token operator\">&amp;</span>stack0xfffffef8<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token function\">thunk_FUN_00407260</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">int</span><span class=\"token punctuation\">)</span><span class=\"token operator\">&amp;</span>stack0xfffffef8<span class=\"token punctuation\">,</span>param_2<span class=\"token punctuation\">,</span>param_3<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token function\">thunk_FUN_00407648</span><span class=\"token punctuation\">(</span>uVar1 <span class=\"token operator\">^</span> <span class=\"token punctuation\">(</span>uint<span class=\"token punctuation\">)</span><span class=\"token operator\">&amp;</span>stack0xfffffffc<span class=\"token punctuation\">,</span>extraout_DL<span class=\"token punctuation\">,</span>in_stack_fffffef8<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">return</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>I renamed the functions and variables to make analysis easier:</p>\n<div class=\"gatsby-highlight\" data-language=\"c\"><pre class=\"language-c\"><code class=\"language-c\"><span class=\"token keyword\">void</span> __cdecl <span class=\"token function\">RC4</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">char</span> <span class=\"token operator\">*</span>key<span class=\"token punctuation\">,</span><span class=\"token keyword\">char</span> <span class=\"token operator\">*</span>text<span class=\"token punctuation\">,</span><span class=\"token keyword\">int</span> encrypted_text<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">{</span>\n  uint uVar1<span class=\"token punctuation\">;</span>\n  undefined extraout_DL<span class=\"token punctuation\">;</span>\n  undefined S<span class=\"token punctuation\">;</span>\n  \n  uVar1 <span class=\"token operator\">=</span> DAT_00471090 <span class=\"token operator\">^</span> <span class=\"token punctuation\">(</span>uint<span class=\"token punctuation\">)</span><span class=\"token operator\">&amp;</span>stack0xfffffffc<span class=\"token punctuation\">;</span>\n  <span class=\"token function\">KSA</span><span class=\"token punctuation\">(</span>key<span class=\"token punctuation\">,</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">int</span><span class=\"token punctuation\">)</span><span class=\"token operator\">&amp;</span>stack0xfffffef8<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token function\">PRGA</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">int</span><span class=\"token punctuation\">)</span><span class=\"token operator\">&amp;</span>stack0xfffffef8<span class=\"token punctuation\">,</span>text<span class=\"token punctuation\">,</span>encrypted_text<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token function\">thunk_FUN_00407648</span><span class=\"token punctuation\">(</span>uVar1 <span class=\"token operator\">^</span> <span class=\"token punctuation\">(</span>uint<span class=\"token punctuation\">)</span><span class=\"token operator\">&amp;</span>stack0xfffffffc<span class=\"token punctuation\">,</span>extraout_DL<span class=\"token punctuation\">,</span>S<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">return</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>The following two lines do not appear in the source code and it’s unclear what they’re doing:</p>\n<div class=\"gatsby-highlight\" data-language=\"c\"><pre class=\"language-c\"><code class=\"language-c\">uVar1 <span class=\"token operator\">=</span> DAT_00471090 <span class=\"token operator\">^</span> <span class=\"token punctuation\">(</span>uint<span class=\"token punctuation\">)</span><span class=\"token operator\">&amp;</span>stack0xfffffffc<span class=\"token punctuation\">;</span>\n<span class=\"token comment\">/* ... (omitted) ... */</span>\n<span class=\"token function\">thunk_FUN_00407648</span><span class=\"token punctuation\">(</span>uVar1 <span class=\"token operator\">^</span> <span class=\"token punctuation\">(</span>uint<span class=\"token punctuation\">)</span><span class=\"token operator\">&amp;</span>stack0xfffffffc<span class=\"token punctuation\">,</span>extraout_DL<span class=\"token punctuation\">,</span>S<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>So I analyzed this section using WinDbg’s TTD trace.</p>\n<h3 id=\"analyzing-the-ttd-trace\" style=\"position:relative;\"><a href=\"#analyzing-the-ttd-trace\" aria-label=\"analyzing the ttd trace permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"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\"></path></svg></a>Analyzing the TTD Trace</h3>\n<p>I captured a TTD trace as usual.</p>\n<p>The trace file is available here:</p>\n<p>Reference: <a href=\"https://github.com/kash1064/Try2WinDbg/blob/master/traces/rc4_encrypt.zip\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Try2WinDbg/rc4_encrypt.zip</a></p>\n<p>I loaded the trace file and set a breakpoint at the address corresponding to the <code class=\"language-text\">uVar1 = DAT_00471090 ^ (uint)&amp;stack0xfffffffc;</code> instruction.</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 659px; \"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/e89668a93e15c3df0bca083fd4cb0504/6db71/image-3.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n    <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 30.83333333333333%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAYAAADDl76dAAAACXBIWXMAAAsTAAALEwEAmpwYAAABMUlEQVQY03WQS0/DMBCE8/9/A4LfwAkEVwQXXhII1KK0PFLlAUnjOHacuPbHkh64wEqjtdba2ZlJjDF0Xc84IhXn3nUTdvCkT7eUZYEbd6jeY10j/xmDK3FO470nxkDYTYQwyTuSVGVFtslp6oi1zNXUht547i/PeHt9lWWH1YpaX9OYU7S7R2tLqxqmUcmRH2ghhMR2BrXtZsKq3BNaMzL5yM3FOet1iogkXRo+PrQoLqm/ViiVUudb2kJhqi26ajC6JcnUhrc6I8sDjYr4IApbR+/g9uSI5eIZ3UFR7MRBZBAXTnIJwUuPs/pp6gVaYEge8ifu3h/JykD+KQseNkVPowM3J4e8LBZ72ZLvL/6vZLSjSB1QbRTb+6EbJGTZuzo+YL1K51kIYQ79J6d9/xvfBknLlkXLvGgAAAAASUVORK5CYII='); background-size: cover; display: block;\"\n  ></span>\n  <picture>\n          <source\n              srcset=\"/static/e89668a93e15c3df0bca083fd4cb0504/8ac56/image-3.webp 240w,\n/static/e89668a93e15c3df0bca083fd4cb0504/d3be9/image-3.webp 480w,\n/static/e89668a93e15c3df0bca083fd4cb0504/d2334/image-3.webp 659w\"\n              sizes=\"(max-width: 659px) 100vw, 659px\"\n              type=\"image/webp\"\n            />\n          <source\n            srcset=\"/static/e89668a93e15c3df0bca083fd4cb0504/8ff5a/image-3.png 240w,\n/static/e89668a93e15c3df0bca083fd4cb0504/e85cb/image-3.png 480w,\n/static/e89668a93e15c3df0bca083fd4cb0504/6db71/image-3.png 659w\"\n            sizes=\"(max-width: 659px) 100vw, 659px\"\n            type=\"image/png\"\n          />\n          <img\n            class=\"gatsby-resp-image-image\"\n            src=\"/static/e89668a93e15c3df0bca083fd4cb0504/6db71/image-3.png\"\n            alt=\"image-3.png\"\n            title=\"image-3.png\"\n            loading=\"lazy\"\n            style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n          />\n        </picture>\n  </a>\n    </span></p>\n<div class=\"gatsby-highlight\" data-language=\"powershell\"><pre class=\"language-powershell\"><code class=\"language-powershell\">> bu 0086734e</code></pre></div>\n<p>After loading it in WinDbg, I found that the data shown as <code class=\"language-text\">DAT_00471090</code> in Ghidra is actually the Security Cookie.</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 696px; \"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/4e960040ed4a62ea1a54c6669515e475/82158/image-4.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n    <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 27.916666666666668%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAYAAADDl76dAAAACXBIWXMAAAsTAAALEwEAmpwYAAABPElEQVQY04XRbUvCUBTA8X3/j1AUYWHltLASil7kG4mKMFHTabqlrjltbUuHe9D9u16DehF04Me953C4XM5RtFaLZqPBwDB4M0cs44TZ55I4DAnmM2Sk6Q/+OKVNKLWWxsvQZDiZMnZdnHnCwE7xw4i+aaG/WyxEYyxE337f10JhkW4o6vEVhdw1mW2V/S2VYr5MsXDDxUlZ1vO5S/L7JVThaO+MXOacQlbUDkqSKvL1ebh7SnangFKv3NK4vaPz8IjZfMZqddGfDGytQ1vU9Fqd5n2FbrXKuN3B6em4uoFrvOJJA8l/HUpKt99jZI358H05iXgJ40lKGMc4nscsCJiFAUEUsogj/gtF09qMTBPrzWIulhCFS0xzvZAA27bxxKOemO2H4zCdTERPgCtyX3wgSRKxl5R0tRJS6QtcBbjfUN/CDwAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n  ></span>\n  <picture>\n          <source\n              srcset=\"/static/4e960040ed4a62ea1a54c6669515e475/8ac56/image-4.webp 240w,\n/static/4e960040ed4a62ea1a54c6669515e475/d3be9/image-4.webp 480w,\n/static/4e960040ed4a62ea1a54c6669515e475/038cb/image-4.webp 696w\"\n              sizes=\"(max-width: 696px) 100vw, 696px\"\n              type=\"image/webp\"\n            />\n          <source\n            srcset=\"/static/4e960040ed4a62ea1a54c6669515e475/8ff5a/image-4.png 240w,\n/static/4e960040ed4a62ea1a54c6669515e475/e85cb/image-4.png 480w,\n/static/4e960040ed4a62ea1a54c6669515e475/82158/image-4.png 696w\"\n            sizes=\"(max-width: 696px) 100vw, 696px\"\n            type=\"image/png\"\n          />\n          <img\n            class=\"gatsby-resp-image-image\"\n            src=\"/static/4e960040ed4a62ea1a54c6669515e475/82158/image-4.png\"\n            alt=\"image-4.png\"\n            title=\"image-4.png\"\n            loading=\"lazy\"\n            style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n          />\n        </picture>\n  </a>\n    </span></p>\n<p><code class=\"language-text\">__security_cookie</code> is defined in the data section and is used to detect buffer overflows.</p>\n<p>Reference: <a href=\"https://reverseengineering.stackexchange.com/questions/22182/security-cookie-for-function-pointers-in-windows-10\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">ida - _<em>security</em>cookie for function pointers in Windows 10</a></p>\n<p>It turns out those two mysterious lines implement the stack-cookie mechanism for detecting buffer overflows:</p>\n<div class=\"gatsby-highlight\" data-language=\"c\"><pre class=\"language-c\"><code class=\"language-c\">uVar1 <span class=\"token operator\">=</span> DAT_00471090 <span class=\"token operator\">^</span> <span class=\"token punctuation\">(</span>uint<span class=\"token punctuation\">)</span><span class=\"token operator\">&amp;</span>stack0xfffffffc<span class=\"token punctuation\">;</span>\n<span class=\"token comment\">/* ... (omitted) ... */</span>\n<span class=\"token function\">thunk_FUN_00407648</span><span class=\"token punctuation\">(</span>uVar1 <span class=\"token operator\">^</span> <span class=\"token punctuation\">(</span>uint<span class=\"token punctuation\">)</span><span class=\"token operator\">&amp;</span>stack0xfffffffc<span class=\"token punctuation\">,</span>extraout_DL<span class=\"token punctuation\">,</span>S<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>That clears things up a bit. Let’s move on to analyzing KSA and PRGA.</p>\n<h3 id=\"decompiling-the-ksa-function\" style=\"position:relative;\"><a href=\"#decompiling-the-ksa-function\" aria-label=\"decompiling the ksa function permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"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\"></path></svg></a>Decompiling the KSA Function</h3>\n<p>Here is the result of decompiling the KSA function in Ghidra:</p>\n<div class=\"gatsby-highlight\" data-language=\"c\"><pre class=\"language-c\"><code class=\"language-c\">undefined4 __cdecl <span class=\"token function\">KSA</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">char</span> <span class=\"token operator\">*</span>param_1<span class=\"token punctuation\">,</span><span class=\"token keyword\">int</span> param_2<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">{</span>\n  <span class=\"token class-name\">size_t</span> sVar1<span class=\"token punctuation\">;</span>\n  uint local_10<span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">int</span> local_c<span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">int</span> local_8<span class=\"token punctuation\">;</span>\n  \n  <span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span>local_c <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span> local_c <span class=\"token operator\">&lt;</span> <span class=\"token number\">0x100</span><span class=\"token punctuation\">;</span> local_c <span class=\"token operator\">=</span> local_c <span class=\"token operator\">+</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token operator\">*</span><span class=\"token punctuation\">(</span>undefined <span class=\"token operator\">*</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">(</span>param_2 <span class=\"token operator\">+</span> local_c<span class=\"token punctuation\">)</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span>undefined<span class=\"token punctuation\">)</span>local_c<span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n  local_10 <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span>\n  sVar1 <span class=\"token operator\">=</span> <span class=\"token function\">_strlen</span><span class=\"token punctuation\">(</span>param_1<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span>local_8 <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span> local_8 <span class=\"token operator\">&lt;</span> <span class=\"token number\">0x100</span><span class=\"token punctuation\">;</span> local_8 <span class=\"token operator\">=</span> local_8 <span class=\"token operator\">+</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    local_10 <span class=\"token operator\">=</span> <span class=\"token operator\">*</span><span class=\"token punctuation\">(</span>byte <span class=\"token operator\">*</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">(</span>param_2 <span class=\"token operator\">+</span> local_8<span class=\"token punctuation\">)</span> <span class=\"token operator\">+</span> local_10 <span class=\"token operator\">+</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">int</span><span class=\"token punctuation\">)</span>param_1<span class=\"token punctuation\">[</span>local_8 <span class=\"token operator\">%</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">int</span><span class=\"token punctuation\">)</span>sVar1<span class=\"token punctuation\">]</span> <span class=\"token operator\">&amp;</span>\n               <span class=\"token number\">0x800000ff</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">int</span><span class=\"token punctuation\">)</span>local_10 <span class=\"token operator\">&lt;</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      local_10 <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span>local_10 <span class=\"token operator\">-</span> <span class=\"token number\">1</span> <span class=\"token operator\">|</span> <span class=\"token number\">0xffffff00</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">+</span> <span class=\"token number\">1</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n    <span class=\"token function\">thunk_FUN_00867180</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span>undefined <span class=\"token operator\">*</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">(</span>param_2 <span class=\"token operator\">+</span> local_8<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span><span class=\"token punctuation\">(</span>undefined <span class=\"token operator\">*</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">(</span>param_2 <span class=\"token operator\">+</span> local_10<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n  <span class=\"token keyword\">return</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>This closely resembles the decompiled output of the binary from the <a href=\"https://harekaze.com/ctf/2021.html\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Harekaze mini CTF 2021</a> Rev challenge.</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 500px; \"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/1e41c17bd1239ee2d989d8b1800cf4d1/0b533/image-5.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n    <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 68.75%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAOCAYAAAAvxDzwAAAACXBIWXMAARlAAAEZQAGA43XUAAABk0lEQVQ4y41Ti3LbMAzz///TPmJfse3axbEelChSwiC7brurL6nueEwiCQEIaInhB3L5CZGBlAZCGIiRlQ2aG1poqNWhm8KqYa4xxl5Xa9FWYFbhbugdrPFe46zx0Z8C3rZORjeUcvt06PrwCfZoLVmckla0lr9cvKqnDN0zVBUxddRkMGmU2y9AD+ZPGRZZacgdqcxZOqwZru8MPME6AANd3EJCSXdIEqQaCTrBDYXunoZ9ZvhoHEvvyouCSoaaE2epBFB079DW+XmOwL7FboIuKWZK3ng5wwfzRrDR8cXtR8z+Y1iKETBASsCvdcXL/S/qnTLV4CaUz0CzuxVIbRAGvCUlgQSlMikz+HFXtgNOZJG5sSHXV5qzwinRekOeCeBITte/JVnV+dwqw92QoiHnsj+7KOyBzBNnq0IG808Nac9t21nOp2he0LRw1n4AzqiIVBrTdmMqpTI5hwnO6ucsncxBgGNv2Hgbced3/4jNn98BL68rQgxkGdnj0UPExr6FowKjNX8798J55m1vP7cF/ANCGU4Yr1jrVQAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n  ></span>\n  <picture>\n          <source\n              srcset=\"/static/1e41c17bd1239ee2d989d8b1800cf4d1/8ac56/image-5.webp 240w,\n/static/1e41c17bd1239ee2d989d8b1800cf4d1/d3be9/image-5.webp 480w,\n/static/1e41c17bd1239ee2d989d8b1800cf4d1/b0a15/image-5.webp 500w\"\n              sizes=\"(max-width: 500px) 100vw, 500px\"\n              type=\"image/webp\"\n            />\n          <source\n            srcset=\"/static/1e41c17bd1239ee2d989d8b1800cf4d1/8ff5a/image-5.png 240w,\n/static/1e41c17bd1239ee2d989d8b1800cf4d1/e85cb/image-5.png 480w,\n/static/1e41c17bd1239ee2d989d8b1800cf4d1/0b533/image-5.png 500w\"\n            sizes=\"(max-width: 500px) 100vw, 500px\"\n            type=\"image/png\"\n          />\n          <img\n            class=\"gatsby-resp-image-image\"\n            src=\"/static/1e41c17bd1239ee2d989d8b1800cf4d1/0b533/image-5.png\"\n            alt=\"image-5.png\"\n            title=\"image-5.png\"\n            loading=\"lazy\"\n            style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n          />\n        </picture>\n  </a>\n    </span></p>\n<p>Reference: <a href=\"https://github.com/TeamHarekaze/harekaze-mini-ctf-2021-challenges-public/blob/main/rev/pack-program/solution/Pack%20Program-solve.pdf\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">harekaze-mini-ctf-2021 Pack</a></p>\n<p>It’s frustrating to think that if I had caught this right away, I could have solved the challenge.</p>\n<h3 id=\"decompiling-the-prga-function\" style=\"position:relative;\"><a href=\"#decompiling-the-prga-function\" aria-label=\"decompiling the prga function permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"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\"></path></svg></a>Decompiling the PRGA Function</h3>\n<p>Here is the decompiled output:</p>\n<div class=\"gatsby-highlight\" data-language=\"c\"><pre class=\"language-c\"><code class=\"language-c\">undefined4 __cdecl <span class=\"token function\">PRGA</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">int</span> param_1<span class=\"token punctuation\">,</span><span class=\"token keyword\">char</span> <span class=\"token operator\">*</span>param_2<span class=\"token punctuation\">,</span><span class=\"token keyword\">int</span> param_3<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">{</span>\n  <span class=\"token class-name\">size_t</span> sVar1<span class=\"token punctuation\">;</span>\n  uint local_10<span class=\"token punctuation\">;</span>\n  uint local_c<span class=\"token punctuation\">;</span>\n  uint local_8<span class=\"token punctuation\">;</span>\n  \n  local_8 <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span>\n  local_10 <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span>\n  local_c <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span>\n  sVar1 <span class=\"token operator\">=</span> <span class=\"token function\">_strlen</span><span class=\"token punctuation\">(</span>param_2<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">;</span> local_c <span class=\"token operator\">&lt;</span> sVar1<span class=\"token punctuation\">;</span> local_c <span class=\"token operator\">=</span> local_c <span class=\"token operator\">+</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    local_8 <span class=\"token operator\">=</span> local_8 <span class=\"token operator\">+</span> <span class=\"token number\">1</span> <span class=\"token operator\">&amp;</span> <span class=\"token number\">0x800000ff</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">int</span><span class=\"token punctuation\">)</span>local_8 <span class=\"token operator\">&lt;</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      local_8 <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span>local_8 <span class=\"token operator\">-</span> <span class=\"token number\">1</span> <span class=\"token operator\">|</span> <span class=\"token number\">0xffffff00</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">+</span> <span class=\"token number\">1</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n    local_10 <span class=\"token operator\">=</span> <span class=\"token operator\">*</span><span class=\"token punctuation\">(</span>byte <span class=\"token operator\">*</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">(</span>param_1 <span class=\"token operator\">+</span> local_8<span class=\"token punctuation\">)</span> <span class=\"token operator\">+</span> local_10 <span class=\"token operator\">&amp;</span> <span class=\"token number\">0x800000ff</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">int</span><span class=\"token punctuation\">)</span>local_10 <span class=\"token operator\">&lt;</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      local_10 <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span>local_10 <span class=\"token operator\">-</span> <span class=\"token number\">1</span> <span class=\"token operator\">|</span> <span class=\"token number\">0xffffff00</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">+</span> <span class=\"token number\">1</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n    <span class=\"token function\">thunk_FUN_00867180</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span>undefined <span class=\"token operator\">*</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">(</span>param_1 <span class=\"token operator\">+</span> local_8<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span><span class=\"token punctuation\">(</span>undefined <span class=\"token operator\">*</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">(</span>param_1 <span class=\"token operator\">+</span> local_10<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token operator\">*</span><span class=\"token punctuation\">(</span>byte <span class=\"token operator\">*</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">(</span>param_3 <span class=\"token operator\">+</span> local_c<span class=\"token punctuation\">)</span> <span class=\"token operator\">=</span>\n         param_2<span class=\"token punctuation\">[</span>local_c<span class=\"token punctuation\">]</span> <span class=\"token operator\">^</span>\n         <span class=\"token operator\">*</span><span class=\"token punctuation\">(</span>byte <span class=\"token operator\">*</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">(</span>param_1 <span class=\"token operator\">+</span>\n                  <span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span>uint<span class=\"token punctuation\">)</span><span class=\"token operator\">*</span><span class=\"token punctuation\">(</span>byte <span class=\"token operator\">*</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">(</span>param_1 <span class=\"token operator\">+</span> local_8<span class=\"token punctuation\">)</span> <span class=\"token operator\">+</span> <span class=\"token punctuation\">(</span>uint<span class=\"token punctuation\">)</span><span class=\"token operator\">*</span><span class=\"token punctuation\">(</span>byte <span class=\"token operator\">*</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">(</span>param_1 <span class=\"token operator\">+</span> local_10<span class=\"token punctuation\">)</span> <span class=\"token operator\">&amp;</span>\n                  <span class=\"token number\">0x800000ff</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n  <span class=\"token keyword\">return</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>One interesting point is how <code class=\"language-text\">(i + 1) % 256</code> in the source code appears differently in the decompiled output:</p>\n<p>Note: In C, <code class=\"language-text\">+</code> and <code class=\"language-text\">&amp;</code> have the same operator precedence, so <code class=\"language-text\">i + 1</code> is evaluated first.</p>\n<div class=\"gatsby-highlight\" data-language=\"c\"><pre class=\"language-c\"><code class=\"language-c\">i <span class=\"token operator\">=</span> i <span class=\"token operator\">+</span> <span class=\"token number\">1</span> <span class=\"token operator\">&amp;</span> <span class=\"token number\">0x800000ff</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">int</span><span class=\"token punctuation\">)</span>i <span class=\"token operator\">&lt;</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\ti <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span>i <span class=\"token operator\">-</span> <span class=\"token number\">1</span> <span class=\"token operator\">|</span> <span class=\"token number\">0xffffff00</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">+</span> <span class=\"token number\">1</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>I wrote a small script to verify, and confirmed that this expression produces exactly the same result as <code class=\"language-text\">% 256</code>:</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token keyword\">def</span> <span class=\"token function\">mod256</span><span class=\"token punctuation\">(</span>n<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    n <span class=\"token operator\">=</span> n <span class=\"token operator\">&amp;</span> <span class=\"token number\">0x800000ff</span>\n    <span class=\"token keyword\">if</span> n <span class=\"token operator\">&lt;</span> <span class=\"token number\">0</span><span class=\"token punctuation\">:</span>\n        n <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span>n <span class=\"token operator\">-</span> <span class=\"token number\">1</span> <span class=\"token operator\">|</span> <span class=\"token number\">0xffffff00</span><span class=\"token punctuation\">)</span>\n\n    <span class=\"token keyword\">return</span> n\n\n<span class=\"token keyword\">def</span> <span class=\"token function\">main</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    <span class=\"token keyword\">for</span> i <span class=\"token keyword\">in</span> <span class=\"token builtin\">range</span><span class=\"token punctuation\">(</span><span class=\"token number\">250</span><span class=\"token punctuation\">,</span> <span class=\"token number\">260</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n        <span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span>mod256<span class=\"token punctuation\">(</span>i<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> end<span class=\"token operator\">=</span><span class=\"token string\">\" \"</span><span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"\"</span><span class=\"token punctuation\">)</span>\n\n    <span class=\"token keyword\">return</span>\n\n<span class=\"token keyword\">if</span> __name__ <span class=\"token operator\">==</span> <span class=\"token string\">\"__main__\"</span><span class=\"token punctuation\">:</span>\n    main<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span></code></pre></div>\n<p>That’s an interesting find.</p>\n<p>In future reversing work, when I see this kind of decompiled pattern I can recognize it as a modulo operation.</p>\n<h3 id=\"addendum-202212\" style=\"position:relative;\"><a href=\"#addendum-202212\" aria-label=\"addendum 202212 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"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\"></path></svg></a>Addendum (2022/1/2)</h3>\n<p>I initially assumed that all <code class=\"language-text\">mod 256</code> code would produce the same output as shown above, but it turns out the output varies considerably depending on the compiler. Someone kindly pointed this out in a Twitter comment.</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 500px; \"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/0ca6a7d19c256f9c3adbe3288f428f42/0b533/image-6.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n    <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 41.25%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAICAYAAAD5nd/tAAAACXBIWXMAARlAAAEZQAGA43XUAAABoklEQVQoz1WSy5LaMBBF/RcBZMmWX4UfQABjgzE29jDMI4upQLLJOn+SDz+Rh2GqZnGquq5ut1rqtprmwG63ZbGYk+c5D33Pj9cXnk4P9FVJva9YrZZUVcX5/EjbNOybinJf3rwvz3THll1TUhQFVpLNKQ89+e5AnKTEaUZW1CSrgmixxE8W+FHMfD5ns61YFzuWeUGSpqQz00Td8704kA7+aYzlaA83jNEmSUwmqDBjXF7Q9U+C9sKkfGPsZ7hKITevqOoXcvuGcHycaIao/xjtN3Z1QbgBlpQSaQuDjRQCzxQO8wY/K3CTNTrboLwQ7Wr8dY/OH3FXPUoHOAaZlsg4R0zXSEdjKXPznaGo6/nmmTNcP/pEOi72cOY6OMrGkfa7d9CUFCj7A9Pc14JGuJm+MujCdD9gfxQa4on5ItuWtzypENLBGsS7eTQafSbdNWHi8XiM7/tkWUoYBoaQIAiI45goCvE8TaAVU/cb1jC9JElIzdTKsjSrcabrju/0Zi26rqMxq1LXNafTiaNZkSEeaNuW89Mz1+uV0/Uv0fUf/wEW5vDCKZRq5wAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n  ></span>\n  <picture>\n          <source\n              srcset=\"/static/0ca6a7d19c256f9c3adbe3288f428f42/8ac56/image-6.webp 240w,\n/static/0ca6a7d19c256f9c3adbe3288f428f42/d3be9/image-6.webp 480w,\n/static/0ca6a7d19c256f9c3adbe3288f428f42/b0a15/image-6.webp 500w\"\n              sizes=\"(max-width: 500px) 100vw, 500px\"\n              type=\"image/webp\"\n            />\n          <source\n            srcset=\"/static/0ca6a7d19c256f9c3adbe3288f428f42/8ff5a/image-6.png 240w,\n/static/0ca6a7d19c256f9c3adbe3288f428f42/e85cb/image-6.png 480w,\n/static/0ca6a7d19c256f9c3adbe3288f428f42/0b533/image-6.png 500w\"\n            sizes=\"(max-width: 500px) 100vw, 500px\"\n            type=\"image/png\"\n          />\n          <img\n            class=\"gatsby-resp-image-image\"\n            src=\"/static/0ca6a7d19c256f9c3adbe3288f428f42/0b533/image-6.png\"\n            alt=\"image-6.png\"\n            title=\"image-6.png\"\n            loading=\"lazy\"\n            style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n          />\n        </picture>\n  </a>\n    </span></p>\n<p>Source: <a href=\"https://twitter.com/fujitanozomu/status/1477557557103558657?s=20\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">original comment</a></p>\n<h2 id=\"summary\" style=\"position:relative;\"><a href=\"#summary\" aria-label=\"summary permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"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\"></path></svg></a>Summary</h2>\n<p>This time, as a review of Harekaze mini CTF 2021, I implemented RC4 encryption and reverse-engineered it.</p>\n<p>I made some new discoveries along the way, so it was well worth trying.</p>\n<h2 id=\"references\" style=\"position:relative;\"><a href=\"#references\" aria-label=\"references permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"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\"></path></svg></a>References</h2>\n<ul>\n<li><a href=\"https://amzn.to/3zi4Pew\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Practical Guide to Applied Cryptography</a></li>\n</ul>","fields":{"slug":"/windows-windbg-011-rc4-en","tagSlugs":["/tag/win-dbg-en/","/tag/kernel-en/","/tag/reversing-en/","/tag/c-c-en/","/tag/english/"]},"frontmatter":{"date":"2022-01-01","description":"","tags":["WinDbg (en)","Kernel (en)","Reversing (en)","C/C++ (en)","English"],"title":"Implementing RC4 Encryption in C and Reversing It with Ghidra and WinDbg","socialImage":{"publicURL":"/static/9e4eb7f7f2e918b5a9b14499e1168fe7/windows-windbg-011-rc4.png"}}}},"pageContext":{"slug":"/windows-windbg-011-rc4-en"}},"staticQueryHashes":["251939775","401334301","825871152"]}