1

オーバーフローの悪用には次の 3 つの手順が必要であることを理解しています。

1.任意のコード (シェルコード) をターゲット プロセスのメモリ空間に挿入する。

2.eip を制御する。

3.任意のコードを実行するように eip を設定します。

ヒープの悪用に関する ben hawkens の記事を読み、関数ポインターを最終的にオーバーライドして自分のコードを指すようにする方法について、いくつかの戦術を理解しました。

つまり、ステップ 2 を理解しています。

ステップ1と3がわかりません。

  1. コードをプロセス メモリ空間に挿入するにはどうすればよいですか?

  2. ステップ 3 で、関数ポインタをシェルコードへのポインタでオーバーライドします。どのアドレスを計算して知ることができますか? (この問題は、stackoverflow で "jmp esp" を使用して解決されます)。

4

3 に答える 3

3

ヒープ オーバーフローでは、システムで ASLR がアクティブ化されていないと仮定すると、オーバーフローで使用するメモリ チャンク (別名、バッファー) のアドレスがわかります。

1 つのオプションは、(アプリケーション ユーザーとして) バッファーの内容を制御できる場合に、バッファーがある場所にシェルコードを配置することです。シェルコード バイトをバッファに配置したら、そのバッファ アドレスにジャンプするだけです。

そのジャンプを実行する 1 つの方法は、たとえば、.dtors エントリを上書きすることです。脆弱なプログラムが終了すると、バッファに置かれたシェルコードが実行されます。複雑な部分は .dtors の上書きです。そのためには、公開されたヒープを利用する手法を使用する必要があります。

前提条件は、ASLR が非アクティブ化されている (脆弱なプログラムを実行する前にバッファーのアドレスを知るため) ことと、バッファーが配置されているメモリ領域が実行可能である必要があることです。

さらに、手順 2 と 3 は同じです。eip を制御する場合は、それをシェルコード (任意のコード) に向けるというロジックです。

PS: ASLR のバイパスはより複雑です。

于 2012-09-28T02:38:11.843 に答える
2

ステップ 1 では、攻撃されたコードに脆弱性が必要です。一般的な脆弱性には次のものがあります。

  • バッファ オーバーフロー (一般的な i C コード。プログラムが任意の長い文字列を固定バッファに読み込むと発生します)
  • サニタイズされていないデータの評価 ( SQLおよびスクリプト言語で一般的ですが、他の言語でも発生する可能性があります)

ステップ 3 では、ターゲット アーキテクチャに関する詳細な知識が必要です。

于 2012-05-28T13:42:23.337 に答える
1
  1. コードをプロセス空間に挿入するにはどうすればよいですか?

    これはかなりの声明/質問です。上記のプロセス空間にコードの「悪用可能な」領域が必要です。たとえば、Windows は現在、可能であればほとんどの strcpy() を strncpy() に書き換えています。可能なら言う

    strcpy を使用するコードのすべての領域を strncpy に正常に切り替えることができるわけではないためです。なんで?以下に示す違いのこの核心の ~@ ため。

    strcpy($buffer, $copied);
    

    また

    strncpy($buffer, $copied, sizeof($copied));
    

    これがstrncpy、実際のシナリオでの実装を非常に困難にしている理由です。ほとんどの操作で「マジック ナンバー」をインストールする必要がありますstrncpy(sizeof() オペレーターがこのマジック ナンバーを作成します)。

    char buffer[1024];コーダーとして、私たちはハードコーディングされた値を使用して、非常に悪いコーディング慣行への厳密な準拠などを教えられています。

    しかし〜比較すると、buffer[]="";またはを使用buffer[1024]="";することがエクスプロイトの中心です。ただし、たとえばこのコードを後者に変更すると、別のエクスプロイトがシステムに導入されます...

    char * buffer;
    char * copied;
    
    strcpy(buffer, copied);//overflow this right here...
    

    またはこれ:

    int size = 1024;
    
    char buffer[size];
    char copied[size];
    
    strncpy(buffer,copied, size);
    

    これによりオーバーフローは停止しますが、サイズが予測可能であり、コード/データの 1024 ブロックに構造化されているため、RAM に悪用可能な領域が導入されます。

    したがって、たとえば、プログラムのアドレス空間で strcpy を探している元の投稿者は、strcpy が存在する場合、プログラムを悪用可能にします。

    プログラマが strcpy よりも strcpy を好む理由はたくさんありますstrncpy。マジックナンバー、可変入出力データサイズ…プログラミングスタイル…etc…

  2. 自分のコード (自分の場所) で自分自身を見つけるにはどうすればよいですか

    この例については、さまざまなハッカーの本をチェックしてください ~

    しかし、試してみてください。

    label:
    pop eax
    pop eax
    call pointer
    
    jmp label
    pointer:
    mov esp, eax
    jmp $
    

    これは、私が次のモリス ワームを書く責任を負いたくないという事実のために機能しない例です! しかし、まともなプログラマなら、このコードの要点を理解し、私がここで話していることをすぐに理解するでしょう。

    息子よ、あなたのオーバーフロー テクニックが将来うまくいくことを願っています!

于 2016-11-10T10:35:12.830 に答える