Skip to content
KitploitKITPLOIT
StrumentiBlog
Invia
StrumentiBlog
Invia

Strumenti di Hacking, PenTest e Cybersecurity per il tuo Arsenale di Sicurezza!

Kitploit è una directory di strumenti di hacking, cybersecurity e pentesting. Scopri gli ultimi aggiornamenti dei progetti per trovare vulnerabilità, analizzare sistemi, automatizzare i test e rafforzare la tua sicurezza.

··Feed·Contatto·Privacy·© 2026 Kitploit

Directory degli strumenti

Categorie

Vedi tutte le categorie
Loading categories
CVE-2019-25485 — Buffer overflow basato su stack in R 3.4.4. Sfruttamento completo su x86, ma solo controllo di RIP con analisi dei gadget su x64 a causa dei vincoli del programma. La stessa vulnerabilità su due architetture, che porta a diversi percorsi di sfruttamento. | Kitploit
Strumenti/GitHubGitHub/themalwareguardian/cve-2019-25485
Analisi delle VulnerabilitàExploitReverse EngineeringShellcodeDebuggerApprendimento e FormazioneSviluppo PayloadBinary Exploitation

Più Popolari

Vedi tutti →

Scopri gli strumenti più utilizzati dalla nostra community.

Esplora tutti gli strumenti

Sfoglia la nostra collezione di strumenti

Vedi tutti gli strumenti →
Condividi
GitHub
themalwareguardian/cve-2019-25485

CVE-2019-25485

Buffer overflow basato su stack in R 3.4.4. Sfruttamento completo su x86, ma solo controllo di RIP con analisi dei gadget su x64 a causa dei vincoli del programma. La stessa vulnerabilità su due architetture, che porta a diversi percorsi di sfruttamento.

Vedi Repository
5 mesi faNon ancora revisionato

🐞 CVE-2019-25485: R 3.4.4 - Buffer Overflow basato su Stack (x86 e x64)

Buffer overflow basato su stack in R 3.4.4. Sfruttamento completo su x86, ma solo controllo di RIP con analisi dei gadget su x64 a causa dei vincoli del programma. La stessa vulnerabilità su due architetture, che porta a percorsi di sfruttamento diversi.




📑 Indice dei contenuti

  • Perché esiste questo repository
  • Perché questa vulnerabilità è interessante
  • Contesto e software interessato
  • Sulla vulnerabilità
  • Come innescare il crash
  • Sfruttamento



🎓 Perché esiste questo repository

Questo repository fa parte del materiale che uso quando insegno lo sfruttamento della corruzione della memoria (oltre al mio lavoro abituale, insegno anche in diversi corsi di cybersecurity dove aiuto a formare la prossima generazione di reverse engineer).

CVE-2019-25485 è il caso che uso quando voglio che gli studenti affrontino la stessa vulnerabilità su due architetture diverse e vedano di persona cosa cambia tra di esse. R 3.4.4 è disponibile sia in versione x86 che x64, e lo stesso identico overflow esiste in entrambe: lo stesso campo della GUI, lo stesso gestore di input, lo stesso crash. Entrambe sono documentate e sfruttate qui come esercizi separati:

  • La versione x86 segue la metodologia vanilla di sovrascrittura di EIP. L'overflow raggiunge EIP, viene trovato un gadget JMP ESP in un modulo senza ASLR, lo shellcode viene posizionato dopo la sovrascrittura di EIP e viene ottenuta una reverse shell funzionante. È un exploit pulito e diretto che dimostra i fondamenti dei buffer overflow basati su stack.
  • La versione x64 raggiunge il controllo di RIP e conferma l'offset, ma non viene ottenuta una RCE completa. Questa è una scelta deliberata ed è il punto dell'esercizio. Il tentativo di sfruttamento su x64 documenta per intero il processo di ricerca dei gadget, analizza perché ogni categoria di gadget fallisce in questo specifico contesto, spiega il vincolo del byte nullo imposto dal gestore di input e descrive la struttura della catena ROP che sarebbe necessaria per bypassare il DEP e perché non può essere costruita dati i vincoli di questo vettore di input. L'unico percorso teorico rimasto per lo sfruttamento completo di questa singola vulnerabilità sarebbe il JOP, Jump-Oriented Programming, che concatena gadget che terminano con JMP invece che RET e non si affida allo stack per il flusso di controllo. Costruire manualmente una catena JOP senza alcuna regione controllata e scrivibile dopo la sovrascrittura di RIP è una sfida aperta avanzata che va oltre lo scopo di questo esercizio. Il fallimento non è una lacuna nella metodologia. È la lezione.



