Sovrascrittura indirizzo di ritorno della funzione principale

1

Sono nuovo ai CTF e mi è stato chiesto di risolvere questo problema:

#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);
}

So che il punto è sovrascrivere l'indirizzo di ritorno della funzione principale con l'indirizzo di ingresso ilocamp (), e per farlo dovrei usare quel semplice vuln nel ciclo, ma non ho idea di come farlo . Ho anche binario, ho provato a fare qualcosa con gdb ma non so come. Puoi darmi qualche consiglio? Esiste un binario: link (Il file "flag2.txt" è sul server locale)

    
posta nullifier 27.09.2017 - 23:06
fonte

1 risposta

1

Solo una descrizione approssimativa per ora in quanto non ho molto tempo. L'idea generale è di determinare l'indirizzo della funzione obiettivo e la posizione esatta dell'indirizzo di ritorno nello stack.

Se vuoi sovrascrivere l'indirizzo di ritorno devi prima trovare la posizione corretta. Per fare ciò, probabilmente vorrai eseguire il debug del programma, impostare un punto di interruzione sull'ultimo passaggio possibile nella tua funzione principale e osservare i registri che cambiano modificando le singole istruzioni da lì. Un breve suggerimento: se apri il programma e successivamente inserisci una stringa più lunga di 1 byte ogni volta che viene lanciato: puoi vederlo crollare ad un certo punto. Supponendo che non ci sia stack di canary o shadow stack o qualunque cosa tu abbia trovato il tuo indirizzo di destinazione. Potresti (mentre esegui il debugging) ad es. Dagli un sacco di 'A e guarda 0x41 nel tuo Debugger.

La prossima cosa è determinare l'indirizzo della funzione target. È piuttosto semplice, puoi ad es. prova info symbol con info address . Dopodiché tutto si riduce a (nel caso più semplice) scrivere garbage (ad esempio 'A') nello stack fino a raggiungere l'indirizzo del RIP (Return Instruction Pointer) e quindi scrivere il nuovo indirizzo desiderato.

Leggi anche un po 'di EIP / RIP e Stack Overflow su wikipedia e altri.

    
risposta data 28.09.2017 - 09:19
fonte

Leggi altre domande sui tag