Sobrescribiendo la dirección de retorno de la función principal

1

Soy nuevo en CTFs y me pidieron que resolviera esto:

#include <cstdio>

// g++ pwn2.cpp -o pwn2 -static

void ilocamp() {
     char flaga[1024] = {0};
     FILE *f = fopen("flag2.txt", "r");
     fread(flaga, 1, 1024, f);
     fclose(f);
     printf("flaga: ILOCAMP{%s}\n", flaga);
}


int main() {

     int tab[100] = {0};
     int dwa = 2;
     int n,i,min,x;

     scanf("%d",&n);
     for (i=0;i<n;i++) {
        scanf("%d", &x);
        scanf("%d", &tab[x]);
     }

     min = 1000000000;
     for (i=0;i<n;i++) {
        if (tab[i] && tab[i] < min) {
           min = tab[i];
        }
     }

     printf("najmniejsza liczba: %d a dwa wynosi: %d\n", min, dwa);
}

Sé que el punto es sobrescribir la dirección de retorno de la función principal con la dirección de entrada ilocamp (), y para hacer esto, se supone que debo usar esa vulnerabilidad simple en el bucle, pero no tengo idea de cómo hacerlo. . También tengo binario, intenté hacer algo con gdb pero no sé realmente cómo hacerlo. ¿Me puede dar algunos consejos? Hay un binario: enlace (El archivo "flag2.txt" está en el servidor local)

    
pregunta nullifier 27.09.2017 - 23:06
fuente

1 respuesta

1

Solo una descripción aproximada por ahora, ya que no tengo mucho tiempo. La idea general es determinar la dirección de la función de destino, así como la posición exacta de la dirección de retorno en su pila.

Si desea sobrescribir la dirección de retorno, primero debe encontrar la posición correcta. Para hacerlo, probablemente querrá depurar el programa, establecer un punto de interrupción hasta el último paso posible en su función principal y ver cómo cambian los registros al pasar instrucciones individuales desde allí. Un breve consejo: si abres el programa y luego pones una cadena de 1 byte más larga cada vez que se inicia: puedes verlo fallar en algún momento. Suponiendo que no haya pila de canarios o de sombra, o lo que sea, habrá encontrado su dirección de destino. Usted podría (mientras lo depura) por ejemplo. aliméntalo con muchas 'A' y observa a 0x41 en tu depurador.

Lo siguiente es determinar la dirección de su función de destino. Es bastante sencillo, puedes p. Ej. intente info symbol con info address . Después de eso, todo se reduce a (en el caso más sencillo) escribir basura (por ejemplo, 'A') en la pila hasta que llegue a la dirección del RIP (Devolver el puntero de instrucción) y luego escriba la nueva dirección que desee en ella.

También lea un poco sobre EIP / RIP, y Stack Overflow en wikipedia y otros.

    
respondido por el Ben 28.09.2017 - 09:19
fuente

Lea otras preguntas en las etiquetas