💡 Perché questa vulnerabilità è interessante

R 3.4.4 è un'applicazione di calcolo statistico, non un servizio di rete o un browser. L'overflow viene innescato tramite un campo della GUI desktop, il che significa che la superficie d'attacco è completamente diversa da ogni altro caso che insegno. Ciò che rende questo caso utile per l'insegnamento:

  • Nessuna componente di rete. Il payload viene incollato in un campo della GUI, il che introduce una diversa classe di vincoli, in particolare il modo in cui il gestore di input della GUI elabora i byte prima che raggiungano l'operazione di copia vulnerabile.
  • Il controllo di RIP è confermato. L'overflow raggiunge RIP e l'offset viene trovato. Non è un caso in cui la vulnerabilità non può essere raggiunta. Il controllo del puntatore d'istruzione è pienamente dimostrato.
  • L'imposizione degli indirizzi canonici rompe l'approccio classico. Su x86 si sovrascrive EIP e si aggiunge lo shellcode. Su x64 i byte superiori di RIP devono essere \x00\x00 perché l'indirizzo sia canonico, e quei byte nulli terminano l'input immediatamente dopo l'indirizzo del gadget. Non c'è spazio per shellcode o valori di catena ROP dopo la sovrascrittura.
  • La conversione dei byte nulli blocca il ROP. Il campo della GUI converte i byte nulli in spazi prima di copiarli nel buffer. Ogni indirizzo x64 contiene byte nulli nella metà superiore. Nessun indirizzo di gadget può essere posizionato sullo stack come valore di catena ROP: arrivano tutti corrotti.
  • Il DEP blocca l'esecuzione diretta. Anche se si trovasse un modo per raggiungere il buffer dello shellcode, il DEP è attivo e blocca l'esecuzione sullo stack.
  • La ricerca dei gadget è documentata integralmente. Il processo di estrazione dei gadget da ogni modulo caricato, il filtraggio per tipo e l'analisi del motivo per cui ogni gadget fallisce sono documentati passo dopo passo. Questa è la competenza fondamentale di cui ogni sviluppatore di exploit ha bisogno.
  • Viene spiegato lo scheletro della catena ROP per VirtualProtect. Gli studenti vedono esattamente cosa servirebbe per bypassare il DEP, perché la convenzione di chiamata è importante e perché questa specifica catena non può essere costruita dati i vincoli dell'input.

Scarica lo strumento


🔍 Contesto e software interessato

R è un ambiente di calcolo statistico e grafica disponibile per Windows, macOS e Linux. La vulnerabilità si trova nella finestra di dialogo delle Preferenze della GUI, in particolare nel campo Language for menus and messages, che copia l'input dell'utente in un buffer di stack a dimensione fissa senza validarne la lunghezza.

Dettagli tecnici chiave:

  • Tipo di vulnerabilità: Buffer overflow basato su stack
  • Versione interessata: R 3.4.4 x86_x64
  • Endpoint interessato: Edit -> GUI Preferences -> Language for menus and messages
  • Componente vulnerabile: gestore di input delle preferenze della GUI
  • Autenticazione richiesta: No (applicazione locale)
  • Impatto: x86 - Esecuzione di codice remota | x64 - Flusso di controllo confermato



