Format Strings - Arbitrary Read Example
Last updated
Last updated
Impara e pratica l'Hacking su AWS:HackTricks Training AWS Red Team Expert (ARTE) Impara e pratica l'Hacking su GCP: HackTricks Training GCP Red Team Expert (GRTE)
Compilalo con:
L'offset è 11 perché impostando diverse A e forzando con un ciclo gli offset da 0 a 50, si è scoperto che all'offset 11 e con 5 caratteri extra (pipe |
nel nostro caso), è possibile controllare un intero indirizzo.
Ho usato %11$p
con padding fino a quando ho visto che l'indirizzo era tutto 0x4141414141414141
Il payload della stringa di formato è PRIMA dell'indirizzo perché il printf smette di leggere a un byte nullo, quindi se inviamo prima l'indirizzo e poi la stringa di formato, il printf non raggiungerà mai la stringa di formato poiché troverà prima un byte nullo
L'indirizzo selezionato è 0x00400000 perché è dove inizia il binario (senza PIE)
Compilalo con:
La variabile locale stack_password
sarà memorizzata nella pila perché è una variabile locale, quindi basta abusare di printf per mostrare il contenuto della pila. Questo è un exploit per BF le prime 100 posizioni per ottenere in modo non autorizzato le password dalla pila:
Nell'immagine è possibile vedere che possiamo ottenere in modo non autorizzato la password dalla stack nella 10a
posizione:
Eseguendo lo stesso exploit ma con %p
invece di %s
è possibile ottenere in modo non autorizzato un indirizzo di heap dalla stack in %25$p
. Inoltre, confrontando l'indirizzo ottenuto (0xaaaab7030894
) con la posizione della password in memoria in quel processo possiamo ottenere la differenza tra gli indirizzi:
Ora è il momento di trovare come controllare un indirizzo nella stack per accedervi dalla seconda vulnerabilità della stringa di formato:
E' possibile vedere che nel tentativo 14 con il passaggio utilizzato possiamo controllare un indirizzo:
Impara e pratica l'hacking su AWS: HackTricks Training AWS Red Team Expert (ARTE) Impara e pratica l'hacking su GCP: HackTricks Training GCP Red Team Expert (GRTE)