22

私はヒープオーバーフロー攻撃の基本を学ぼうとしてきました。私は主に、攻撃の基礎としてチャンクメタデータの破損または変更を使用することに関心がありますが、他の提案も受け入れています。私のエクスプロイトの目標は、printf()関数ポインターを関数ポインターのそれで上書きすることであるべきだと知っていますchallenge()が、その書き込みを実現する方法がわからないようです。悪用したい次のコードがあります。これはmallocfromを使用していglibc 2.11.2ます。

void challenge()
{
        puts("you win\n");
}

int main(int argc, char **argv)
{
        char *inputA, *inputB, *inputC;

        inputA = malloc(32);
        inputB = malloc(32);
        inputC = malloc(32);

        strcpy(inputA, argv[1]);
        strcpy(inputB, argv[2]);
        strcpy(inputC, argv[3]);

        free(inputC);
        free(inputB);
        free(inputA);

        printf("execute challenge to win\n");
}

明らかに、割り当てられたチャンクのメタデータの実際の上書きを実現することは簡単です。ただし、標準的な手法を使用してこのコードを悪用する方法を見つけることができませんでした。私は以下の手法を読み、実装しようとしました。

  • 論文:ヒープオーバーフローに関するw00w00
    • 論文は非常に明確ですが、このunlink手法はしばらくの間廃止されています。
  • Malloc Maleficarum.txt
    • このホワイトペーパーでは、w00w00の時代からのエクスプロイト手法を拡張し、新しいバージョンのglibcについて説明します。ただし、このペーパーで詳しく説明されている5つの手法を考えると、上記のコードがこれらの手法の前提条件のいずれにも一致することはわかりません。
  • ヒープを壊して理解する(pdf)
    • pdfは、ヒープがどのように機能するかについてかなり良いレビューを提供しますが、ダブルフリーテクニックに焦点を当てています。

私はもともと、inputCのチャンクのサイズ値を操作してこのコードを悪用しようとしたため、inputCチャンクの先頭を指すようになりました。それがうまくいかなかったとき、私はさらにinputBのチャンクを指してみました。そのとき、新しいglibcがサイズ値の健全性チェックを実行することに気付きました。

割り当てられたチャンクのメタデータを任意の値に編集し、GOTの値を上書きしたり、他の任意のアドレスに書き込んだりする機能があると仮定して、ユーザーはどのようにして無料を利用するエクスプロイトを作成できますか?

注:「任意のアドレス」を書き込む場合、メモリページは読み取り専用または保護されている可能性があることを理解しています。つまり、書き込み可能と見なすことができるアドレスを意味します。

4

3 に答える 3

11

注:これは純粋に学術的な回答であり、悪意のある目的で使用することを意図したものではないことをお答えします。私はOPが行っている演習を認識しており、それらはオープンソースであり、承認されていない状況でこれらの手法を使用するようにユーザーを促すことを意図したものではありません。

以下でテクニックの詳細を説明しますが、私の概要は短いものになるので、参考のためにVudo mallocトリック(上記のリンクの1つで参照されています)を見てみましょう:http ://www.phrack.com /issues.html?issue=57&id=8

これは、mallocがメモリのブロックの作成、リストからのメモリのプルなどをどのように処理するかを詳しく説明しています。特に、この攻撃ではリンク解除攻撃が重要です(注:この特定の理由により、glibcがサイズの健全性チェックを実行するようになったのは正しいですが、この演習では古いlibcを使用する必要があります...レガシーブロ)。

論文から、割り当てられたブロックと解放されたブロックは同じデータ構造を使用しますが、データは異なる方法で処理されます。ここを参照してください:

chunk -> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
         | prev_size: size of the previous chunk, in bytes (used   |
         | by dlmalloc only if this previous chunk is free)        |
         +---------------------------------------------------------+
         | size: size of the chunk (the number of bytes between    |
         | "chunk" and "nextchunk") and 2 bits status information  |
  mem -> +---------------------------------------------------------+
         | fd: not used by dlmalloc because "chunk" is allocated   |
         | (user data therefore starts here)                       |
         + - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
         | bk: not used by dlmalloc because "chunk" is allocated   |
         | (there may be user data here)                           |
         + - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
         |                                                         |
         |                                                         |
         | user data (may be 0 bytes long)                         |
         |                                                         |
         |                                                         |
 next -> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
         | prev_size: not used by dlmalloc because "chunk" is      |
         | allocated (may hold user data, to decrease wastage)     |
         +---------------------------------------------------------+

割り当てられたブロックはfdまたはbkポインターを使用しませんが、解放されたブロックは使用します。これは後で重要になります。Doug Leaのmallocの「ブロック」が二重にリンクされたリストに編成されていることを理解するには、十分なプログラミングを知っている必要があります。空きブロック用のリストと割り当てられたブロック用のリストがあります(技術的には、サイズに応じて無料のリストがいくつかありますが、コードが同じサイズのブロックを割り当てるため、ここでは関係ありません)。したがって、特定のブロックを解放するときは、リストをそのまま維持するためにポインターを修正する必要があります。