⚠️ Sulla vulnerabilità

R 3.4.4 elabora il campo Language for menus and messages copiando la stringa fornita in un buffer di stack a dimensione fissa senza controllarne la lunghezza. Una versione semplificata della logica vulnerabile è questa:

root@kitploit:~
char language_buffer[256];

strcpy(language_buffer, user_input);

L'invio di una stringa sufficientemente lunga fa sì che la copia scriva oltre la fine del buffer, corrompendo lo stack fino a sovrascrivere l'indirizzo di ritorno salvato. Quando la funzione ritorna, la CPU carica il valore controllato dall'attaccante dallo stack in RIP e tenta di saltarci.

Su x64, Windows impone la validazione degli indirizzi canonici prima che avvenga qualsiasi salto. Un valore non canonico come 0x4141414141414141 innesca una violazione di accesso immediata prima che RIP venga caricato, il che significa che il crash appare diverso rispetto a x86, senza un netto RIP = 4141414141414141. L'offset deve essere trovato leggendo il pattern ciclico dallo stack dopo il crash piuttosto che direttamente da RIP.




💥 Come innescare il crash

Il crash può essere riprodotto incollando una lunga stringa nel campo della lingua. Non è richiesta alcuna autenticazione. Esempio di generazione del payload con Python:

root@kitploit:~
import struct

payload = b'A' * 400

with open('payload.txt', 'wb') as f:
	f.write(payload)
root@kitploit:~
Open R 3.4.4 x64
Edit -> GUI Preferences
Paste contents of payload.txt into Language for menus and messages
Click OK



💣 Sfruttamento

L'obiettivo di questo repository non è solo dimostrare il crash, ma guidare attraverso il processo di sfruttamento completo su entrambe le architetture, documentando cosa funziona su x86, cosa si rompe su x64 e, cosa più importante, perché.

Per mantenere pulito il README principale, le note dettagliate sullo sfruttamento, gli script e i passaggi del debugger sono inseriti nella cartella Vulnerability 📂 di questo repository, organizzati in sottocartelle separate per x86 e x64.

Lì troverai il flusso di lavoro completo per entrambe le architetture:

x86 - Sfruttamento completo:

  • Fuzzing del campo della lingua per identificare il crash.
  • Scoperta dell'offset per individuare la posizione esatta di EIP sullo stack.
  • Analisi dei caratteri dannosi (bad characters) per identificare i byte che corrompono il payload.
  • Individuazione di un gadget JMP ESP in stats.dll, un modulo compilato senza ASLR o SafeSEH.
  • Posizionamento ed esecuzione dello shellcode, ottenuta una reverse shell completa.
  • x64 - Controllo di RIP e analisi dello sfruttamento:

    • Configurazione di x64dbg per evitare interruzioni costanti da parte degli eventi di caricamento delle DLL.
    • Fuzzing del campo della lingua in tre fasi per trovare la dimensione esatta del crash.
    • Individuazione dell'offset di RIP leggendo il pattern ciclico dallo stack piuttosto che da RIP.
    • Conferma del controllo di RIP utilizzando una sovrascrittura di 6 byte con padding automatico di byte nulli.
    • Identificazione della conversione da byte nullo a spazio come vincolo fondamentale dell'input.
    • Estrazione dei gadget da tutti i moduli R caricati usando rp++ e filtraggio con PowerShell.
    • Analisi di ciascuna categoria di gadget, CALL RBX, CALL RSP, POP RSP, SUB RSP, PUSH RSP, e documentazione del motivo per cui ognuna fallisce in questo specifico contesto.
    • Spiegazione della struttura della catena ROP necessaria per chiamare VirtualProtect e bypassare il DEP, e del motivo per cui non può essere costruita dato il vincolo del byte nullo.
    • Documentazione del JOP come unico percorso teorico rimasto e del motivo per cui rimane una sfida aperta.