Domanda Risolto Inserire indirizzo di memoria con 0x00

Stato
Discussione chiusa ad ulteriori risposte.

0xbro

Super Moderatore
24 Febbraio 2017
4,465
179
3,767
1,825
Ultima modifica:
Ciao a tutti!
Sono tornato a studiare sul libro ""The art of exploitation", ma mi sono bloccato sul problema citato nel titolo.
Spiego meglio:
io ho decompilato questo sorgente
C:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int check_auth(char *psw){
    int auth_fl = 0;
    char psw_buffer[16];

    strcpy(psw_buffer, psw);

    if (strcmp(psw_buffer, "brilling") == 0)
        auth_fl = 1;
    if (strcmp(psw_buffer, "outgrabe") == 0)
        auth_fl = 1;

    return auth_fl;
}

int main(int argc, char *argv[]){
    if (argc < 2){
        printf("Usage: %s <password>\n", argv[0]);
        exit(0);
    }

    if (check_auth(argv[1])){
        printf("\n==================\n");
        printf("Access Granted.\n");
        printf("==================\n");
    }else{
        printf("\nAccess Denied.\n");

    }

    return 0;
}
e il risultato in ASM è il seguente:
35612


Come posso, una volta uscito dalla call <check_auth> saltare subito all'ultima print (lea rdi,[rip+0xf3])?
Nel libro fanno un esempio differente, però volevo provare a stampare solo una riga di quelle 3 che vengono stampate.

Il problema principalmente è il fatto che l'indirizzo a cui voglio saltare contiene dei nullbyte (0x00).
Di conseguenza, il comando
Codice:
./auth_overflow $(perl -e ' print "\xe6\x06\x40\x00" x12;')
non va bene poichè 0x00 viene ignorato e gli indirizzi non vengono sovrascritti con 0x00...
C'è un modo? O quando ci si trova con un NullByte è game over?
 
Come posso, una volta uscito dalla call <check_auth> saltare subito all'ultima print (lea rdi,[rip+0xf3])?
In che senso vorresti saltare a quella print? per farti stampare "Access Granted."? Non penso sia questo l'approccio per exploitare questo file(poi magari hai in mente altri test, in tal caso correggimi).

Esattamente cosa vorresti fare con quel comando? anche perchè vedo un 12, ma il tuo buffer è da 16, quindi non arrivi all'overflow.
Spiega meglio quello che vorresti fare, che magari ho capito male io è.è


P.S: ti consiglia di usare pwndbg al posto di gdb, molto meglio ;)
 
Ciao!
Si in verità l'approccio spiegato nel libro è un altro: è quello di ricoprire con il buffer il valore di auth_fl in modo che valga un valore diverso da zero e quindi risulti autenticato. Volevo però provare a vedere se riscrivendo il registro RIP si riuscisse a saltare la stampare "Access Granted" e stampare solo l'ultima printf("==================\n");). Come azione non è sensata, era solo per capire se si potesse fare una cosa del genere. Mi ero però bloccato perché l'indirizzo a cui voglio saltare uscito dalla funzione check_auth contiene dei nullbyte (0x00000000004006e1)… temo non si possa quindi fare.

L'overflow in verità si verifica perché lo script ./auth_overflow $(perl -e ' print "\xed\x06\x40\x00" x12;') compone una stringa di 48 byte
\xed\x06\x40\x00\xed\x06\x40\x00\xed\x06\x40\x00\xed\x06\x40\x00\xed\x06\x40\x00\xed\x06\x40\x00\xed\x06\x40\x00\xed\x06\x40\x00\xed\x06\x40\x00\xed\x06\x40\x00\xed\x06\x40\x00\xed\x06\x40\x00
Ora come ora sto usando gdb-peda che ho visto viene molto usato, oggi magari proverò pwn :)
 
Se la funzione vulnerabile è strcpy non c'è molto che si possa fare, forse con una ROP chain molto fortunata potresti essere in grado di saltare a quel print attraverso un salto relativo, se trovi i gadget giusti con indirizzi privi di byte 0x00 e calcoli il salto correttamente, ma è un caso piuttosto estremo e sarebbe ben poco pratico.
 
Stato
Discussione chiusa ad ulteriori risposte.