<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>glibc heap exploitation — algoatson.github.io</title>
    <link>https://algoatson.github.io/series/glibc-heap-exploitation/</link>
    <atom:link href="https://algoatson.github.io/series/glibc-heap-exploitation/feed.xml" rel="self" type="application/rss+xml"/>
    <description>glibc 2.34 deleted __free_hook and __malloc_hook, and everyone&#x27;s muscle memory broke. The modern answer is to forge a FILE — but the vtable is validated now. House of Apple 2 slips past that check by abusing a legitimate vtable that dereferences a second, unchecked one.</description>
    <language>en</language>
    <lastBuildDate>Tue, 16 Jun 2026 02:47:52 +0000</lastBuildDate>
    <item>
      <title>the glibc heap, from the chunk up</title>
      <link>https://algoatson.github.io/p/glibc-heap-internals/</link>
      <guid isPermaLink="true">https://algoatson.github.io/p/glibc-heap-internals/</guid>
      <pubDate>Mon, 08 Jun 2026 00:00:00 +0000</pubDate>
      <category>heap</category><category>pwn</category><category>glibc</category>
      <description>Part 1 of the heap series — the only internals that matter for exploitation: chunk anatomy, the size field&#x27;s flag bits, and the six places a free chunk can live (tcache, fastbins, unsorted, small, large, top). Everything later is corrupting one of these on purpose.</description>
    </item>
    <item>
      <title>the House of Force</title>
      <link>https://algoatson.github.io/p/house-of-force/</link>
      <guid isPermaLink="true">https://algoatson.github.io/p/house-of-force/</guid>
      <pubDate>Tue, 09 Jun 2026 00:00:00 +0000</pubDate>
      <category>heap</category><category>pwn</category><category>glibc</category>
      <description>Part 2 — overwrite the top chunk&#x27;s size with -1 and malloc will hand you a chunk anywhere in the address space. The cleanest &quot;arbitrary allocation&quot; there ever was, and a clean look at why glibc 2.29 killed it.</description>
    </item>
    <item>
      <title>fastbin dup</title>
      <link>https://algoatson.github.io/p/fastbin-dup/</link>
      <guid isPermaLink="true">https://algoatson.github.io/p/fastbin-dup/</guid>
      <pubDate>Thu, 11 Jun 2026 00:00:00 +0000</pubDate>
      <category>heap</category><category>pwn</category><category>glibc</category>
      <description>Part 3 — free a fastchunk twice past glibc&#x27;s one-line double-free check, get the same chunk handed out twice, then poison its fd to allocate straight onto __malloc_hook. The classic that teaches &quot;allocate where you want&quot;.</description>
    </item>
    <item>
      <title>unsafe unlink (and the safe-unlink bypass)</title>
      <link>https://algoatson.github.io/p/unsafe-unlink/</link>
      <guid isPermaLink="true">https://algoatson.github.io/p/unsafe-unlink/</guid>
      <pubDate>Fri, 12 Jun 2026 00:00:00 +0000</pubDate>
      <category>heap</category><category>pwn</category><category>glibc</category>
      <description>Part 4 — when a free chunk is pulled out of a doubly-linked list, four pointer writes happen. Forge the pointers and one of them lands wherever you want. Then the modern twist: how to pass the &quot;corrupted double-linked list&quot; check that was supposed to kill this.</description>
    </item>
    <item>
      <title>the unsorted bin attack</title>
      <link>https://algoatson.github.io/p/the-unsorted-bin-attack/</link>
      <guid isPermaLink="true">https://algoatson.github.io/p/the-unsorted-bin-attack/</guid>
      <pubDate>Sat, 13 Jun 2026 00:00:00 +0000</pubDate>
      <category>heap</category><category>pwn</category><category>glibc</category>
      <description>Part 5 — corrupt one freed chunk&#x27;s bk and the next malloc writes a libc pointer to an address you choose. You control WHERE, not WHAT — which sounds useless until you aim it at global_max_fast and unlock the whole fastbin.</description>
    </item>
    <item>
      <title>tcache poisoning, explained like you&#x27;ll have to use it</title>
      <link>https://algoatson.github.io/p/tcache-poisoning-explained/</link>
      <guid isPermaLink="true">https://algoatson.github.io/p/tcache-poisoning-explained/</guid>
      <pubDate>Sun, 18 Jan 2026 00:00:00 +0000</pubDate>
      <category>heap</category><category>pwn</category><category>glibc</category>
      <description>a from-scratch walk through the most reliable beginner heap primitive — what the tcache is, why poisoning works, and how safe-linking changed the recipe. Educational target, not a real CVE.</description>
    </item>
    <item>
      <title>the House of Spirit</title>
      <link>https://algoatson.github.io/p/house-of-spirit/</link>
      <guid isPermaLink="true">https://algoatson.github.io/p/house-of-spirit/</guid>
      <pubDate>Sun, 14 Jun 2026 00:00:00 +0000</pubDate>
      <category>heap</category><category>pwn</category><category>glibc</category>
      <description>Part 7 — instead of corrupting a real chunk, you forge a fake one in memory you already control and trick free() into filing it away. The next malloc hands it right back, so you get malloc to return the stack.</description>
    </item>
    <item>
      <title>the poison null byte</title>
      <link>https://algoatson.github.io/p/poison-null-byte/</link>
      <guid isPermaLink="true">https://algoatson.github.io/p/poison-null-byte/</guid>
      <pubDate>Sun, 14 Jun 2026 00:00:00 +0000</pubDate>
      <category>heap</category><category>pwn</category><category>glibc</category>
      <description>Part 8 — the most innocent-looking heap bug there is: one null byte written one byte too far. It lands on a neighbouring chunk&#x27;s size field, desyncs the allocator&#x27;s bookkeeping, and ends with two chunks overlapping the same memory.</description>
    </item>
    <item>
      <title>the House of Orange</title>
      <link>https://algoatson.github.io/p/the-house-of-orange/</link>
      <guid isPermaLink="true">https://algoatson.github.io/p/the-house-of-orange/</guid>
      <pubDate>Sun, 14 Jun 2026 00:00:00 +0000</pubDate>
      <category>heap</category><category>pwn</category><category>glibc</category>
      <description>Part 9, the capstone — no free() in the binary at all. Force malloc to free the top chunk for you, leak libc from it, then turn the unsorted bin attack into a forged FILE struct whose vtable call drops a shell. Heap meets FSOP.</description>
    </item>
    <item>
      <title>tcache dup</title>
      <link>https://algoatson.github.io/p/tcache-dup/</link>
      <guid isPermaLink="true">https://algoatson.github.io/p/tcache-dup/</guid>
      <pubDate>Sun, 14 Jun 2026 00:00:00 +0000</pubDate>
      <category>heap</category><category>pwn</category><category>glibc</category>
      <description>Part 10 — the fastbin dup&#x27;s lazier cousin. The tcache had no double-free check at all for two glibc releases, and the one it finally got is a single field you can overwrite. Free a chunk twice, get it twice, poison.</description>
    </item>
    <item>
      <title>the House of Einherjar</title>
      <link>https://algoatson.github.io/p/the-house-of-einherjar/</link>
      <guid isPermaLink="true">https://algoatson.github.io/p/the-house-of-einherjar/</guid>
      <pubDate>Sun, 14 Jun 2026 00:00:00 +0000</pubDate>
      <category>heap</category><category>pwn</category><category>glibc</category>
      <description>Part 11 — one null byte clears a chunk&#x27;s PREV_INUSE, a forged prev_size says &quot;the previous chunk starts way over there&quot;, and free() consolidates backward into a fake chunk you placed anywhere. Arbitrary allocation from a single off-by-one.</description>
    </item>
    <item>
      <title>the House of Lore</title>
      <link>https://algoatson.github.io/p/the-house-of-lore/</link>
      <guid isPermaLink="true">https://algoatson.github.io/p/the-house-of-lore/</guid>
      <pubDate>Sun, 14 Jun 2026 00:00:00 +0000</pubDate>
      <category>heap</category><category>pwn</category><category>glibc</category>
      <description>Part 12 — the smallbins are doubly-linked and handed out from the tail. Overwrite a smallbin chunk&#x27;s bk to point at a fake chunk and malloc will walk right into it, returning a chunk on the stack. The unlink check just needs a back-pointer.</description>
    </item>
    <item>
      <title>the House of Rabbit</title>
      <link>https://algoatson.github.io/p/the-house-of-rabbit/</link>
      <guid isPermaLink="true">https://algoatson.github.io/p/the-house-of-rabbit/</guid>
      <pubDate>Sun, 14 Jun 2026 00:00:00 +0000</pubDate>
      <category>heap</category><category>pwn</category><category>glibc</category>
      <description>Part 13 — fastbins don&#x27;t consolidate… until malloc_consolidate sweeps them. Forge a fastbin chunk&#x27;s size to something enormous, trigger the sweep, and that little chunk becomes a giant free chunk overlapping everything after it. Overlap from almost no primitive.</description>
    </item>
    <item>
      <title>the House of Corrosion</title>
      <link>https://algoatson.github.io/p/the-house-of-corrosion/</link>
      <guid isPermaLink="true">https://algoatson.github.io/p/the-house-of-corrosion/</guid>
      <pubDate>Sun, 14 Jun 2026 00:00:00 +0000</pubDate>
      <category>heap</category><category>pwn</category><category>glibc</category>
      <description>Part 14, the finale — for the challenge that gives you no libc leak and barely any allocations. Blow open global_max_fast and the fastbin index arithmetic starts pointing into libc itself, turning &quot;free a chunk of size N&quot; into &quot;write a heap pointer to a libc address&quot;. Bootstrap a leak from nothing.</description>
    </item>
    <item>
      <title>the tcache stashing unlink attack</title>
      <link>https://algoatson.github.io/p/tcache-stashing-unlink/</link>
      <guid isPermaLink="true">https://algoatson.github.io/p/tcache-stashing-unlink/</guid>
      <pubDate>Thu, 04 Jun 2026 00:00:00 +0000</pubDate>
      <category>heap</category><category>pwn</category><category>glibc</category>
      <description>When a smallbin serves a request, glibc stashes the leftover chunks into the tcache — and that stashing does a doubly-linked-list unlink with a far weaker check than the real thing. Corrupt one bk pointer and you get a libc write and an allocation at an address you choose.</description>
    </item>
    <item>
      <title>House of Apple 2 — FSOP after the hooks died</title>
      <link>https://algoatson.github.io/p/house-of-apple-2/</link>
      <guid isPermaLink="true">https://algoatson.github.io/p/house-of-apple-2/</guid>
      <pubDate>Mon, 15 Jun 2026 00:00:00 +0000</pubDate>
      <category>heap</category><category>pwn</category><category>glibc</category><category>fsop</category>
      <description>glibc 2.34 deleted __free_hook and __malloc_hook, and everyone&#x27;s muscle memory broke. The modern answer is to forge a FILE — but the vtable is validated now. House of Apple 2 slips past that check by abusing a legitimate vtable that dereferences a second, unchecked one.</description>
    </item>
  </channel>
</rss>
