Come sfruttare il binario senza gadget syscall o perdita di informazioni in ASLR e NX completi?

2

Quindi ho un binario Linux x86-64 collegato con libc che funziona dinamicamente su Ubuntu 16.04 con patch da remoto.

L'eseguibile fa una chiamata a libc per leggere ed uscire, permettendo un semplice overflow dello stack in ROP. Questo è l'unico codice compilato nel file binario.

-----------------------
gdb-peda$ checksec
CANARY    : disabled
FORTIFY   : disabled
NX        : ENABLED
PIE       : disabled
RELRO     : Partial
-----------------------

ASLR completo abilitato.

Non ho accesso a un gadget syscall a nessun indirizzo conosciuto e, dopo aver sentito che vsyscall potrebbe funzionare, ho appreso che vsyscall è ora emulato nelle versioni più recenti del kernel e non può essere utilizzato per un gadget syscall.

Ho fatto ricerche manuali per int 0x80, syscall e sysenter sperando di trovarle nella sezione eseguibile conosciuta senza alcun risultato.

Qualcuno sa in qualche modo di sfruttare questo binario senza alcun indirizzo conosciuto tranne che per 'leggere'?

Suppongo che l'unico modo che posso immaginare sia di leggere in qualche modo un indirizzo libc da GOT e ROPing nel dereferenziare quell'indirizzo in una nuova funzione a un nuovo offset ... ma non riesco nemmeno a trovare un gadget che possa fammi dereferenziare.

Non posso usare l'indirizzo parziale sovrascrivere bruteforcing perché x86-64 ha troppa entropia.

C'è qualche tecnica che non conosco?

Sto sbattendo la testa contro un muro su questo!

    
posta Gbps 09.04.2017 - 04:09
fonte

1 risposta

4

Alla fine la soluzione stava usando una sovrascrittura di un indirizzo parziale, dopotutto.

Usando l'indirizzo per leggere il GOT, è possibile eseguire una sovrascrittura di due byte dell'indirizzo parziale per saltare all'interno di una garanzia di 8192 byte da leggere in libc, con una possibilità di 1/16 di forza bruta per saltare entro 65535 byte ( a causa dell'entropia di 4 byte di ASLR).

All'interno della sovrascrittura a due byte, c'è un dispositivo magico situato a 0x6109 byte dall'indirizzo di lettura, che si trova entro la distanza di due byte.

Da one_gadget , puoi trovare il gadget magico near read:

0xf0567 execve("/bin/sh", rsp+0x70, environ)
constraints:
  [rsp+0x70] == NULL

Dove in questa versione di libc (2.6.32), la chiamata da leggere si trova in:

0xF6670 read            proc near

Usando una chiamata per leggere, possiamo sovrascrivere la voce GOT di read e ROP back to main per chiamare il nostro magic gadget.

Inoltre, è stata trovata un'altra soluzione eseguendo lo stesso sovrascrittura di indirizzo parziale su ROP nell'impostazione di un syscall, quindi sovrascrivendo l'ultimo byte di lettura per saltare i byte 0x0E in avanti e colpire il gadget syscall naturale trovato nella lettura. In questo modo non devi applicare bruteforce ASLR e avere un exploit stabile!

    
risposta data 10.04.2017 - 17:40
fonte

Leggi altre domande sui tag