{"componentChunkName":"component---src-templates-post-template-js","path":"/ctf-googlectf-en","result":{"data":{"markdownRemark":{"id":"72d08977-3cc9-5a8e-a142-52340c6090eb","html":"<blockquote>\n<p>This page has been machine-translated from the <a href=\"/ctf-googlectf\">original page</a>.</p>\n</blockquote>\n<p>We participated in Google CTF 2023 (held from June 24) as 0nePadding and finished in 195th place.</p>\n<p>This time we solved one problem each from Rev, Crypto, and Misc.</p>\n<p>In the past two years we participated but failed to solve any problems and didn’t even make the scoreboard, so this felt like an opportunity to recognize some growth.</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 904px; \"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/15e6a3e08247f719837ec5442f53477d/d9217/image-20230626081855374.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,iVBORw0KGgoAAAANSUhEUgAAABQAAAAOCAYAAAAvxDzwAAAACXBIWXMAAAsTAAALEwEAmpwYAAACnklEQVQ4y3VTyW4TQRCd/w4HDggU8gPAAaGwJVxyiHIADhARsQiTSHa8tD2ZzbP09Cw9i5eEBB5VbYwSAYfSVNe8fl3LK2swGMBxHIjxGLZ9hiRJUNU1dFWhIqvJb5oGbdtSTCOOYwRBgDAMzXft+75vcFav1zOBiW3DnthI0xQNETV0uSbAmrCuahyffMXh4Xvs7r7CwcEBtre3sbe3Z2x/fx95nsMqyxKpTE1mSRIjyzJMAxtnjmsA6+w428lkYoyTGA6H6Ha76Pf74CpPT0+htYbFBEzGmUkpTUlhHCFJFTJFluWGuCgK8ON8qbrWjusx5rLSVCKY+tS3EiqTVLqA5znUEwexjAhIF6qC/ms0bYWizE2saWu0sxpxEiIvMsznM0RRBCtXFWJfY17/RKmWcMcR4qCAIyLo7NzE2RYNcD4DmvLSnC/I/74AsoRaoq+wXFxShgqWkK/xzt/Asd7CF3UXb0YbeDO8hbdiA51ic2XlJr6RHev7hLmHTr7yT6otfJjewcf0NuK2gyKrYZ3JT/jsPsBQ76CbPsWReIij0SN0k+cYFGwvMChXNtIv0VPP0M/Z34God9Hxn+BEPoZqh8gVD0WWVHKJWXUFrRZwJhE8O0YaasiQeuQXyJMZ/f9hSq3yc7S/y162IIym1iwxn12A52GxVFzXMY1P04Tk0CeBj6nZEZSSkBQrygylLghDg1OpGQL7NQ3KD1zCxCStBtPplAkTeK5nNoP1OBj0MRoJCCEQEoBFz7JYS0ORlFhGfGbZMIlZBtIry87iUXueZwCsu/FY0MZM6NUViO1/hHz2fc8Q3SR0V4QMHlNmgjLk3VzvalEWfxGyoFeEPhKZmGy52psZktKFGJkH+NLa/pXhilBTyQFVI/8Q/gIKMgBzOM6NkwAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n  ></span>\n  <picture>\n          <source\n              srcset=\"/static/15e6a3e08247f719837ec5442f53477d/8ac56/image-20230626081855374.webp 240w,\n/static/15e6a3e08247f719837ec5442f53477d/d3be9/image-20230626081855374.webp 480w,\n/static/15e6a3e08247f719837ec5442f53477d/82aba/image-20230626081855374.webp 904w\"\n              sizes=\"(max-width: 904px) 100vw, 904px\"\n              type=\"image/webp\"\n            />\n          <source\n            srcset=\"/static/15e6a3e08247f719837ec5442f53477d/8ff5a/image-20230626081855374.png 240w,\n/static/15e6a3e08247f719837ec5442f53477d/e85cb/image-20230626081855374.png 480w,\n/static/15e6a3e08247f719837ec5442f53477d/d9217/image-20230626081855374.png 904w\"\n            sizes=\"(max-width: 904px) 100vw, 904px\"\n            type=\"image/png\"\n          />\n          <img\n            class=\"gatsby-resp-image-image\"\n            src=\"/static/15e6a3e08247f719837ec5442f53477d/d9217/image-20230626081855374.png\"\n            alt=\"image-20230626081855374\"\n            title=\"image-20230626081855374\"\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>The Crypto problem was also one I couldn’t solve alone — being able to solve it by consulting with team members made me realize that 0nePadding as a team was operating more actively than last year.</p>\n<p>I’ll review the unsolved problems later; for now, here’s a summary of just the ones we solved.</p>\n<!-- omit in toc -->\n<h2 id=\"table-of-contents\" style=\"position:relative;\"><a href=\"#table-of-contents\" aria-label=\"table of contents permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Table of Contents</h2>\n<ul>\n<li><a href=\"#zermattrev\">ZERMATT(Rev)</a></li>\n<li><a href=\"#least-common-genominatorcrypto\">LEAST COMMON GENOMINATOR?(Crypto)</a></li>\n<li><a href=\"#papapapamisc\">PAPAPAPA(Misc)</a></li>\n<li><a href=\"#summary\">Summary</a></li>\n</ul>\n<h2 id=\"zermattrev\" style=\"position:relative;\"><a href=\"#zermattrev\" aria-label=\"zermattrev 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>ZERMATT(Rev)</h2>\n<blockquote>\n<p>Roblox made lua packing popular, since we’d like to keep hanging out with the cool kids, he’s our take on it.</p>\n</blockquote>\n<p>A very long, obfuscated Lua script file is provided as the challenge binary.</p>\n<p>Formatting and displaying the obfuscated script reveals about 3000 lines, with convoluted processing at the top 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: 960px; \"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/89d55cf1ecffc5ab4e00be0c172cb720/00d43/image-20230626232514302.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.66666666666667%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAVCAYAAABG1c6oAAAACXBIWXMAAAsTAAALEwEAmpwYAAACeUlEQVQ4y6VUV47rMBDLQeLEsrrckzjb738sPs44bfGwwJaPgSwpoUhO2dTGYEgDpm7Ax9RgPhyw3++x2+1+FRsjgLHH2HZYpoJumLDXy70C/zQ2TdPAuYgcMvrkkPoRhmfy2q8ArbWojcXSP2EgO9MYiA1/AHQqMfmErvRoU0TgI9VfAHf7HXzjMHYd+jbCUnJVVTejq+qz8Y93Gg/7jXPugl4jhsAs95iGAcEHiL+WFnjX6PcaBvIfY/htea/h9K6u64tkAsrGkaX3Dn2X4Xgu/t4B7e2BbwBSsvWIPlL+HttthW21hsh93F/jS8nCItqoHtYEFknKwpKZle9aV+/WvZ6Z+ssqUMDkEjul4DxFnOeC52PG0yFjaD0L3uMwRMy9BD3uAs+C3smjoqB6SNymIWCg3GXu8XrKeF86vJ1bPM0ZOVqUZFlODl12LKl7yF7uRcFVzdopBCy+kMXA1gt4ObR4XVq8HAtZr2zOBF+mtDIk02VOaLNHCvb2QGDibpKLz5h6Ao4BzzMBTwWnMSmYAJ0Zy5Rx5NmZYCcBv9gg4PJgG51KV8DsMn80klXC26nDOyU/H4t6d2Ssa8ChF5YMlpVYYepVrkZj7gwDszzkjtGwBa1KkRCPpAajb1SSrNGxKpxnza3J0M7Z3b/VQx1f3UjPHF9PKuPKTpiK7BKcJiAQVBjV9X1mfi4bVn2wgSaLRI8PZlkSIqUzdVG9fLmAavkwUYndJGyvSq4D+SbZNZKxqDV3HAtrLDJzawZFtshtH8qm8KxhcQtLw/U/QMMumcqMgdPGckAYtqN4tP7oe6P/CrqRpq85aaYyIsaoo0lAfjoHr6D/AGolVQG7lbvWAAAAAElFTkSuQmCC'); background-size: cover; display: block;\"\n  ></span>\n  <picture>\n          <source\n              srcset=\"/static/89d55cf1ecffc5ab4e00be0c172cb720/8ac56/image-20230626232514302.webp 240w,\n/static/89d55cf1ecffc5ab4e00be0c172cb720/d3be9/image-20230626232514302.webp 480w,\n/static/89d55cf1ecffc5ab4e00be0c172cb720/e46b2/image-20230626232514302.webp 960w,\n/static/89d55cf1ecffc5ab4e00be0c172cb720/a5d4d/image-20230626232514302.webp 1000w\"\n              sizes=\"(max-width: 960px) 100vw, 960px\"\n              type=\"image/webp\"\n            />\n          <source\n            srcset=\"/static/89d55cf1ecffc5ab4e00be0c172cb720/8ff5a/image-20230626232514302.png 240w,\n/static/89d55cf1ecffc5ab4e00be0c172cb720/e85cb/image-20230626232514302.png 480w,\n/static/89d55cf1ecffc5ab4e00be0c172cb720/d9199/image-20230626232514302.png 960w,\n/static/89d55cf1ecffc5ab4e00be0c172cb720/00d43/image-20230626232514302.png 1000w\"\n            sizes=\"(max-width: 960px) 100vw, 960px\"\n            type=\"image/png\"\n          />\n          <img\n            class=\"gatsby-resp-image-image\"\n            src=\"/static/89d55cf1ecffc5ab4e00be0c172cb720/d9199/image-20230626232514302.png\"\n            alt=\"image-20230626232514302\"\n            title=\"image-20230626232514302\"\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>Looking closely, the return value of passing two byte strings to the function <code class=\"language-text\">v7</code> is used as a key for Lua’s global environment variable <code class=\"language-text\">_G</code>.</p>\n<p>I used the following script to examine the results of each operation.</p>\n<div class=\"gatsby-highlight\" data-language=\"lua\"><pre class=\"language-lua\"><code class=\"language-lua\"><span class=\"token keyword\">local</span> v0 <span class=\"token operator\">=</span> string<span class=\"token punctuation\">.</span>char<span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">local</span> v1 <span class=\"token operator\">=</span> string<span class=\"token punctuation\">.</span>byte<span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">local</span> v2 <span class=\"token operator\">=</span> string<span class=\"token punctuation\">.</span>sub<span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">local</span> v3 <span class=\"token operator\">=</span> bit32 <span class=\"token keyword\">or</span> bit<span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">local</span> v4 <span class=\"token operator\">=</span> v3<span class=\"token punctuation\">.</span>bxor<span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">local</span> v5 <span class=\"token operator\">=</span> table<span class=\"token punctuation\">.</span>concat<span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">local</span> v6 <span class=\"token operator\">=</span> table<span class=\"token punctuation\">.</span>insert<span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">local</span> <span class=\"token keyword\">function</span> <span class=\"token function\">v7</span><span class=\"token punctuation\">(</span>v24<span class=\"token punctuation\">,</span> v25<span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">local</span> v26 <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">local</span> v27<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">while</span> <span class=\"token keyword\">true</span> <span class=\"token keyword\">do</span>\n        <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>v26 <span class=\"token operator\">==</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span> <span class=\"token keyword\">then</span>\n            <span class=\"token keyword\">return</span> <span class=\"token function\">v5</span><span class=\"token punctuation\">(</span>v27<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token keyword\">end</span>\n        <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>v26 <span class=\"token operator\">==</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span> <span class=\"token keyword\">then</span>\n            v27 <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n            <span class=\"token keyword\">for</span> v44 <span class=\"token operator\">=</span> <span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token operator\">#</span>v24 <span class=\"token keyword\">do</span>\n                <span class=\"token function\">v6</span><span class=\"token punctuation\">(</span>v27<span class=\"token punctuation\">,</span> <span class=\"token function\">v0</span><span class=\"token punctuation\">(</span>\n                    <span class=\"token function\">v4</span><span class=\"token punctuation\">(</span><span class=\"token function\">v1</span><span class=\"token punctuation\">(</span><span class=\"token function\">v2</span><span class=\"token punctuation\">(</span>v24<span class=\"token punctuation\">,</span> v44<span class=\"token punctuation\">,</span> v44 <span class=\"token operator\">+</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> <span class=\"token function\">v1</span><span class=\"token punctuation\">(</span><span class=\"token function\">v2</span><span class=\"token punctuation\">(</span>v25<span class=\"token punctuation\">,</span> <span class=\"token number\">1</span> <span class=\"token operator\">+</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span>v44 <span class=\"token operator\">-</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">%</span> <span class=\"token operator\">#</span>v25<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> <span class=\"token number\">1</span> <span class=\"token operator\">+</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span>v44 <span class=\"token operator\">-</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">%</span> <span class=\"token operator\">#</span>v25<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><span class=\"token punctuation\">)</span> <span class=\"token operator\">%</span> <span class=\"token number\">256</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n            <span class=\"token keyword\">end</span>\n            v26 <span class=\"token operator\">=</span> <span class=\"token number\">1</span><span class=\"token punctuation\">;</span>\n        <span class=\"token keyword\">end</span>\n    <span class=\"token keyword\">end</span>\n<span class=\"token keyword\">end</span>\n\n<span class=\"token function\">print</span><span class=\"token punctuation\">(</span><span class=\"token function\">v7</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"\\79\\15\\131\\30\\40\\13\\20\\203\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"\\59\\96\\237\\107\\69\\111\\113\\185\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n<span class=\"token function\">print</span><span class=\"token punctuation\">(</span><span class=\"token function\">v7</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"\\55\\2\\190\\232\\63\\247\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"\\68\\118\\204\\129\\81\\144\\122\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n<span class=\"token function\">print</span><span class=\"token punctuation\">(</span><span class=\"token function\">v7</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"\\12\\180\\100\\225\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"\\110\\205\\16\\132\\107\\85\\33\\139\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n<span class=\"token function\">print</span><span class=\"token punctuation\">(</span><span class=\"token function\">v7</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"\\243\\205\\101\\215\\89\\95\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"\\128\\185\\23\\190\\55\\56\\100\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n<span class=\"token function\">print</span><span class=\"token punctuation\">(</span><span class=\"token function\">v7</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"\\240\\94\\174\\46\"</span><span class=\"token punctuation\">,</span><span class=\"token string\">\"\\147\\54\\207\\92\\126\\115\\131\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n<span class=\"token function\">print</span><span class=\"token punctuation\">(</span><span class=\"token function\">v7</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"\\109\\25\\35\\60\\115\\10\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"\\30\\109\\81\\85\\29\\109\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n<span class=\"token function\">print</span><span class=\"token punctuation\">(</span><span class=\"token function\">v7</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"\\239\\234\\115\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"\\156\\159\\17\\52\\214\\86\\190\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n<span class=\"token function\">print</span><span class=\"token punctuation\">(</span><span class=\"token function\">v7</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"\\175\\186\\253\\180\\178\\169\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"\\220\\206\\143\\221\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n<span class=\"token function\">print</span><span class=\"token punctuation\">(</span><span class=\"token function\">v7</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"\\213\\149\\104\\47\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"\\178\\230\\29\\77\\119\\184\\172\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n<span class=\"token function\">print</span><span class=\"token punctuation\">(</span><span class=\"token function\">v7</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"\\235\\225\\172\\3\\21\\112\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"\\152\\149\\222\\106\\123\\23\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n<span class=\"token function\">print</span><span class=\"token punctuation\">(</span><span class=\"token function\">v7</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"\\167\\216\\54\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"\\213\\189\\70\\150\\35\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n<span class=\"token function\">print</span><span class=\"token punctuation\">(</span><span class=\"token function\">v7</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"\\28\\78\\87\\120\\13\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"\\104\\47\\53\\20\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n<span class=\"token function\">print</span><span class=\"token punctuation\">(</span><span class=\"token function\">v7</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"\\12\\172\\66\\130\\29\\168\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"\\111\\195\\44\\225\\124\\220\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n<span class=\"token function\">print</span><span class=\"token punctuation\">(</span><span class=\"token function\">v7</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"\\191\\217\\68\\12\\118\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"\\203\\184\\38\\96\\19\\203\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n<span class=\"token function\">print</span><span class=\"token punctuation\">(</span><span class=\"token function\">v7</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"\\199\\55\\96\\124\\83\\218\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"\\174\\89\\19\\25\\33\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n<span class=\"token function\">print</span><span class=\"token punctuation\">(</span><span class=\"token function\">v7</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"\\6\\46\\6\\90\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"\\107\\79\\114\\50\\46\\151\\231\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n<span class=\"token function\">print</span><span class=\"token punctuation\">(</span><span class=\"token function\">v7</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"\\204\\61\\163\\173\\57\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"\\160\\89\\198\\213\\73\\234\\89\\215\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n<span class=\"token function\">print</span><span class=\"token punctuation\">(</span><span class=\"token function\">v7</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"\\194\\77\\101\\178\\251\\203\\94\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"\\165\\40\\17\\212\\158\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n<span class=\"token function\">print</span><span class=\"token punctuation\">(</span><span class=\"token function\">v7</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"\\53\\224\\205\\5\\54\\50\\228\\205\\9\\49\\42\\224\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"\\70\\133\\185\\104\\83\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n<span class=\"token function\">print</span><span class=\"token punctuation\">(</span><span class=\"token function\">v7</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"\\217\\7\\68\\72\\38\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"\\169\\100\\37\\36\\74\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n<span class=\"token function\">print</span><span class=\"token punctuation\">(</span><span class=\"token function\">v7</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"\\67\\5\\139\\167\\83\\20\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"\\48\\96\\231\\194\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n<span class=\"token function\">print</span><span class=\"token punctuation\">(</span><span class=\"token function\">v7</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"\\150\\198\\74\\15\\46\\18\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"\\227\\168\\58\\110\\77\\121\\184\\207\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n<span class=\"token function\">print</span><span class=\"token punctuation\">(</span><span class=\"token function\">v7</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"\\177\\122\\62\\179\\69\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"\\197\\27\\92\\223\\32\\209\\187\\17\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n<span class=\"token function\">print</span><span class=\"token punctuation\">(</span><span class=\"token function\">v7</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"\\238\\13\\79\\194\\248\\8\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"\\155\\99\\63\\163\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n<span class=\"token function\">print</span><span class=\"token punctuation\">(</span><span class=\"token function\">v7</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"\\144\\141\\223\\180\\128\\187\\129\\144\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"\\228\\226\\177\\193\\237\\217\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span></code></pre></div>\n<p>Running this decodes strings like the following.</p>\n<p>It becomes clear that these strings are being passed as arguments to store functions in variables.</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 750px; \"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/0bbaf3949f2a9cb0c1a1c64cd725166a/1d69c/image-20230626234434239.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: 69.58333333333333%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAOCAYAAAAvxDzwAAAACXBIWXMAAAsTAAALEwEAmpwYAAABH0lEQVQ4y62TXU/CMBSGezVAQ1iiiVEQmcMYZeu6L3EgjpmhSKJGpsmI0Qv//3947UpcYPiRZbt409PT0yc9b1sS2gHCyxCsQ8H2zkFlDT3ZENIaOh9ZOu81KM9RnMkmjB0LN0d9oXHbRah4GB1YIHH/AXfKAIakgFVUsNrxuqrKRs5Mclya1BHSpWWsVxSQyLkXZFrlxVtdGDnEfhCJB08YH7op8C8oq6nLmI9p7UosgG9XzxvAIiKx94jrpl0ecG5N4e3q5QEX3MOgfSFuqBTgR/CK0b65BswanQv4OVngtjtMIUVgactze4qJOoRdPy0OfHFn8JtO7pZ/e4vk3Y/gtziQf53vxf+Aq/ZkrRIeRs4M5vZJrnaT2mRP9oRfe72JkaGaOQ4AAAAASUVORK5CYII='); background-size: cover; display: block;\"\n  ></span>\n  <picture>\n          <source\n              srcset=\"/static/0bbaf3949f2a9cb0c1a1c64cd725166a/8ac56/image-20230626234434239.webp 240w,\n/static/0bbaf3949f2a9cb0c1a1c64cd725166a/d3be9/image-20230626234434239.webp 480w,\n/static/0bbaf3949f2a9cb0c1a1c64cd725166a/08b4d/image-20230626234434239.webp 750w\"\n              sizes=\"(max-width: 750px) 100vw, 750px\"\n              type=\"image/webp\"\n            />\n          <source\n            srcset=\"/static/0bbaf3949f2a9cb0c1a1c64cd725166a/8ff5a/image-20230626234434239.png 240w,\n/static/0bbaf3949f2a9cb0c1a1c64cd725166a/e85cb/image-20230626234434239.png 480w,\n/static/0bbaf3949f2a9cb0c1a1c64cd725166a/1d69c/image-20230626234434239.png 750w\"\n            sizes=\"(max-width: 750px) 100vw, 750px\"\n            type=\"image/png\"\n          />\n          <img\n            class=\"gatsby-resp-image-image\"\n            src=\"/static/0bbaf3949f2a9cb0c1a1c64cd725166a/1d69c/image-20230626234434239.png\"\n            alt=\"image-20230626234434239\"\n            title=\"image-20230626234434239\"\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>Based on these results, restoring the obfuscated script produces the following.</p>\n<div class=\"gatsby-highlight\" data-language=\"lua\"><pre class=\"language-lua\"><code class=\"language-lua\"><span class=\"token keyword\">local</span> v8 <span class=\"token operator\">=</span> _G<span class=\"token punctuation\">[</span><span class=\"token string\">\"tonumber\"</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">local</span> v9 <span class=\"token operator\">=</span> _G<span class=\"token punctuation\">[</span><span class=\"token string\">\"string\"</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span><span class=\"token string\">\"byte\"</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">local</span> v10 <span class=\"token operator\">=</span> _G<span class=\"token punctuation\">[</span><span class=\"token string\">\"string\"</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span><span class=\"token string\">\"char\"</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">local</span> v11 <span class=\"token operator\">=</span> _G<span class=\"token punctuation\">[</span><span class=\"token string\">\"string\"</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span><span class=\"token string\">\"sub\"</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">local</span> v12 <span class=\"token operator\">=</span> _G<span class=\"token punctuation\">[</span><span class=\"token string\">\"string\"</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span><span class=\"token string\">\"gsub\"</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">local</span> v13 <span class=\"token operator\">=</span> _G<span class=\"token punctuation\">[</span><span class=\"token string\">\"string\"</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span><span class=\"token string\">\"rep\"</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">local</span> v14 <span class=\"token operator\">=</span> _G<span class=\"token punctuation\">[</span><span class=\"token string\">\"table\"</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span><span class=\"token string\">\"concat\"</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">local</span> v15 <span class=\"token operator\">=</span> _G<span class=\"token punctuation\">[</span><span class=\"token string\">\"table\"</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span><span class=\"token string\">\"insert\"</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">local</span> v16 <span class=\"token operator\">=</span> _G<span class=\"token punctuation\">[</span><span class=\"token string\">\"math\"</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span><span class=\"token string\">\"ldexp\"</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">local</span> v17 <span class=\"token operator\">=</span> _G<span class=\"token punctuation\">[</span><span class=\"token string\">\"getfenv\"</span><span class=\"token punctuation\">]</span> <span class=\"token keyword\">or</span> <span class=\"token keyword\">function</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token keyword\">return</span> _ENV<span class=\"token punctuation\">;</span> <span class=\"token keyword\">end</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">local</span> v18 <span class=\"token operator\">=</span> _G<span class=\"token punctuation\">[</span><span class=\"token string\">\"setmetatable\"</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">local</span> v19 <span class=\"token operator\">=</span> _G<span class=\"token punctuation\">[</span><span class=\"token string\">\"pcall\"</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">local</span> v20 <span class=\"token operator\">=</span> _G<span class=\"token punctuation\">[</span><span class=\"token string\">\"select\"</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">local</span> v21 <span class=\"token operator\">=</span> _G<span class=\"token punctuation\">[</span><span class=\"token string\">\"unpack\"</span><span class=\"token punctuation\">]</span> <span class=\"token keyword\">or</span> _G<span class=\"token punctuation\">[</span><span class=\"token string\">\"table\"</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span><span class=\"token string\">\"unpack\"</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">local</span> v22 <span class=\"token operator\">=</span> _G<span class=\"token punctuation\">[</span><span class=\"token string\">\"tonumber\"</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>Here, it appears the Lua global table is being used to store function references in variables.</p>\n<p>In my environment using Lua 5.2, the global table had the following definitions.</p>\n<div class=\"gatsby-highlight\" data-language=\"lua\"><pre class=\"language-lua\"><code class=\"language-lua\"><span class=\"token keyword\">for</span> n <span class=\"token keyword\">in</span> <span class=\"token function\">pairs</span><span class=\"token punctuation\">(</span>_G<span class=\"token punctuation\">)</span> <span class=\"token keyword\">do</span> <span class=\"token function\">print</span><span class=\"token punctuation\">(</span>n<span class=\"token punctuation\">)</span> <span class=\"token keyword\">end</span>\n<span class=\"token operator\">></span>\npairs\nloadstring\npackage\ntostring\nload\nrawlen\n_G\nsetmetatable\nassert\nrequire\nerror\nos\nunpack\ngetmetatable\nstring\ndofile\ntonumber\n_VERSION\nrawequal\ncollectgarbage\nbit32\ncoroutine\ndebug\ntable\nio\npcall\ntype\nmath\nxpcall\nnext\narg\nmodule\nrawget\nloadfile\nprint\nipairs\nselect\nrawset</code></pre></div>\n<p>Reference: <a href=\"https://www.lua.org/pil/14.html\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Programming in Lua : 14</a></p>\n<p>Replacing the variables assigned with functions based on these results makes the code somewhat more readable.</p>\n<p>And as we continue analyzing the challenge binary, we can see that a significant amount of unnecessary processing has been added to bulk up the code.</p>\n<p>For example, code like the following.</p>\n<div class=\"gatsby-highlight\" data-language=\"lua\"><pre class=\"language-lua\"><code class=\"language-lua\"><span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>v89 <span class=\"token operator\">==</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span> <span class=\"token keyword\">then</span>\n    <span class=\"token keyword\">local</span> v130 <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">while</span> <span class=\"token keyword\">true</span> <span class=\"token keyword\">do</span>\n        <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>v130 <span class=\"token operator\">==</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span> <span class=\"token keyword\">then</span>\n            v89 <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 keyword\">end</span>\n        <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token number\">0</span> <span class=\"token operator\">==</span> v130<span class=\"token punctuation\">)</span> <span class=\"token keyword\">then</span>\n            v90 <span class=\"token operator\">=</span> <span class=\"token keyword\">nil</span><span class=\"token punctuation\">;</span> \n            <span class=\"token keyword\">if</span> <span class=\"token keyword\">not</span> v87 <span class=\"token keyword\">then</span>\n                <span class=\"token keyword\">local</span> v166 <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span> <span class=\"token keyword\">local</span> v167<span class=\"token punctuation\">;</span>\n                <span class=\"token keyword\">while</span> <span class=\"token keyword\">true</span> <span class=\"token keyword\">do</span> <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>v166 <span class=\"token operator\">==</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span> <span class=\"token keyword\">then</span>\n                        v167 <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span> \n                        <span class=\"token keyword\">while</span> <span class=\"token keyword\">true</span> <span class=\"token keyword\">do</span> <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>v167 <span class=\"token operator\">==</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span> <span class=\"token keyword\">then</span>\n                                v87 <span class=\"token operator\">=</span> <span class=\"token function\">v37</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>v87 <span class=\"token operator\">==</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span> <span class=\"token keyword\">then</span> <span class=\"token keyword\">return</span> <span class=\"token string\">\"\"</span><span class=\"token punctuation\">;</span> <span class=\"token keyword\">end</span>\n                                <span class=\"token keyword\">break</span><span class=\"token punctuation\">;</span>\n                            <span class=\"token keyword\">end</span> \n                        <span class=\"token keyword\">end</span>\n                        <span class=\"token keyword\">break</span><span class=\"token punctuation\">;</span>\n                    <span class=\"token keyword\">end</span> \n                <span class=\"token keyword\">end</span>\n            <span class=\"token keyword\">end</span>\n            v130 <span class=\"token operator\">=</span> <span class=\"token number\">1</span><span class=\"token punctuation\">;</span>\n        <span class=\"token keyword\">end</span>\n    <span class=\"token keyword\">end</span>\n<span class=\"token keyword\">end</span></code></pre></div>\n<p>Looking closely, the loop ultimately just defines <code class=\"language-text\">v87 = v37();</code> and then exits.</p>\n<p>Since this type of structure appears many times throughout the script, removing these operations progressively deobfuscates the code.</p>\n<p>After removing enough unnecessary code and tracing the program’s behavior with a debugger, we find code that obtains the correct flag character by character, 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: 960px; \"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/fa0d2a20e7e09585e4ac5e76f8b0bb17/947d2/image-20230625163128387.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: 46.666666666666664%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAJCAYAAAAywQxIAAAACXBIWXMAAAsTAAALEwEAmpwYAAABU0lEQVQoz22SV27EMAxE9xCx100WVd0Db35y/5NNRnJJAuzHgDAlPo5IP7zzaJoGz+czR9UrxhbWGsTgYYyBUOaUiEEYJvg4QKyD1hpKqVsPZwM6pVFVVVYCl2WJvte5OBUkiQg0leI0r1nWet7rs657D+cGaOPoqkbbtrdbrSU7ui7+Qo9GM4HbtsOHITe6wHQY0bM4Qaq6vl3+BYpcOhwKc2lU4zjBMeZGl0NR/CD5mEGHmsCi+LifnOIhOaVhtCVsQfQjaw26LtUmBoHD/Inp9Y2w7BwyuxkLRXepcwiCGDUjxRhPhdBj3Qa8XivGgcuLvMeY8o/AGcY4ZpCWQ4ouLmCGhf/Q4HvMa8S2Lzkfo8nyPgG55TSvqm5QFkVWenLKvX+y5DPLRYYY2didszXZyOFw/YKbd2jChWq74zd4vxRNmOEMZwzTwuWE/JoENjz/AY1a+DecdCDuAAAAAElFTkSuQmCC'); background-size: cover; display: block;\"\n  ></span>\n  <picture>\n          <source\n              srcset=\"/static/fa0d2a20e7e09585e4ac5e76f8b0bb17/8ac56/image-20230625163128387.webp 240w,\n/static/fa0d2a20e7e09585e4ac5e76f8b0bb17/d3be9/image-20230625163128387.webp 480w,\n/static/fa0d2a20e7e09585e4ac5e76f8b0bb17/e46b2/image-20230625163128387.webp 960w,\n/static/fa0d2a20e7e09585e4ac5e76f8b0bb17/f992d/image-20230625163128387.webp 1440w,\n/static/fa0d2a20e7e09585e4ac5e76f8b0bb17/846bd/image-20230625163128387.webp 1773w\"\n              sizes=\"(max-width: 960px) 100vw, 960px\"\n              type=\"image/webp\"\n            />\n          <source\n            srcset=\"/static/fa0d2a20e7e09585e4ac5e76f8b0bb17/8ff5a/image-20230625163128387.png 240w,\n/static/fa0d2a20e7e09585e4ac5e76f8b0bb17/e85cb/image-20230625163128387.png 480w,\n/static/fa0d2a20e7e09585e4ac5e76f8b0bb17/d9199/image-20230625163128387.png 960w,\n/static/fa0d2a20e7e09585e4ac5e76f8b0bb17/07a9c/image-20230625163128387.png 1440w,\n/static/fa0d2a20e7e09585e4ac5e76f8b0bb17/947d2/image-20230625163128387.png 1773w\"\n            sizes=\"(max-width: 960px) 100vw, 960px\"\n            type=\"image/png\"\n          />\n          <img\n            class=\"gatsby-resp-image-image\"\n            src=\"/static/fa0d2a20e7e09585e4ac5e76f8b0bb17/d9199/image-20230625163128387.png\"\n            alt=\"image-20230625163128387\"\n            title=\"image-20230625163128387\"\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 gave us the flag.</p>\n<p>The animation shown on a correct answer was very stylish.</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 746px; \"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/f690030d1341bc63218153c21047064e/62de4/image-20230625163221330.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: 137.08333333333334%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAbCAYAAAB836/YAAAACXBIWXMAAAsTAAALEwEAmpwYAAAD10lEQVRIx51VW08bRxTe/1EpykOlhCZ/on+gTxVV1edUiipVVHlKRCWSqCQKSXoB4VAriJgY1wTwFRLAwcY3fFl7vfaub2uvvbYB8Su+zJl0kmUxUtWHT2f2zM43Z86Z842kKAp8Ph/8fj+Wl5fhdruxv7+PWCyGcrmM0WiEfr/P0ev1zlnDMJBMJrGzs8PXVKtVSN1uF61WC2RN00Sn0+E/W5Z1ztpJ7YS0ltaJsUQRnJ6e4uTkBMPhkGMwGHAiO5kgEiASQWyHRIuJnSIjMiKxEzojdJI7vyWKLBqNIp1O4+zsjJMJ2EkFsTOPzlNIFHqz2eQ5FEehMYGiFtG3221uyS/GdtA6fmSlrCCdSqMkl5GIJ1DIF5HP5zmy2SzH0dERr2apVOL+XC7HrSzL/CbQPzTmRWm262ibdfRHbHeLVYyhYxow2sanSMjSKcjqus6jpjFBVFeMpUraRHrDRD7SRz7aRzbQR0PpwRr2L1TUbsURL1R512VicbKL5VtdrNw24fq+g2zQxPCU5bJjnsupE84NeVEaehOlggpFrkEt66gqdVQUlU+Kwohi2IsgSEW0glTStBqi2xGEIyGEwkEEQwGEwyFkM1leCEI8HketVkMqlfrko0LQdyaTQaFQwOHhIS+aVK/XUSzKrMol7pCZLRaLqFQqF47rjNCZUx4hXeDj42MuAgKiY8SP4/Jnb71znTKujS4rwn8iHNen9kTbo3T6xl6bcc7LSO25GtfL/4vQfrxx4vEvodjls6L0zN4FDXRuPE6VJGvAJkYsdLLDj9YasMWE/uWEQjeFIAtiqduy0FQsdJoWDI3ZhoWW+tln10eh6OJ60XWzXzmak4xGD9VCF3qlC63EoHRQkzvMZ0BXSUVaXE3siiIgdFBcep7DmOxCsPkNgvp3CDcmEahNIqh9i7D+A96nA4gfJJE4TPDWopZLJBK85UjhxTfNEeillN7KD/FH/Au4khO4/89VLGWu4+/cNTzaugbv+guseX147X2FxcUFzM09werqKpaWljA7O4v5+Xl4PCt488bPn+K9vT0mX+XHuLdyBQ+8N/Hb+g082riBe+4J/PTkKmYXfoRr3oPpuw/wcGYOL90rePp0DjMzM5j6ZQrT07/ir99fYOFPN549e/4xwsjRfbxuXYFXv4m1xgReqdfhqX4Fj/Yl1spfYzN9B1vZKQRyP+Nd6iV238XYwj28j8Xxdn8Dm6k7iOTvInawi+3oNqRag70P2haKWhgFLYiiHuIoaAz6FvJ1Pwr1dWZ9kKsHUCtMN9UKQxVqjSlUMwi5sYmKqkDXdHwANyw+DpUXSOEAAAAASUVORK5CYII='); background-size: cover; display: block;\"\n  ></span>\n  <picture>\n          <source\n              srcset=\"/static/f690030d1341bc63218153c21047064e/8ac56/image-20230625163221330.webp 240w,\n/static/f690030d1341bc63218153c21047064e/d3be9/image-20230625163221330.webp 480w,\n/static/f690030d1341bc63218153c21047064e/f7ebd/image-20230625163221330.webp 746w\"\n              sizes=\"(max-width: 746px) 100vw, 746px\"\n              type=\"image/webp\"\n            />\n          <source\n            srcset=\"/static/f690030d1341bc63218153c21047064e/8ff5a/image-20230625163221330.png 240w,\n/static/f690030d1341bc63218153c21047064e/e85cb/image-20230625163221330.png 480w,\n/static/f690030d1341bc63218153c21047064e/62de4/image-20230625163221330.png 746w\"\n            sizes=\"(max-width: 746px) 100vw, 746px\"\n            type=\"image/png\"\n          />\n          <img\n            class=\"gatsby-resp-image-image\"\n            src=\"/static/f690030d1341bc63218153c21047064e/62de4/image-20230625163221330.png\"\n            alt=\"image-20230625163221330\"\n            title=\"image-20230625163221330\"\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=\"least-common-genominatorcrypto\" style=\"position:relative;\"><a href=\"#least-common-genominatorcrypto\" aria-label=\"least common genominatorcrypto 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>LEAST COMMON GENOMINATOR?(Crypto)</h2>\n<blockquote>\n<p>Someone used this program to send me an encrypted message but I can’t read it! It uses something called an LCG, do you know what it is? I dumped the first six consecutive values generated from it but what do I do with it?!</p>\n</blockquote>\n<p>I’ll write this up since it’s rare for me to solve a Crypto problem.</p>\n<p>I read the following script provided as the challenge binary.</p>\n<p>It appears the flag is encrypted using a key generated from primes produced by an LCG (Linear Congruential Generator).</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token keyword\">from</span> secret <span class=\"token keyword\">import</span> config\n<span class=\"token keyword\">from</span> Crypto<span class=\"token punctuation\">.</span>PublicKey <span class=\"token keyword\">import</span> RSA\n<span class=\"token keyword\">from</span> Crypto<span class=\"token punctuation\">.</span>Util<span class=\"token punctuation\">.</span>number <span class=\"token keyword\">import</span> bytes_to_long<span class=\"token punctuation\">,</span> isPrime\n\n<span class=\"token keyword\">class</span> <span class=\"token class-name\">LCG</span><span class=\"token punctuation\">:</span>\n    lcg_m <span class=\"token operator\">=</span> config<span class=\"token punctuation\">.</span>m\n    lcg_c <span class=\"token operator\">=</span> config<span class=\"token punctuation\">.</span>c\n    lcg_n <span class=\"token operator\">=</span> config<span class=\"token punctuation\">.</span>n\n\n    <span class=\"token keyword\">def</span> <span class=\"token function\">__init__</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">,</span> lcg_s<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n        self<span class=\"token punctuation\">.</span>state <span class=\"token operator\">=</span> lcg_s\n\n    <span class=\"token keyword\">def</span> <span class=\"token function\">next</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n        self<span class=\"token punctuation\">.</span>state <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">.</span>state <span class=\"token operator\">*</span> self<span class=\"token punctuation\">.</span>lcg_m <span class=\"token operator\">+</span> self<span class=\"token punctuation\">.</span>lcg_c<span class=\"token punctuation\">)</span> <span class=\"token operator\">%</span> self<span class=\"token punctuation\">.</span>lcg_n\n        <span class=\"token keyword\">return</span> self<span class=\"token punctuation\">.</span>state\n\n<span class=\"token keyword\">if</span> __name__ <span class=\"token operator\">==</span> <span class=\"token string\">'__main__'</span><span class=\"token punctuation\">:</span>\n\n    <span class=\"token keyword\">assert</span> <span class=\"token number\">4096</span> <span class=\"token operator\">%</span> config<span class=\"token punctuation\">.</span>it <span class=\"token operator\">==</span> <span class=\"token number\">0</span>\n    <span class=\"token keyword\">assert</span> config<span class=\"token punctuation\">.</span>it <span class=\"token operator\">==</span> <span class=\"token number\">8</span>\n    <span class=\"token keyword\">assert</span> <span class=\"token number\">4096</span> <span class=\"token operator\">%</span> config<span class=\"token punctuation\">.</span>bits <span class=\"token operator\">==</span> <span class=\"token number\">0</span>\n    <span class=\"token keyword\">assert</span> config<span class=\"token punctuation\">.</span>bits <span class=\"token operator\">==</span> <span class=\"token number\">512</span>\n\n    <span class=\"token comment\"># Find prime value of specified bits a specified amount of times</span>\n    seed <span class=\"token operator\">=</span> <span class=\"token number\">211286818345627549183608678726370412218029639873054513839005340650674982169404937862395980568550063504804783328450267566224937880641772833325018028629959635</span>\n    lcg <span class=\"token operator\">=</span> LCG<span class=\"token punctuation\">(</span>seed<span class=\"token punctuation\">)</span>\n    primes_arr <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span>\n    \n    dump <span class=\"token operator\">=</span> <span class=\"token boolean\">True</span>\n    items <span class=\"token operator\">=</span> <span class=\"token number\">0</span>\n    dump_file <span class=\"token operator\">=</span> <span class=\"token builtin\">open</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"dump.txt\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"w\"</span><span class=\"token punctuation\">)</span>\n\n    primes_n <span class=\"token operator\">=</span> <span class=\"token number\">1</span>\n    <span class=\"token keyword\">while</span> <span class=\"token boolean\">True</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>config<span class=\"token punctuation\">.</span>it<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n            <span class=\"token keyword\">while</span> <span class=\"token boolean\">True</span><span class=\"token punctuation\">:</span>\n                prime_candidate <span class=\"token operator\">=</span> lcg<span class=\"token punctuation\">.</span><span class=\"token builtin\">next</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n                <span class=\"token keyword\">if</span> dump<span class=\"token punctuation\">:</span>\n                    dump_file<span class=\"token punctuation\">.</span>write<span class=\"token punctuation\">(</span><span class=\"token builtin\">str</span><span class=\"token punctuation\">(</span>prime_candidate<span class=\"token punctuation\">)</span> <span class=\"token operator\">+</span> <span class=\"token string\">'\\n'</span><span class=\"token punctuation\">)</span>\n                    items <span class=\"token operator\">+=</span> <span class=\"token number\">1</span>\n                    <span class=\"token keyword\">if</span> items <span class=\"token operator\">==</span> <span class=\"token number\">6</span><span class=\"token punctuation\">:</span>\n                        dump <span class=\"token operator\">=</span> <span class=\"token boolean\">False</span>\n                        dump_file<span class=\"token punctuation\">.</span>close<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n                <span class=\"token keyword\">if</span> <span class=\"token keyword\">not</span> isPrime<span class=\"token punctuation\">(</span>prime_candidate<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n                    <span class=\"token keyword\">continue</span>\n                <span class=\"token keyword\">elif</span> prime_candidate<span class=\"token punctuation\">.</span>bit_length<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">!=</span> config<span class=\"token punctuation\">.</span>bits<span class=\"token punctuation\">:</span>\n                    <span class=\"token keyword\">continue</span>\n                <span class=\"token keyword\">else</span><span class=\"token punctuation\">:</span>\n                    primes_n <span class=\"token operator\">*=</span> prime_candidate\n                    primes_arr<span class=\"token punctuation\">.</span>append<span class=\"token punctuation\">(</span>prime_candidate<span class=\"token punctuation\">)</span>\n                    <span class=\"token keyword\">break</span>\n        \n        <span class=\"token comment\"># Check bit length</span>\n        <span class=\"token keyword\">if</span> primes_n<span class=\"token punctuation\">.</span>bit_length<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">></span> <span class=\"token number\">4096</span><span class=\"token punctuation\">:</span>\n            <span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"bit length\"</span><span class=\"token punctuation\">,</span> primes_n<span class=\"token punctuation\">.</span>bit_length<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n            primes_arr<span class=\"token punctuation\">.</span>clear<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n            primes_n <span class=\"token operator\">=</span> <span class=\"token number\">1</span>\n            <span class=\"token keyword\">continue</span>\n        <span class=\"token keyword\">else</span><span class=\"token punctuation\">:</span>\n            <span class=\"token keyword\">break</span>\n\n    <span class=\"token comment\"># Create public key 'n'</span>\n    n <span class=\"token operator\">=</span> <span class=\"token number\">1</span>\n    <span class=\"token keyword\">for</span> j <span class=\"token keyword\">in</span> primes_arr<span class=\"token punctuation\">:</span>\n        n <span class=\"token operator\">*=</span> j\n    <span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"[+] Public Key: \"</span><span class=\"token punctuation\">,</span> n<span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"[+] size: \"</span><span class=\"token punctuation\">,</span> n<span class=\"token punctuation\">.</span>bit_length<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"bits\"</span><span class=\"token punctuation\">)</span>\n\n    <span class=\"token comment\"># Calculate totient 'Phi(n)'</span>\n    phi <span class=\"token operator\">=</span> <span class=\"token number\">1</span>\n    <span class=\"token keyword\">for</span> k <span class=\"token keyword\">in</span> primes_arr<span class=\"token punctuation\">:</span>\n        phi <span class=\"token operator\">*=</span> <span class=\"token punctuation\">(</span>k <span class=\"token operator\">-</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span>\n\n    <span class=\"token comment\"># Calculate private key 'd'</span>\n    d <span class=\"token operator\">=</span> <span class=\"token builtin\">pow</span><span class=\"token punctuation\">(</span>config<span class=\"token punctuation\">.</span>e<span class=\"token punctuation\">,</span> <span class=\"token operator\">-</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span> phi<span class=\"token punctuation\">)</span>\n\n    <span class=\"token comment\"># Generate Flag</span>\n    <span class=\"token keyword\">assert</span> config<span class=\"token punctuation\">.</span>flag<span class=\"token punctuation\">.</span>startswith<span class=\"token punctuation\">(</span><span class=\"token string\">b\"CTF{\"</span><span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">assert</span> config<span class=\"token punctuation\">.</span>flag<span class=\"token punctuation\">.</span>endswith<span class=\"token punctuation\">(</span><span class=\"token string\">b\"}\"</span><span class=\"token punctuation\">)</span>\n    enc_flag <span class=\"token operator\">=</span> bytes_to_long<span class=\"token punctuation\">(</span>config<span class=\"token punctuation\">.</span>flag<span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">assert</span> enc_flag <span class=\"token operator\">&lt;</span> n\n\n    <span class=\"token comment\"># Encrypt Flag</span>\n    _enc <span class=\"token operator\">=</span> <span class=\"token builtin\">pow</span><span class=\"token punctuation\">(</span>enc_flag<span class=\"token punctuation\">,</span> config<span class=\"token punctuation\">.</span>e<span class=\"token punctuation\">,</span> n<span class=\"token punctuation\">)</span>\n\n    <span class=\"token keyword\">with</span> <span class=\"token builtin\">open</span> <span class=\"token punctuation\">(</span><span class=\"token string\">\"flag.txt\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"wb\"</span><span class=\"token punctuation\">)</span> <span class=\"token keyword\">as</span> flag_file<span class=\"token punctuation\">:</span>\n        flag_file<span class=\"token punctuation\">.</span>write<span class=\"token punctuation\">(</span>_enc<span class=\"token punctuation\">.</span>to_bytes<span class=\"token punctuation\">(</span>n<span class=\"token punctuation\">.</span>bit_length<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"little\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n\n    <span class=\"token comment\"># Export RSA Key</span>\n    rsa <span class=\"token operator\">=</span> RSA<span class=\"token punctuation\">.</span>construct<span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span>n<span class=\"token punctuation\">,</span> config<span class=\"token punctuation\">.</span>e<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">with</span> <span class=\"token builtin\">open</span> <span class=\"token punctuation\">(</span><span class=\"token string\">\"public.pem\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"w\"</span><span class=\"token punctuation\">)</span> <span class=\"token keyword\">as</span> pub_file<span class=\"token punctuation\">:</span>\n        pub_file<span class=\"token punctuation\">.</span>write<span class=\"token punctuation\">(</span>rsa<span class=\"token punctuation\">.</span>exportKey<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></code></pre></div>\n<p>LCG (Linear Congruential Generator) produces a sequence of pseudorandom numbers using the recurrence <code class=\"language-text\">Xn+1 = (m*Xn + c) mod n</code>.</p>\n<p>The initial seed value was hardcoded in the challenge script, but the three values m, c, and n are not given.</p>\n<p>However, the first 6 generated values are provided as dump.txt.</p>\n<p>Since it seemed possible to determine m, c, and n from these values and identify the prime sequence used for key generation, I researched this with my teammates and found the following article.</p>\n<p>Reference: <a href=\"https://satto.hatenadiary.com/entry/solve-LCG#A-multiplier-%E3%81%A8-B--increment-%E3%81%A8-M-modulus-%E3%81%8C%E6%9C%AA%E7%9F%A5%E3%81%A7%E3%81%82%E3%82%8B%E5%A0%B4%E5%90%88\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Predicting Pseudorandom Numbers Generated by the Linear Congruential Generator - s4tt01237’s diary</a></p>\n<p>It appears that the LCG parameters can be determined from a few initial output values by finding the modulus from the GCD of certain derived values, then solving simultaneous equations based on the modulus.</p>\n<p>Using this approach, I was able to determine all three values m, c, and n with the following script.</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token keyword\">from</span> Crypto<span class=\"token punctuation\">.</span>Util<span class=\"token punctuation\">.</span>number <span class=\"token keyword\">import</span> inverse<span class=\"token punctuation\">,</span> GCD\n<span class=\"token keyword\">from</span> functools <span class=\"token keyword\">import</span> <span class=\"token builtin\">reduce</span>\n\nprime_candidates <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token number\">2166771675595184069339107365908377157701164485820981409993925279512199123418374034275465590004848135946671454084220731645099286746251308323653144363063385</span><span class=\"token punctuation\">,</span>\n<span class=\"token number\">6729272950467625456298454678219613090467254824679318993052294587570153424935267364971827277137521929202783621553421958533761123653824135472378133765236115</span><span class=\"token punctuation\">,</span>\n<span class=\"token number\">2230396903302352921484704122705539403201050490164649102182798059926343096511158288867301614648471516723052092761312105117735046752506523136197227936190287</span><span class=\"token punctuation\">,</span>\n<span class=\"token number\">4578847787736143756850823407168519112175260092601476810539830792656568747136604250146858111418705054138266193348169239751046779010474924367072989895377792</span><span class=\"token punctuation\">,</span>\n<span class=\"token number\">7578332979479086546637469036948482551151240099803812235949997147892871097982293017256475189504447955147399405791875395450814297264039908361472603256921612</span><span class=\"token punctuation\">,</span>\n<span class=\"token number\">2550420443270381003007873520763042837493244197616666667768397146110589301602119884836605418664463550865399026934848289084292975494312467018767881691302197</span><span class=\"token punctuation\">]</span>\n\n<span class=\"token keyword\">def</span> <span class=\"token function\">solve_unknown_increment</span><span class=\"token punctuation\">(</span>states<span class=\"token punctuation\">,</span> A<span class=\"token punctuation\">,</span> M<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    B <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span>states<span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">-</span> A <span class=\"token operator\">*</span> states<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">%</span> M\n    <span class=\"token keyword\">return</span> B\n\n<span class=\"token keyword\">def</span> <span class=\"token function\">solve_unknown_multiplier</span><span class=\"token punctuation\">(</span>states<span class=\"token punctuation\">,</span> M<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    A <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span>states<span class=\"token punctuation\">[</span><span class=\"token number\">2</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">-</span> states<span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">*</span> inverse<span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span>states<span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">-</span> states<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> M<span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">return</span> A\n\n<span class=\"token keyword\">def</span> <span class=\"token function\">solve_unknown_modulus</span><span class=\"token punctuation\">(</span>states<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    diffs <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span>X_1 <span class=\"token operator\">-</span> X_0 <span class=\"token keyword\">for</span> X_0<span class=\"token punctuation\">,</span> X_1 <span class=\"token keyword\">in</span> <span class=\"token builtin\">zip</span><span class=\"token punctuation\">(</span>states<span class=\"token punctuation\">,</span> states<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><span class=\"token punctuation\">]</span>\n    multiples_of_M <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span>T_2 <span class=\"token operator\">*</span> T_0 <span class=\"token operator\">-</span> T_1 <span class=\"token operator\">**</span> <span class=\"token number\">2</span> <span class=\"token keyword\">for</span> T_0<span class=\"token punctuation\">,</span> T_1<span class=\"token punctuation\">,</span> T_2<span class=\"token punctuation\">,</span> <span class=\"token keyword\">in</span> <span class=\"token builtin\">zip</span><span class=\"token punctuation\">(</span>diffs<span class=\"token punctuation\">,</span> diffs<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> diffs<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><span class=\"token punctuation\">]</span>\n\n    <span class=\"token comment\"># GCD(GCD(multiples_of_M[0],multiples_of_M[1]), multiples_of_M[2])</span>\n    M <span class=\"token operator\">=</span> <span class=\"token builtin\">reduce</span><span class=\"token punctuation\">(</span>GCD<span class=\"token punctuation\">,</span> multiples_of_M<span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">return</span> M\n\n<span class=\"token keyword\">def</span> <span class=\"token function\">test_unknown_modulus</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    M <span class=\"token operator\">=</span> solve_unknown_modulus<span class=\"token punctuation\">(</span>prime_candidates<span class=\"token punctuation\">)</span>\n    M <span class=\"token operator\">=</span> solve_unknown_modulus<span class=\"token punctuation\">(</span>prime_candidates<span class=\"token punctuation\">)</span>\n    A <span class=\"token operator\">=</span> solve_unknown_multiplier<span class=\"token punctuation\">(</span>prime_candidates<span class=\"token punctuation\">,</span> M<span class=\"token punctuation\">)</span>\n    B <span class=\"token operator\">=</span> solve_unknown_increment<span class=\"token punctuation\">(</span>prime_candidates<span class=\"token punctuation\">,</span> A<span class=\"token punctuation\">,</span> M<span class=\"token punctuation\">)</span>\n\n    <span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span>M<span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span>A<span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span>B<span class=\"token punctuation\">)</span>\n\ntest_unknown_modulus<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span></code></pre></div>\n<p>Now I just need to determine e to generate the private key for flag decryption.</p>\n<p>For e, since the RSA public key provided was 2048-bit RSA size, I guessed 65537.</p>\n<p>Using the information determined so far, I created the following script and was able to decrypt the flag.</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token keyword\">import</span> struct\n<span class=\"token keyword\">from</span> Crypto<span class=\"token punctuation\">.</span>PublicKey <span class=\"token keyword\">import</span> RSA\n<span class=\"token keyword\">from</span> Crypto<span class=\"token punctuation\">.</span>Util<span class=\"token punctuation\">.</span>number <span class=\"token keyword\">import</span> long_to_bytes<span class=\"token punctuation\">,</span> bytes_to_long<span class=\"token punctuation\">,</span> isPrime\n\n<span class=\"token keyword\">class</span> <span class=\"token class-name\">LCG</span><span class=\"token punctuation\">:</span>\n    lcg_m <span class=\"token operator\">=</span> <span class=\"token operator\">-</span><span class=\"token number\">6569199283741144524805092313800498379912765081239722709390321881123001934591054674566684669798886054155292305172680411106681470919005032801138448184653164447435662736622686458913807769346396147888409387744295360132038094168945987371927904880766531430748616858146076625544135687000281908879673294160897281532</span>\n    lcg_c <span class=\"token operator\">=</span> <span class=\"token number\">3910539794193409979886870049869456815685040868312878537393070815966881265118275755165613835833103526090552456472867019296386475520134783987251699999776365</span>\n    lcg_n <span class=\"token operator\">=</span> <span class=\"token number\">8311271273016946265169120092240227882013893131681882078655426814178920681968884651437107918874328518499850252591810409558783335118823692585959490215446923</span>\n\n    <span class=\"token keyword\">def</span> <span class=\"token function\">__init__</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">,</span> lcg_s<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n        self<span class=\"token punctuation\">.</span>state <span class=\"token operator\">=</span> lcg_s\n\n    <span class=\"token keyword\">def</span> <span class=\"token function\">next</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n        self<span class=\"token punctuation\">.</span>state <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">.</span>state <span class=\"token operator\">*</span> self<span class=\"token punctuation\">.</span>lcg_m <span class=\"token operator\">+</span> self<span class=\"token punctuation\">.</span>lcg_c<span class=\"token punctuation\">)</span> <span class=\"token operator\">%</span> self<span class=\"token punctuation\">.</span>lcg_n\n        <span class=\"token keyword\">return</span> self<span class=\"token punctuation\">.</span>state\n\n\n<span class=\"token keyword\">if</span> __name__ <span class=\"token operator\">==</span> <span class=\"token string\">'__main__'</span><span class=\"token punctuation\">:</span>\n\n    it <span class=\"token operator\">=</span> <span class=\"token number\">8</span>\n    bits <span class=\"token operator\">=</span> <span class=\"token number\">512</span>\n\n    <span class=\"token comment\"># Find prime value of specified bits a specified amount of times</span>\n    seed <span class=\"token operator\">=</span> <span class=\"token number\">211286818345627549183608678726370412218029639873054513839005340650674982169404937862395980568550063504804783328450267566224937880641772833325018028629959635</span>\n    lcg <span class=\"token operator\">=</span> LCG<span class=\"token punctuation\">(</span>seed<span class=\"token punctuation\">)</span>\n    primes_arr <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span>\n    items <span class=\"token operator\">=</span> <span class=\"token number\">0</span>\n    primes_n <span class=\"token operator\">=</span> <span class=\"token number\">1</span>\n    <span class=\"token keyword\">while</span> <span class=\"token boolean\">True</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>it<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n            <span class=\"token keyword\">while</span> <span class=\"token boolean\">True</span><span class=\"token punctuation\">:</span>\n                prime_candidate <span class=\"token operator\">=</span> lcg<span class=\"token punctuation\">.</span><span class=\"token builtin\">next</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n\n                <span class=\"token keyword\">if</span> <span class=\"token keyword\">not</span> isPrime<span class=\"token punctuation\">(</span>prime_candidate<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n                    <span class=\"token keyword\">continue</span>\n                <span class=\"token keyword\">elif</span> prime_candidate<span class=\"token punctuation\">.</span>bit_length<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">!=</span> bits<span class=\"token punctuation\">:</span>\n                    <span class=\"token keyword\">continue</span>\n                <span class=\"token keyword\">else</span><span class=\"token punctuation\">:</span>\n                    primes_n <span class=\"token operator\">*=</span> prime_candidate\n                    primes_arr<span class=\"token punctuation\">.</span>append<span class=\"token punctuation\">(</span>prime_candidate<span class=\"token punctuation\">)</span>\n                    <span class=\"token keyword\">break</span>\n        \n        <span class=\"token comment\"># Check bit length</span>\n        <span class=\"token keyword\">if</span> primes_n<span class=\"token punctuation\">.</span>bit_length<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">></span> <span class=\"token number\">4096</span><span class=\"token punctuation\">:</span>\n            <span class=\"token comment\"># print(\"bit length\", primes_n.bit_length())</span>\n            primes_arr<span class=\"token punctuation\">.</span>clear<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n            primes_n <span class=\"token operator\">=</span> <span class=\"token number\">1</span>\n            <span class=\"token keyword\">continue</span>\n        <span class=\"token keyword\">else</span><span class=\"token punctuation\">:</span>\n            <span class=\"token keyword\">break</span>\n    \n    <span class=\"token comment\"># print(primes_arr)</span>\n    <span class=\"token comment\"># print(len(primes_arr))</span>\n\n    <span class=\"token comment\"># Create public key 'n'</span>\n    n <span class=\"token operator\">=</span> <span class=\"token number\">1</span>\n    <span class=\"token keyword\">for</span> j <span class=\"token keyword\">in</span> primes_arr<span class=\"token punctuation\">:</span>\n        n <span class=\"token operator\">*=</span> j\n    <span class=\"token comment\"># Calculate totient 'Phi(n)'</span>\n    phi <span class=\"token operator\">=</span> <span class=\"token number\">1</span>\n    <span class=\"token keyword\">for</span> k <span class=\"token keyword\">in</span> primes_arr<span class=\"token punctuation\">:</span>\n        phi <span class=\"token operator\">*=</span> <span class=\"token punctuation\">(</span>k <span class=\"token operator\">-</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span>\n\n    <span class=\"token comment\"># print(\"[+] n: \", n)</span>\n    <span class=\"token comment\"># print(\"[+] size: \", n.bit_length(), \"bits\")</span>\n    <span class=\"token comment\"># print(\"[+] phi: \", phi)</span>\n\n    rsa <span class=\"token operator\">=</span> RSA<span class=\"token punctuation\">.</span>construct<span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span>n<span class=\"token punctuation\">,</span> <span class=\"token number\">65537</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n    key <span class=\"token operator\">=</span> rsa<span class=\"token punctuation\">.</span>exportKey<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>\n    <span class=\"token comment\"># print(key)</span>\n\n    d <span class=\"token operator\">=</span> <span class=\"token builtin\">pow</span><span class=\"token punctuation\">(</span><span class=\"token number\">65537</span><span class=\"token punctuation\">,</span> <span class=\"token operator\">-</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span> phi<span class=\"token punctuation\">)</span>\n    <span class=\"token comment\"># print(\"[+] d: \", d)</span>\n\n    <span class=\"token keyword\">with</span> <span class=\"token builtin\">open</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"flag.txt\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"rb\"</span><span class=\"token punctuation\">)</span> <span class=\"token keyword\">as</span> f<span class=\"token punctuation\">:</span>\n        data <span class=\"token operator\">=</span> f<span class=\"token punctuation\">.</span>read<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n        c <span class=\"token operator\">=</span> <span class=\"token builtin\">int</span><span class=\"token punctuation\">.</span>from_bytes<span class=\"token punctuation\">(</span>data<span class=\"token punctuation\">,</span> <span class=\"token string\">\"little\"</span><span class=\"token punctuation\">)</span>\n        <span class=\"token comment\"># print(c)</span>\n\n    <span class=\"token comment\"># print(c)</span>\n    m <span class=\"token operator\">=</span> <span class=\"token builtin\">pow</span><span class=\"token punctuation\">(</span>c<span class=\"token punctuation\">,</span> d<span class=\"token punctuation\">,</span> n<span class=\"token punctuation\">)</span>\n    flag <span class=\"token operator\">=</span> long_to_bytes<span class=\"token punctuation\">(</span>m<span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span>flag<span class=\"token punctuation\">)</span>\n\n    <span class=\"token comment\"># enc_flag = b'L\\x13\\x17\\xea\\x9e\\x10\\x13hy\\x90kK\\xdb? \\xd5z7\\t\\xeb\\xf3n\\xf1\\xd0\\xc1\\xad\\x15\\xf8ZN\\x9c\\xd9\\xef\\xbcz\\xcc\\xed\\xd9:p\\xf0\\x1e\\x97%T\\xdb\\xb0\\'I\\x17\\x83mLi6\\x1b\\xd8 \\x93%\\xe9\\xcd\\x0f*\\x9e\\x1fJ\\xb3\\xb4\\xeahnT\\x92\\xea&lt;&lt;\\x159\\xba\\xb9vo\\xf3\\x9b\\x8b\\xf3\\xe93?p\\xad`\\xd6\\xa6T\\x85m\\x06\\xd6\\xb1\\xd1\\x8djQ\\xe4\\xf3Z\\xf5\\x10\\xd7)G\\x91\\x13\\x1c\\xc6O\\x0b8;\\xed\\x89\\'\\xf42\\x92\\x03\\xa4\\x80)y\\x10\\xdc\\x0b;\\x03\\xf6\\xff\\x06C~;\\xde\\xf4\\xf9\\xd0\\xd1\\xcc\\xfd\\x10\\x95\\x9a\\xa9\\\\\\x91X{\\xb6M\\xe1d\\xf4\\xf57\\xbd\\x8a,\\x07K\\xd7B\\x1c\\xe5\\xd1p=5\\x01\\x08\\xb3\\xafA\\x00\\xad\\x90I\\x1b\\tdt\\x9c\\x08\\xf2\\xd2n\\xd8%\\x1e\\xa4H\\xb7G\\xb5\\xc1\\tG$h\\xa2\\xe7z\\xcf\\xf9\\xba\\x17}\\'&amp;\\x05\\x1ecF\\xc0\\x86\\xc7\\xd9\\xd1\\r2!\\xe1\\xa1Z\\xabp\\xfe\\x14C\\xd0.+T\\x87\\x9dP\\x17\\xfc\\xb6\\x94\\x98\\x90q\\xe3P\\x1fPn\\x07\\xf1+;\\xcc\\xd3/\\x0f\\xde\\x0eZL\\xa7\\xd5\\xce\\x1dF\\x9c#\\xdea\\xcc,\\xbe\\xc0O\\xb06\\xbdi \\xf9w\\xa1\\xac\\x97\\xfd\\x93\\x91c\\xf5\\xee\\xd2U\\xe32\\xd7\\xe8\\xed\\x90\\xa4.Q\\xca\\xdc\\x8btF&lt;\\xbb\\xfe?\\xdf\\xf4\\xfd\\xde\\xee^\\xf3G\\x8a\\xb8&lt;\\xa0\\x04U\\xfb1>a:\\xaf\\xfb+\\xf3\\x10\\x15\\x9d\\x04Md\\x9c^\\xda\\xd3A\\x14\\x9eV\\x05\\xfd\\xdcC\\xa1\\xf8\\xb4\\xf8\\\\\\xb9\\x89Bb?\\x13\\xf1s3\\x98i\\xb4e\\x15\\xa6@\\xab\\xbbR\\x80\\x1e\\xd9\\xb4\\xd8U\\xd6qC\\xff\\xff\\xa7bFN\\t\\x0f\\xa7|\\xa1\\x80r\\xb6\\xa5\\xa8!\\xbc\\xe1\\x08\\xc2t\\xe0\\xa1\\xc2\"4%v\\x91\\xeeKg\\x98E\\x0e\\xa4z\\xb5\\x01o\\x9d\\tS\\x92\\xf3\\x1d\\x1e\\xa3\\xe7\\xce\\xb99s`\\x9ao\"\\xe2Z\\xddg\\x902\\x12\\x15\\xd6N&lt;\\xebH2;\\x93\\x81`\\xa39\\x07\\xc6\\xc0%Wc\\xf6\\x82\\x819\\xe0\\x99=\\xc5\\x9a\\x95\\x9bR\\xf4>|@\\xe6)\\xf1L\\x17\\n\\n\\xa4\\xac#d\\xd9\\x13\\'\\x16\\xf9v\\x02'</span>\n    <span class=\"token comment\"># print(len(enc_flag))</span>\n    \n\n    <span class=\"token comment\"># text = b\"myflag\"</span>\n    <span class=\"token comment\"># enc_flag = bytes_to_long(text)</span>\n    <span class=\"token comment\"># _enc = pow(enc_flag, 65537, n)</span>\n    <span class=\"token comment\"># with open (\"myflag.txt\", \"wb\") as flag_file:</span>\n    <span class=\"token comment\">#     flag_file.write(_enc.to_bytes(n.bit_length(), \"little\"))</span>\n    <span class=\"token comment\"># with open(\"myflag.txt\", \"rb\") as f:</span>\n    <span class=\"token comment\">#     data = f.read()</span>\n    <span class=\"token comment\">#     number = int.from_bytes(data, \"little\")</span>\n    <span class=\"token comment\">#     print(number)</span>\n\n    <span class=\"token comment\"># m = pow(number, d, n)</span>\n    <span class=\"token comment\"># flag = long_to_bytes(m)</span>\n    <span class=\"token comment\"># print(flag)</span></code></pre></div>\n<h2 id=\"papapapamisc\" style=\"position:relative;\"><a href=\"#papapapamisc\" aria-label=\"papapapamisc 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>PAPAPAPA(Misc)</h2>\n<blockquote>\n<p>Is this image really just white?</p>\n</blockquote>\n<p>A completely white JPEG like the one below is provided as the challenge binary.</p>\n<p>Apparently a flag is hidden somewhere in this image.</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 512px; \"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/bd916fa3665f374c62c8132a43a38fe8/36dd4/white.jpg\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n    <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 100%; position: relative; bottom: 0; left: 0; background-image: url('data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAUABQDASIAAhEBAxEB/8QAFQABAQAAAAAAAAAAAAAAAAAAAAb/xAAUAQEAAAAAAAAAAAAAAAAAAAAA/9oADAMBAAIQAxAAAAGgAAAB/8QAFBABAAAAAAAAAAAAAAAAAAAAMP/aAAgBAQABBQIf/8QAFBEBAAAAAAAAAAAAAAAAAAAAIP/aAAgBAwEBPwEf/8QAFBEBAAAAAAAAAAAAAAAAAAAAIP/aAAgBAgEBPwEf/8QAFBABAAAAAAAAAAAAAAAAAAAAMP/aAAgBAQAGPwIf/8QAFBABAAAAAAAAAAAAAAAAAAAAMP/aAAgBAQABPyEf/9oADAMBAAIAAwAAABAAAAD/xAAUEQEAAAAAAAAAAAAAAAAAAAAg/9oACAEDAQE/EB//xAAUEQEAAAAAAAAAAAAAAAAAAAAg/9oACAECAQE/EB//xAAUEAEAAAAAAAAAAAAAAAAAAAAw/9oACAEBAAE/EB//2Q=='); background-size: cover; display: block;\"\n  ></span>\n  <picture>\n          <source\n              srcset=\"/static/bd916fa3665f374c62c8132a43a38fe8/8ac56/white.webp 240w,\n/static/bd916fa3665f374c62c8132a43a38fe8/d3be9/white.webp 480w,\n/static/bd916fa3665f374c62c8132a43a38fe8/bd5dd/white.webp 512w\"\n              sizes=\"(max-width: 512px) 100vw, 512px\"\n              type=\"image/webp\"\n            />\n          <source\n            srcset=\"/static/bd916fa3665f374c62c8132a43a38fe8/09b79/white.jpg 240w,\n/static/bd916fa3665f374c62c8132a43a38fe8/7cc5e/white.jpg 480w,\n/static/bd916fa3665f374c62c8132a43a38fe8/36dd4/white.jpg 512w\"\n            sizes=\"(max-width: 512px) 100vw, 512px\"\n            type=\"image/jpeg\"\n          />\n          <img\n            class=\"gatsby-resp-image-image\"\n            src=\"/static/bd916fa3665f374c62c8132a43a38fe8/36dd4/white.jpg\"\n            alt=\"white\"\n            title=\"white\"\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 expected, analyzing with common tools does not yield the flag.</p>\n<p>Scanning the bytecode also revealed nothing suspicious.</p>\n<p>Since images like this often use LSB steganography, I extracted RGB values for all pixels with the following script, but no pixels other than <code class=\"language-text\">#FFFFFF</code> were found.</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\n<span class=\"token keyword\">def</span> <span class=\"token function\">get_pixel_rgb</span><span class=\"token punctuation\">(</span>image_path<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    img <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    pixels <span class=\"token operator\">=</span> img<span class=\"token punctuation\">.</span>load<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n    width<span class=\"token punctuation\">,</span> height <span class=\"token operator\">=</span> img<span class=\"token punctuation\">.</span>size\n\n    rgb_values <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span>\n    <span class=\"token keyword\">for</span> y <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> x <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            r<span class=\"token punctuation\">,</span> g<span class=\"token punctuation\">,</span> b <span class=\"token operator\">=</span> pixels<span class=\"token punctuation\">[</span>x<span class=\"token punctuation\">,</span> y<span class=\"token punctuation\">]</span>\n            rgb_values<span class=\"token punctuation\">.</span>append<span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span>r<span class=\"token punctuation\">,</span> g<span class=\"token punctuation\">,</span> b<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n\n    <span class=\"token keyword\">return</span> rgb_values\n\nimage_path <span class=\"token operator\">=</span> <span class=\"token string\">\"white.jpg\"</span>\nrgb_values <span class=\"token operator\">=</span> get_pixel_rgb<span class=\"token punctuation\">(</span>image_path<span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">for</span> rgb <span class=\"token keyword\">in</span> rgb_values<span class=\"token punctuation\">:</span>\n    <span class=\"token keyword\">for</span> px <span class=\"token keyword\">in</span> rgb<span class=\"token punctuation\">:</span>\n        <span class=\"token keyword\">if</span> px <span class=\"token operator\">!=</span> <span class=\"token number\">255</span><span class=\"token punctuation\">:</span>\n            <span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span>rgb<span class=\"token punctuation\">)</span></code></pre></div>\n<p>I was a bit stuck here, but trying ImageMagick revealed that despite the image size being 512×512, the sampling-factor was 3x1,3x1,3x1.</p>\n<p>It appears this image uses chroma subsampling.</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\">./magick identify -verbose white.jpg\n<span class=\"token operator\">></span>\njpeg:colorspace: <span class=\"token number\">2</span>\njpeg:sampling-factor: 3x1,3x1,3x1</code></pre></div>\n<p>JPEG is a compression format that divides an image into small square units and mathematically encodes the color and brightness of each square.</p>\n<p>These squares are defined as 8×8 pixels, meaning JPEG dimensions should always be multiples of 8.</p>\n<p>JPEG may use a technique called chroma subsampling to reduce image resolution and file size.</p>\n<p>Chroma subsampling exploits the fact that human vision is more sensitive to luminance than color.</p>\n<p>Specifically, by intentionally reducing color information relative to luminance information, images can be made smaller (lower resolution) while maintaining their visual appearance (image quality).</p>\n<p>Chroma subsampling is typically at a 2×2 ratio, but this image was set to 3×1.</p>\n<p>When JPEG uses chroma subsampling, the block size becomes the basic 8×8 multiplied by the maximum sampling factor among the image components.</p>\n<p>So in this case, the block size is 24×8.</p>\n<p>Reference: <a href=\"https://simple.wikipedia.org/wiki/JPEG\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">JPEG - Simple English Wikipedia, the free encyclopedia</a></p>\n<p>Reference: <a href=\"https://en.wikipedia.org/wiki/Chroma_subsampling\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Chroma subsampling - Wikipedia</a></p>\n<p>Reference: <a href=\"https://hp.vector.co.jp/authors/VA032610/JPEGFormat/AboutImage.htm\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Structure of Image Data</a></p>\n<p>Reference: <a href=\"http://users.wfu.edu/matthews/misc/jpg_vs_gif/JpgCompTest/JpgChromaSub.html\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Chroma subsampling in JPG compression</a></p>\n<p>Reference: <a href=\"https://blog.awm.jp/2016/02/06/ycbcr/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">About JPEG’s YCbCr - awm-Tech</a></p>\n<p>Here I notice that the width of the 512×512 challenge image is not a multiple of 24.</p>\n<p>When a chroma-subsampled image’s dimensions are not multiples of the block size, the overflow is treated as padding, and the image size recorded in the SOF segment (which stores the JPEG file type and key parameters) is forced to subtract the padding.</p>\n<p>This causes the padding area to disappear from the displayed image.</p>\n<p>Incidentally, images hidden in the padding area cannot be recovered simply by enlarging the image in a standard image viewer.</p>\n<p>In such cases, we directly overwrite the byte sequence specifying the JPEG image size within the SOF segment.</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\">modify_sof0_segment</span><span class=\"token punctuation\">(</span>jpeg_path<span class=\"token punctuation\">,</span> new_width<span class=\"token punctuation\">,</span> new_height<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    <span class=\"token keyword\">with</span> <span class=\"token builtin\">open</span><span class=\"token punctuation\">(</span>jpeg_path<span class=\"token punctuation\">,</span> <span class=\"token string\">\"rb\"</span><span class=\"token punctuation\">)</span> <span class=\"token keyword\">as</span> <span class=\"token builtin\">file</span><span class=\"token punctuation\">:</span>\n        jpeg_data <span class=\"token operator\">=</span> <span class=\"token builtin\">bytearray</span><span class=\"token punctuation\">(</span><span class=\"token builtin\">file</span><span class=\"token punctuation\">.</span>read<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n\n    <span class=\"token comment\"># Search for SOF0 segment position</span>\n    sof0_marker <span class=\"token operator\">=</span> <span class=\"token string\">b'\\xff\\xc0'</span>\n    sof0_start <span class=\"token operator\">=</span> jpeg_data<span class=\"token punctuation\">.</span>find<span class=\"token punctuation\">(</span>sof0_marker<span class=\"token punctuation\">)</span>\n\n    <span class=\"token comment\"># Find and display SOF0 segment parameter positions</span>\n    parameter_start <span class=\"token operator\">=</span> sof0_start <span class=\"token operator\">+</span> <span class=\"token number\">5</span>\n    <span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Original SOF0 width : {}\"</span><span class=\"token punctuation\">.</span><span class=\"token builtin\">format</span><span class=\"token punctuation\">(</span><span class=\"token builtin\">int</span><span class=\"token punctuation\">.</span>from_bytes<span class=\"token punctuation\">(</span>jpeg_data<span class=\"token punctuation\">[</span>parameter_start<span class=\"token punctuation\">:</span>parameter_start <span class=\"token operator\">+</span> <span class=\"token number\">2</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span><span class=\"token string\">\"big\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Original SOF0 height : {}\"</span><span class=\"token punctuation\">.</span><span class=\"token builtin\">format</span><span class=\"token punctuation\">(</span><span class=\"token builtin\">int</span><span class=\"token punctuation\">.</span>from_bytes<span class=\"token punctuation\">(</span>jpeg_data<span class=\"token punctuation\">[</span>parameter_start <span class=\"token operator\">+</span> <span class=\"token number\">2</span><span class=\"token punctuation\">:</span>parameter_start <span class=\"token operator\">+</span> <span class=\"token number\">4</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span><span class=\"token string\">\"big\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n\n    <span class=\"token comment\"># Convert new width and height to bytes</span>\n    new_width_bytes <span class=\"token operator\">=</span> new_width<span class=\"token punctuation\">.</span>to_bytes<span class=\"token punctuation\">(</span><span class=\"token number\">2</span><span class=\"token punctuation\">,</span> byteorder<span class=\"token operator\">=</span><span class=\"token string\">'big'</span><span class=\"token punctuation\">)</span>\n    new_height_bytes <span class=\"token operator\">=</span> new_height<span class=\"token punctuation\">.</span>to_bytes<span class=\"token punctuation\">(</span><span class=\"token number\">2</span><span class=\"token punctuation\">,</span> byteorder<span class=\"token operator\">=</span><span class=\"token string\">'big'</span><span class=\"token punctuation\">)</span>\n\n    <span class=\"token comment\"># Replace width and height</span>\n    jpeg_data<span class=\"token punctuation\">[</span>parameter_start<span class=\"token punctuation\">:</span>parameter_start <span class=\"token operator\">+</span> <span class=\"token number\">2</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> new_width_bytes\n    jpeg_data<span class=\"token punctuation\">[</span>parameter_start <span class=\"token operator\">+</span> <span class=\"token number\">2</span><span class=\"token punctuation\">:</span>parameter_start <span class=\"token operator\">+</span> <span class=\"token number\">4</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> new_height_bytes\n\n    <span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"New SOF0 width : {}\"</span><span class=\"token punctuation\">.</span><span class=\"token builtin\">format</span><span class=\"token punctuation\">(</span><span class=\"token builtin\">int</span><span class=\"token punctuation\">.</span>from_bytes<span class=\"token punctuation\">(</span>jpeg_data<span class=\"token punctuation\">[</span>parameter_start<span class=\"token punctuation\">:</span>parameter_start <span class=\"token operator\">+</span> <span class=\"token number\">2</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span><span class=\"token string\">\"big\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"New SOF0 height : {}\"</span><span class=\"token punctuation\">.</span><span class=\"token builtin\">format</span><span class=\"token punctuation\">(</span><span class=\"token builtin\">int</span><span class=\"token punctuation\">.</span>from_bytes<span class=\"token punctuation\">(</span>jpeg_data<span class=\"token punctuation\">[</span>parameter_start <span class=\"token operator\">+</span> <span class=\"token number\">2</span><span class=\"token punctuation\">:</span>parameter_start <span class=\"token operator\">+</span> <span class=\"token number\">4</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span><span class=\"token string\">\"big\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n\n    <span class=\"token comment\"># Save the modified JPEG file</span>\n    modified_jpeg_path <span class=\"token operator\">=</span> <span class=\"token string\">\"modified.jpg\"</span>\n    <span class=\"token keyword\">with</span> <span class=\"token builtin\">open</span><span class=\"token punctuation\">(</span>modified_jpeg_path<span class=\"token punctuation\">,</span> <span class=\"token string\">\"wb\"</span><span class=\"token punctuation\">)</span> <span class=\"token keyword\">as</span> <span class=\"token builtin\">file</span><span class=\"token punctuation\">:</span>\n        <span class=\"token builtin\">file</span><span class=\"token punctuation\">.</span>write<span class=\"token punctuation\">(</span>jpeg_data<span class=\"token punctuation\">)</span>\n        <span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"==> Saved new JPEG\"</span><span class=\"token punctuation\">)</span>\n\n<span class=\"token comment\"># Example usage</span>\njpeg_path <span class=\"token operator\">=</span> <span class=\"token string\">\"white.jpg\"</span>\nnew_width <span class=\"token operator\">=</span> <span class=\"token number\">512</span>\nnew_height <span class=\"token operator\">=</span> <span class=\"token number\">528</span>\nmodify_sof0_segment<span class=\"token punctuation\">(</span>jpeg_path<span class=\"token punctuation\">,</span> new_width<span class=\"token punctuation\">,</span> new_height<span class=\"token punctuation\">)</span></code></pre></div>\n<p>Ultimately, creating the solver above and changing the image width to 528 allowed me to retrieve the flag hidden in the padding area.</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/ad01222a13fe7057ae521222e2f8264e/4b2cc/image-20230627213617828.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: 96.66666666666666%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAATCAYAAACQjC21AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAW0lEQVQ4y+WSuw3AMAhEvf9EuLAxNR3z8IlkKRPkCqRQXfV0PN2oj5eZFRE3q2oNBNDdb2ZmDPBtuPfGAtdaWCD85R86FBEscM6JBZ5zmjvsP+z+Domo+bDNrB6huNuSKiWqKgAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n  ></span>\n  <picture>\n          <source\n              srcset=\"/static/ad01222a13fe7057ae521222e2f8264e/8ac56/image-20230627213617828.webp 240w,\n/static/ad01222a13fe7057ae521222e2f8264e/d3be9/image-20230627213617828.webp 480w,\n/static/ad01222a13fe7057ae521222e2f8264e/e46b2/image-20230627213617828.webp 960w,\n/static/ad01222a13fe7057ae521222e2f8264e/d5002/image-20230627213617828.webp 1013w\"\n              sizes=\"(max-width: 960px) 100vw, 960px\"\n              type=\"image/webp\"\n            />\n          <source\n            srcset=\"/static/ad01222a13fe7057ae521222e2f8264e/8ff5a/image-20230627213617828.png 240w,\n/static/ad01222a13fe7057ae521222e2f8264e/e85cb/image-20230627213617828.png 480w,\n/static/ad01222a13fe7057ae521222e2f8264e/d9199/image-20230627213617828.png 960w,\n/static/ad01222a13fe7057ae521222e2f8264e/4b2cc/image-20230627213617828.png 1013w\"\n            sizes=\"(max-width: 960px) 100vw, 960px\"\n            type=\"image/png\"\n          />\n          <img\n            class=\"gatsby-resp-image-image\"\n            src=\"/static/ad01222a13fe7057ae521222e2f8264e/d9199/image-20230627213617828.png\"\n            alt=\"image-20230627213617828\"\n            title=\"image-20230627213617828\"\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=\"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 great opportunity to feel a sense of growth.</p>\n<p>However, the top ranks are still far off, so I’ll keep training.</p>\n<p>Since Google CTF’s official writeups are thorough and helpful, I’ll challenge the unsolved problems again.</p>\n<p>Reference: <a href=\"https://github.com/google/google-ctf/tree/master\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">google/google-ctf: Google CTF</a></p>","fields":{"slug":"/ctf-googlectf-en","tagSlugs":["/tag/ctf-en/","/tag/rev-en/","/tag/forensic-en/","/tag/crypto-en/","/tag/english/"]},"frontmatter":{"date":"2023-06-27","description":"Writeup for Google CTF 2023.","tags":["CTF (en)","Rev (en)","Forensic (en)","Crypto (en)","English"],"title":"Google CTF 2023 Writeup","socialImage":{"publicURL":"/static/c7b638e2d319149851871f13c096b89f/ctf-googlectf.png"}}}},"pageContext":{"slug":"/ctf-googlectf-en"}},"staticQueryHashes":["251939775","401334301","825871152"]}