# malloc理解その1  ## SECCON 2019 Writeup part1 ### pwn * one 問題 https://bitbucket.org/ptr-yudai/writeups/src/master/2019/SECCON_CTF_2019_Quals/one/ * Writeup https://qiita.com/kusano_k/items/6ad4c50dbfffb96e0fca https://ptr-yudai.hatenablog.com/entry/2019/10/20/181718 このレベルだとWrite-upじゃなくて個人の感想では... 以下は僕が思ったこと  ## あまりに難しいヒープ いくつかの攻撃手法がある * fastbins unlink attack * t-cache poisoning * double free attack * Unsorted Bin Attack 覚えるべき用語もある * チャンク(chunk) * __free_hook * tcache | fastbin | smallbin | Unsorted bin ___ ## malloc()の使い方 まずはmalloc()を知ろう! https://bituse.info/c_func/50 **要点** * malloc()はメモリ確保ができる! * 使い終わったらfree()で解放する! ### 動かそう ``` c #include <stdio.h> #include <stdlib.h> int main(){ puts("\n[+] allocate p1, p2, p3"); char *p1 = malloc(0x80); char *p2 = malloc(0x90); char *p3 = malloc(0xa0); printf("p1 = %p\n", p1); printf("p2 = %p\n", p2); printf("p3 = %p\n", p3); puts("\n[+] free p2"); free(p2); puts("\n[+] 解放したp2と同じサイズをp4に割り当て"); char *p4 = malloc(0x90); printf("p4 = %p\n", p4); return 0; } ``` ↓ ``` vagrant@64:malloc$./malloc [+] allocate p1, p2, p3 p1 = 0x1ff7010 p2 = 0x1ff70a0 p3 = 0x1ff7140 [+] free p2 [+] 解放したp2と同じサイズをp4に割り当てる p4 = 0x1ff70a0 ``` malloc()した値をfree()して、もう一度同じサイズのメモリ確保を要求すると同じアドレスが返ってきますね! ___ ## malloc()とfree() malloc()のメモリ確保はプロセスのアドレス空間のうちヒープという領域を利用しています。 malloc()によって確保されたメモリはfree()により解放しますが、実際にはその時点でヒープ領域が減少する訳ではありません。 未使用となったchunkは未使用リストにリンクされ管理されます。**そして次に要求のあった時に必要に応じて再利用されます。** **要点** * ヒープはプロセスのアドレスの空き空間 * malloc()はchunkという単位でメモリを管理 * malloc()はヒープ領域を使う * メモリをすぐ使えるようにとりあえず持っておく! ___ 前項で確保したメモリプールとは別にプール全体を管理する管理部があります。これらメモリプールとメモリプール管理部をひとつのまとまりとした管理単位をmalloc()ではアリーナ(arena)と呼びます。 デフォルトで使用されるarenaの管理部は`main_arena`という変数名で静的に定義されています。プログラムが起動された時点ではarenaはこの一つが存在するだけです。通常はこの一つのarenaで十分です。 **要点** * malloc()が確保したメモリとそれの管理部をarenaという * デフォルトで使用されるarenaの管理部は`main_arena` ___ ## main_arena のアドレスのリーク `main_arena`は libc上に配置される構造体であるため、そのアドレスをリークすることで libc のアドレスのリークが可能になります。 また`main_arena`は unsoreted bin サイズの領域の解放のときに main_arena の構造体上の変数のアドレスが現れるなどします。 そのため、もし終端文字の埋め忘れなどがあれば再度同じ領域を確保するなどすることで main_arena のリークが出来ます。 **要点** * `main_arena`がプログラム実行時にlibcのアドレスリークに使える! * `main_arena`はリーク可能! ___ Chunkのソース  =>全てmalloc.cのソース内に記載があります。 https://code.woboq.org/userspace/glibc/malloc/malloc.c.html#unlink_chunk  ___ ## chunkの種類 ### fastbin chunkの格納される場所の一つ、0x80バイト以下のchunkをサイズ別にここに格納し、**単方向リストで管理する。** ### tcache chunkの格納される場所の一つ、0x410バイト以下のchunkをサイズ別にここに格納し、**単方向リストで管理する。** **libc2.26より導入された** ### Unsorted bin fastbinには入りきらないサイズのchunkをここに一時的に格納する。 **双方向リストを持つ** ### largebin / smallbin それぞれ細かな役割を持つが、fastbinに入りきらなかったchunkをUnsorted binが振り分ける先という認識でok どちらもtcacheよりは、格納できるサイズは小さい =>全てmalloc.cのソース内に記載があります。 https://code.woboq.org/userspace/glibc/malloc/malloc.c.html#unlink_chunk  tcacheは単方向リストなので次の要素のアドレスを持っています(*next) また、chunkは以下の様に構造を持ってもいます  ... https://furutsuki.hatenablog.com/entry/2019/02/26/112207
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up