web-dev-qa-db-ja.com

バッファオーバーフロー:ESPレジスタがアクセス違反後に値を変更する理由

背景:現在、BoFの脆弱性を悪用しようとしています。環境をセットアップし、strcpy関数を含むコンパイル済みのCプログラムを実行した後、Immunity Debuggerで実行しているときにプログラムを逆アセンブルしたので、クラッシュの瞬間にプログラムのスタックにあったデータを分析して利用できます。

問題:次に、調査されたチュートリアルビデオとブログ投稿に従って、次のステップは、ESPおよびEIPレジスタ。これは、exeでJMP ESP命令を見つけ、その命令のメモリ位置(不正な文字なし)を使用して戻りアドレス(EIP値)を上書きできるようにするために行われます。

質問:上記はすべて、スタックポインター(ESP)が、上書きおよびアクセス違反の直後にペイロードを含むメモリブロックを指しているという前提の下で行われました。したがって、tl dr私の質問は次のとおりです:常にESPがペイロードを指しているとしたら、スタックのトップ?

ビジュアル、説明してください:小さいサイズの画像で申し訳ありません。しかし、この写真はsecuritytube.netのSPSEクラスの偉大なVivek教授からのものです。

BoF stack visuals

さらに誰かがクラッシュの前後のESPの値と、ESPの値がポイントするように変更される理由を説明してください私たちのペイロード?それはstrcpyの関数の作成/死のせいですか、そうである場合、変更されたESP値でどのように役割を果たしますか?ソースコードは次のように設定されています:

#include <stdio.h>
#include <string.h>

void vuln_func(char* inputstring)
{
    char* buf[100];
    strcpy(buf, inputstring)
}
int main()
{
    // gets input_string 
    vuln_func(input_string);
    return 0;
}

更新:回答内の@gameOverによるコメントは、与えられたビジュアル内の4141が何であるかについて尋ねました。これはより良い説明です:41はAのASCII文字の16進数です。これは、破損した文字列に含まれるものです。そして、破損した文字列に含まれるEIP(戻りアドレス)オフセットまでは完全に任意です。この場合、文字列は "A"でした。その後、JMP ESPのメモリ位置で戻りアドレスオフセットが書き込まれ、その後、破損した文字列がstringには、実行されるペイロードが含まれています。 (クラッシュ時にESPが指している場所はどこですか)したがって、私の質問ですが、スタックの最上部を指しているはずのペイロードにESPが指しているのはなぜですか?

2
Rennitbaby

あなたが正しく指摘したようにESPは常にスタックの先頭を指します。また、バッファのオーバーフローが原因でstackオーバーフローが発生しますスタック上のオーバーフローによるものではなく、mallocで割り当てられたバッファとしましょう。

char* buf[100];

実際には、バッファにスペースを割り当てていますスタック上。これを説明するには:

enter image description here

入力で上書きされる前のこのバッファーの初期状態/内容は不明であり、デバッガーを使用して gdb のように確認できます。したがって、overflowそのバッファを入力で移動すると、スタックに存在するすべてが上書きされます(オーバーフローが発生する方向を確認するには、上の画像を確認してください)。したがって、EIPを上書きします。あなたがそれを指すようにしたいものを指します。これで、関数が(usingRETinstruction)を返すほとんどの場合、ポップアップします[〜#〜] eip [〜#〜]およびadd esp, 4も実行します。このように[〜#〜] esp [〜#〜]は、関数が呼び出されたときにスタックにプッシュされた最後のパラメーターを指します。例/画像では、このパラメーターはArg 1です(引数はスタックに逆順でプッシュされるため)。あなたが投稿した写真は正確で、関数が戻るときにESPの状態を示しています。したがって、jmp espなどのような命令を見つけたら、その場所に直接ジャンプできますあなたのペイロードの。

しかし、それだけが悪用可能なケースではありません。そのため、デバッガを使用して、registerがペイロードを指しているかどうか、およびjmp reg命令を検索するかどうかを確認することをお勧めします。たとえば、 this post では、[〜#〜] esp [〜#〜][ 〜#〜] edi [〜#〜]ペイロードを指します。

3
game0ver