<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Tils on Qtnes</title><link>http://qtnes.com/til/</link><description>Recent content in Tils on Qtnes</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Wed, 22 Apr 2026 00:00:00 +0000</lastBuildDate><atom:link href="http://qtnes.com/til/index.xml" rel="self" type="application/rss+xml"/><item><title>KUSER_SHARED_DATA quick notes</title><link>http://qtnes.com/til/kuser-shared-data/</link><pubDate>Wed, 22 Apr 2026 00:00:00 +0000</pubDate><guid>http://qtnes.com/til/kuser-shared-data/</guid><description>&lt;p&gt;Today I learned about KUSER_SHARED_DATA: a kernel-populated shared page that user mode can read directly.&lt;/p&gt;
&lt;h2 id="user-mode-address"&gt;User-mode address&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;User mode reads it at fixed address &lt;code&gt;0x7FFE0000&lt;/code&gt; (same on x86 and x64).&lt;/li&gt;
&lt;li&gt;It is mapped read-only in user mode.&lt;/li&gt;
&lt;li&gt;Kernel has a different fixed mapping, but from user-mode reversing, &lt;code&gt;0x7FFE0000&lt;/code&gt; is the important one.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="what-is-stored-there-high-value-fields"&gt;What is stored there (high value fields)&lt;/h2&gt;
&lt;p&gt;This structure contains fast-access global OS data, historically heavy on time-related values:&lt;/p&gt;</description></item><item><title>Stripped Go binaries still leak function names via pclntab</title><link>http://qtnes.com/til/go-pclntab/</link><pubDate>Fri, 20 Feb 2026 00:00:00 +0000</pubDate><guid>http://qtnes.com/til/go-pclntab/</guid><description>&lt;p&gt;Even with &lt;code&gt;-ldflags=&amp;quot;-s -w&amp;quot;&lt;/code&gt;, Go binaries retain the &lt;code&gt;pclntab&lt;/code&gt; section which maps PC values to function names. Tools like &lt;a href="https://github.com/mandiant/GoReSym"&gt;GoReSym&lt;/a&gt; or IDA&amp;rsquo;s Go helper scripts can recover the full symbol table. &amp;ldquo;Stripped&amp;rdquo; means less than you think in Go.&lt;/p&gt;</description></item><item><title>UPX magic bytes can be swapped to block automated unpacking</title><link>http://qtnes.com/til/upx-magic-bytes/</link><pubDate>Fri, 06 Feb 2026 00:00:00 +0000</pubDate><guid>http://qtnes.com/til/upx-magic-bytes/</guid><description>&lt;p&gt;Standard UPX uses the magic bytes &lt;code&gt;UPX!&lt;/code&gt; (0x55505821). Swapping them to anything else (e.g. &lt;code&gt;TRTW&lt;/code&gt; / 0x54525457) causes &lt;code&gt;upx -d&lt;/code&gt; to throw &lt;code&gt;NotPackedException&lt;/code&gt; while the binary still unpacks and runs fine at runtime. Four bytes of friction against automated tools.&lt;/p&gt;</description></item></channel></rss>