たとえば、以下のリストからブロックyを解放するとします。

x <-> y <-> z

上の図では、bkとfdのスポットに、リストに沿って反復するために必要なポインターが含まれていることに注意してください。mallocがリストからブロックpを削除したい場合、特に、リストを修正するためのマクロを呼び出します。

#define unlink( y, BK, FD ) {            
    BK = P->bk;                          
    FD = P->fd;                          
    FD->bk = BK;                         
    BK->fd = FD;                         
}

マクロ自体を理解するのは難しいことではありませんが、古いバージョンのlibcで注意すべき重要な点は、書き込まれるサイズやポインターに対して健全性チェックを実行しないことです。あなたの場合の意味は、アドレスのランダム化を一切行わなくても、ヒープのステータスを予測可能かつ確実に判断し、特定の方法でヒープをオーバーフローさせることで(ここではstrncopyを介して)任意のポインターを選択したアドレスにリダイレクトできることです。 。

攻撃を機能させるために必要なものがいくつかあります。

  • ブロックのfdポインターは、上書きするアドレスからマイナス12バイトを指しています。オフセットは、mallocがリストを変更するときにアライメントをクリーンアップすることと関係があります
  • ブロックのbkポインターがシェルコードを指しています
  • サイズは-4である必要があります。これにより、いくつかのことが達成されます。つまり、ブロック内のステータスビットが設定されます。

したがって、特定の例ではオフセットを試してみる必要がありますが、ここでstrcpyを使用して渡そうとしている一般的な悪意のある形式は、次の形式です。

| 正当なバッファを埋めるためのがらくた| -4 | -4 | 上書きするアドレス-12(0x0C)| 代わりに呼び出したいaddr

負の数はprev_sizeフィールドを-4に設定することに注意してください。これにより、フリールーティングはprev_sizeチャンクが実際に制御/破損している現在のチャンクで開始すると信じます。

そして、はい、この攻撃が現在のバージョンのglibcで機能しないことを言及せずに、適切な説明を完了することはできません。サイズには健全性チェックが行われており、リンク解除メソッドは機能しません。これをアドレスのランダム化などの緩和策と組み合わせると、この攻撃はレガシーシステム以外では実行できなくなります。しかし、ここで説明する方法は、私がその挑戦をした方法です;)

于 2013-03-20T15:20:49.610 に答える
3

MallocMalleficarumで説明されているテクニックのほとんどが保護されていることに注意してください。glibcは、2倍の無料シナリオを大幅に改善しました。

Malloc Malleficarumの手法に関する知識を向上させたい場合は、MallocDes-MalleficarumとHouseof Lore:Reloadedbyblackngelをお読みください。これらのテキストはphrackで見つけることができます。

Malloc Des-Malleficarum

私もそれに取り組んでいます、そして、例えば、テキストで説明されているように、少なくとも、HouseofMindはもはや利用可能ではないとあなたに言うことができます。コードに追加された新しい制限をバイパスすることは可能かもしれませんが。コードを実行する最も簡単な方法は、.dtorsアドレスを上書きすることです。したがって、プログラムが終了すると、コードは常に実行されます。

glibcコードをダウンロードして、mallocなどの批評ゾーンを調べると、前述のドキュメントに記載されていないコードチェックが見つかります。これらのチェックは、ダブルフリーパーティーを止めるために含まれていました。

一方、youtube(BlackHat 2007)で見つけることができるJustin N. Ferguson(ヒープを壊して理解する)のプレゼンテーションは、すべてのヒープメカニズムを理解するために最適ですが、示されている手法は次のとおりです。信頼できるとはほど遠いですが、少なくとも、彼は搾取を積み上げるための新しい分野を開きます。

ヒープを壊して理解する

とにかく、私も取り組んでいるので、私に連絡したい場合は、私たちの進歩を共有することができます。あなたはnewlogとしてoverflowedminds.netドメインで私に連絡することができます(自分でメールアドレスを作成してください^^)。

于 2012-04-12T13:01:41.490 に答える
-2

ヒープオーバーフローは取り除くのが難しく、ヒープレイアウトに非常に大きく依存しますが、このタイプの攻撃を阻止するために特に多くの緩和策が講じられているWindowsCRTヒープを追いかけているように見えます。

この種のことを本当にやりたいのであれば、WinDbgに飛び込んで、freeのような関数に足を踏み入れて、free内で何が起こっているのかを正確に確認する必要があります。したがって、ヒープを介してどのような制御を実現できるかを確認できます。前の値のオーバーフロー。

ヒープオーバーフローのデモンストレーションは通常、防御セキュリティには十分であるという単純な理由から、これ以上具体的なヘルプは提供しません。防御セキュリティの専門家は、実際にヒープオーバーフローを完全に悪用することなく、ヒープオーバーフローを報告できます。リモートコード実行に至るまでヒープオーバーフローを完全に悪用する必要があるのは、バグを攻撃的に悪用する人だけです。それを実行したい場合は、自分で行ってください。

于 2012-03-11T20:10:24.797 に答える