9

私はバッファオーバーフローについて学んでおり、作成しようとしています。私はこのコードを持っています:

#include <stdio.h>

char *secret = "password";

void go_shell() {
    char *shell =  "/bin/sh";
    char *cmd[] = { "/bin/sh", 0 };
    setreuid(0);
    execve(shell,cmd,0);
}

int authorize() {
    char password[64];
    printf("Enter Password: ");
    gets(password);
    if (!strcmp(password,secret)) {
        return 1;
    }
    else {
        return 0;
    }
}

int main() {
    if (authorize()) {
        printf("login successful\n");
        go_shell();
    } else {
        printf("Incorrect password\n");
    }
    return 0;
}

これをgccでコンパイルしてからgdbで実行します

パスワードとして約 100 個の「A」を入力すると、プログラムがクラッシュします。

問題は、レジスタが上書きされないことです0x4141414141414141

-fno-stack-protectorこれをグーグルで検索し、フラグをに追加しましたgcc。これにより、RBP を上書きできるようになりまし0x4141414141414141たが、他には何もありませんでした。

RIP を上書きできるようにコードをコンパイルする方法があるかどうか疑問に思っていました。

4

2 に答える 2

3

でコンパイルすると、コードはすでに目的を果たしています-fno-stack-protectorRIPGDBで の値が表示されない理由は、が更新さ0x4141414141414141れる前に一般保護違反がスローされるためです。RIP(ページ フォールトが発生した場合、GPF ハンドラーは通常、スワップからページを読み込み、失敗した命令から開始して実行を再開します。)

于 2013-02-10T21:54:49.233 に答える