howtoheap入門:西湖論劍Storm_noteの解説

how2heapはshellphishチームによって作成されたヒープ利用のチュートリアルであり、さまざまなヒープ攻撃技術を紹介しています。この記事では、このチュートリアルを通じて学習します。環境設定については、「pwn環境の最適化」をご覧ください。

1. 問題情報

問題リンク
root@ubuntu:/work/how2heap/storm_note# chmod +x Storm_note
root@ubuntu:/work/how2heap/storm_note# gdb ./Storm_note
GNU gdb (Ubuntu 7.11.1-0ubuntu1~16.5) 7.11.1
...
(gdb) r
Starting program: /work/how2heap/storm_note/Storm_note 
================
== Storm Note ==
== 1. alloc   ==
== 2. edit    ==
== 3. delete  ==
== 4. exit    ==
================
Choice: 

2. プログラム分析

2.1 init_proc関数

プロセスの初期化が行われ、`mallopt(1, 0)`によりfastbinが無効化されます。その後、mmapを使用して0xABCD0000に読み書き可能なページが割り当てられ、その中にランダムな数値が書き込まれます。

2.2 alloc_note関数

グローバル変数noteを走査し、未使用の領域を見つけてヒープポインタを保存します。ヒープのサイズは最大0xFFFFFまで制限され、callocで確保されるため、ヒープの内容はゼロクリアされます。

2.3 edit_note関数

read後にv2に書き込んだバイト数が保存され、そのオフセット位置のバイトが0に設定されることでoff_by_null脆弱性が存在します。

2.4 delete_note関数

通常のfree操作を行い、ヒープポインタを0にリセットします。

2.5 backdoor関数

mmapされた領域の最初の48バイトと一致するデータを入力することで直接シェルを得られるバックドア機能があります。

3. 攻撃戦略

1. off_by_null脆弱性を利用してchunk overlappingを実現し、ヒープブロックを制御します。 2. unsortedbinにある制御可能なchunkをlargebinに移動させ、largebin attackをトリガーします。 3. largebinのbkおよびbk_nextsizeポインタを偽装し、mallocを通じて任意のアドレスに書き込むことが可能になります。 4. バックドアをトリガーします。

4. デバッグ過程

4.1 Chunk overlapping

add(0x20);  // 0
add(0x510); // 1
add(0x20);  // 2

add(0x20);  // 3
add(0x510); // 4
add(0x20);  // 5
add(0x20);  // 6
pause();

[DEBUG] 受信したデータ:

Done
================
== Storm Note ==
== 1. alloc   ==
== 2. edit    ==
== 3. delete  ==
== 4. exit    ==
================
Choice: 

タグ: how2heap pwn heap exploitation gdb CTF

9月9日 10:42 投稿