Skip to content
KitploitKITPLOIT
StrumentiExploitsBlog
Log in
Invia
StrumentiExploitsBlog
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
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
126 mesi faNon ancora revisionato

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

🐞 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.



🔍 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:

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:

import struct

payload = b'A' * 400

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



Scarica lo strumento