0

重複の可能性:
C でのスタック オーバーフローの悪用

次のプログラムのスタック オーバーフローの脆弱性を悪用するプログラムを作成する必要があります。私はこの種のことをしたことがありません。理論上、スタックとオーバーフローの両方がどのように機能するかを理解しています。しかし、私は C での実装について無知です。これで私を助けてください。スタックをオーバーフローさせてシェル コードを生成するために必要な手順を明確に理解する必要があります。

#include <stdio.h>
int myprint(char* argv1)
{
    printf("%s", argv1);
}
void foo(char* argv1, char* argv2) 
{
    int (*fptr)(char*) = myprint;
    char buf[12];
    strcpy(buf, argv1);
    fptr(argv2);
}
int main(int argc, char **argv) 
{
    if (argc < 3) 
    {
            printf("error\n");
            return;
    }

    foo(argv[1], argv[2]);
}

ありがとう

4

1 に答える 1

2

このコードを悪用する能力の鍵は、次の2行です。

char buf[12];
strcpy(buf, argv1);

bufここで、スペースが制限されているサイズ12bytesというバッファがあることがわかります。次の行では、のサイズが。よりも小さいことを確認せずに、を取得argv1してコピーしています。bufargv1buf

これは、このチェックされていないバージョンでは、この関数のスタックフレームのリターンアドレスのstrcpy終わりを超えて書き込み、場合によっては上書きできることを意味します。buf

関数が戻る直前のスタックフレームの最後に、通常、アセンブラーのようretにステートメントとしてアセンブラーにあります(アセンブラーの種類によって異なる場合があります。ここでは、x86を想定しています)。これは、基本的に呼び出し元に戻ります。スタックに格納されているアドレスを使用します(通常、呼び出し規約によっては、この関数が呼び出される前に格納されています)。

次に、そのアドレスを、シェルを実行して開く空き領域に配置したシェルコードを指すもので上書きできます。

これは、関数を呼び出すときに何が起こるか、およびプロローグとエピローグがどのように行われるかを説明する、X86アセンブラーの呼び出し規約に関するセクションです。

于 2012-11-19T15:30:09.440 に答える