7

バッファ オーバーフローの悪用をテストしていますが、コードをコンパイルすると、gcc はメモリ アラインメントを使用し、コンパイラによって追加された余分なバイトにより、このパディングを処理する必要があります。

パディングなしで gcc でコードをコンパイルする方法はありますか?

これはパディングで達成されるオーバーフローですが、コンパイラのガベージなしで明確に表示したい:

(gdb) x/60x 0xbffff450
0xbffff450: 0xbffff460  0x00000001  0x00000000  0x00000001
0xbffff460: *0x41414141 0x41414141  0x41414141  0x41414141[buffer begins]
0xbffff470: 0x41414141  0x41414141  0x41414141  0x41414141
0xbffff480: 0x41414141  0x41414141  0x41414141  0x41414141
0xbffff490: 0x41414141  0x41414141  0x41414141  0x41414141*[buffer ends]
0xbffff4a0: 0x41414141  0x41414141  0x41414141 [0x0804851c][Return Address]

よろしく

編集:

これは私がコンパイルしているコードです:

#include <stdio.h>

char *secret = "pepito";

void go_shell(){
    char *shell = "/bin/sh";
    char *cmd[] = { "/bin/sh", 0 };
    printf("¿Quieres jugar a un juego?...\n");
    setreuid(0);
    execve(shell,cmd,0);
}

int authorize(){
    char password[64];
    printf("Escriba la contraseña: ");
    gets(password);
    if (!strcmp(password,secret))
        return 1;
    else
        return 0;
}

int main(){
    if (authorize()){
        printf("Acceso permitido\n");
        go_shell();
    } else{
        printf("Acceso denegado\n");
    }
    return 0;
}
4

1 に答える 1

5

はい、gcc がスタック領域を割り当てる方法を調整する必要があります。デフォルトでは、特定の命令 (SSE*) が必要とするため、スタックを 16 バイト境界に整列させようとします。コンパイル時にコマンド ラインで指定する-mpreferred-stack-boundary=2と、gcc はスタックを 2^2=4 に揃えたままにします。これは、32 ビット環境を使用しているため期待していたものです。

于 2013-10-16T00:23:04.810 に答える