Posso inviare istruzioni incorporate in un'immagine a un target, se conosco la sua architettura della CPU?
Posso inviare istruzioni incorporate in un'immagine a un target, se conosco la sua architettura della CPU?
Altre risposte forniscono una buona spiegazione tecnica, ma fammi provare con un'analogia:
Invia il numero della tua carta di credito a scam@example.com
L'hai letto?
L'hai fatto?
È più o meno lo stesso per la tua CPU. Leggere qualcosa non è come eseguirlo.
Le istruzioni per la CPU sono fornite in quelli che vengono chiamati codici operativi e hai ragione che quelli vivono nella memoria proprio come la tua immagine. Tuttavia, vivono in "aree" di memoria concettualmente diverse.
Ad esempio, potresti immaginare un codice operativo "read" (0x01) che legge un byte di input da stdin e lo inserisce da qualche parte, e un altro operando "add" (0x02) che aggiunge due byte. Alcuni codici operativi possono accettare argomenti, quindi ne daremo alcuni al nostro esempio: il codice operativo "read" prende un operando per dove memorizzare il byte che legge, e quello "add" prende tre operandi: due per dove leggere i suoi input e uno per dove scrivere il risultato.
0x01 a1 // legge un byte nella posizione di memoria 0xa10x01 a2 // legge un byte nella posizione di memoria 0xa20x02 a1 a2 a3 // legge i byte nelle posizioni 0xa1 e 0xa2, aggiungili // e scrivi il risultato nella posizione 0xa3
Questo è tipico di come funzionano molte istruzioni: la maggior parte di esse opera solo sui dati che sono in memoria , e alcuni di loro inseriscono nuovi dati in memoria dal mondo esterno (dalla lettura di stdin, in questo esempio, o dalla lettura di un file o di un'interfaccia di rete).
Sebbene sia vero che le istruzioni e i dati su cui operano sono entrambi in memoria, il programma eseguirà solo le istruzioni. È compito della CPU, del sistema operativo e del programma assicurarsi che ciò avvenga. Quando falliscono, puoi infatti caricare i dati nello spazio di esecuzione, ed è un grave bug di sicurezza. Buffer overflow sono probabilmente l'esempio più famoso di un tale bug. Ma a parte questi tipi di bug, puoi essenzialmente pensare allo spazio dati e allo spazio di esecuzione come blocchi separati di CPU.
In un computer giocattolo, usando l'esempio sopra, la memoria potrebbe assomigliare a qualcosa di simile :
(loc) | Iniziale | Dopo op 1 | Dopo l'op 2 | Dopo l'operazione 3 | 0x00 | * 01 a1 | 01 a1 | 01 a1 | 01 a1 | 0x02 | 01 a2 | * 01 a2 | 01 a2 | 01 a2 |
0x04 | 02 a1 a2 a3 | 02 a1 a2 a3 | * 02 a1 a2 a3 | 02 a1 a2 a3 | 0x08 | 99 | 99 | 99 | * 99 | ... 0xa1 | 00 | 03 | 03 | 03 | 0xa2 | 00 | 00 | 04 | 04 | 0xa3 | 00 | 00 | 00 | 07 |
In questo esempio, l'asterisco ( *
) punta al successivo codice operativo che verrà eseguito. La colonna più a sinistra specifica la posizione di memoria iniziale per quella riga. Quindi, ad esempio, la seconda riga ci mostra due byte di memoria (con valori 01
e a2
) nelle posizioni 0x02 (esplicitamente nella colonna di sinistra) e 0x03.
(Per favore, comprendi che questa è tutta una grande semplificazione. Ad esempio, in un vero computer la memoria può essere intercalata - non avrai solo un pezzo di istruzioni e un pezzo di tutto il resto. dovrebbe essere abbastanza buono per questa risposta, però.)
Nota che mentre eseguiamo il programma, la memoria nelle aree 0xa1 - 0xa3 cambia, ma la memoria in 0x00 - 0x08 no. I dati in 0x00 - 0x08 sono l'eseguibile del nostro programma, mentre la memoria nelle aree 0xa1 - 0xa3 è la memoria che il programma usa per fare il crunch dei numeri.
Quindi, per tornare al tuo esempio: i dati nel tuo jpeg verrà caricato nella memoria dagli opcode e sarà manipolato dagli opcode, ma non sarà caricato nella loro stessa area in memoria. Nell'esempio sopra, i due valori 0x03 e 0x04 non erano mai nell'area del codice operativo, che è ciò che esegue la CPU; erano solo nell'area da cui leggono e scrivono i codici operativi. A meno che tu non abbia trovato un bug (come un buffer overflow) che ti consente di scrivere dati in quello spazio del codice operativo, le tue istruzioni non verranno eseguite; saranno solo i dati che vengono manipolati dall'esecuzione del programma.
Puoi inviarli? Sì, naturalmente. Basta assemblarli e incollarli da qualche parte nel file immagine.
Il target li eseguirà? No, a meno che tu non abbia già il controllo sulla destinazione (e puoi quindi mettere un programma lì per leggerli ed eseguirli), o trovi qualche exploit in un visualizzatore di immagini e fai caricare l'immagine al suo interno.
Potresti farlo se il tuo target usasse una versione di Internet Explorer precedente all'agosto 2005 per visualizzare un JPG. O se stavano per aprire un PNG in Windows Media Player su Windows 98 senza aggiornamenti di sicurezza installati. E così via.
C'erano molti vecchi software che avevano dei bug in cui, se si creava un file immagine in cui la prima parte del file immagine mentiva in modo oltraggioso sulla dimensione e la posizione del pixel dati nel file, il software potrebbe fare qualcosa di sbagliato e saltare accidentalmente al codice all'indirizzo sbagliato o scrivere dati dal file in un punto in cui dovrebbe essere il codice del programma. Ricordo che uno di questi hack riguardava un file la cui intestazione sosteneva che l'immagine avesse dimensioni negative. Probabilmente non puoi farlo con le versioni più recenti di Internet Explorer o Edge, perché ora tutti conoscono il problema e Microsoft ha fatto del suo meglio per risolverlo.
I sistemi operativi odierni hanno alcune misure protettive in atto per rendere difficile (ma non del tutto impossibile) ottenere qualcosa di veramente brutto se trovi un nuovo modo per hackerare un programma usando un metodo come questo. È possibile impostare aree di memoria in modo che non possano essere eseguite. I programmi hanno spazi di indirizzi virtuali separati in modo che non possano accedere accidentalmente alla memoria reciproca. Alcuni componenti del sistema operativo vengono caricati in posizioni di memoria imprevedibili, quindi non è semplice per il codice dannoso trovarli e utilizzarli.
No. I file immagine come i file JPEG non eseguono codice, vengono semplicemente renderizzati e visualizzati.
Se vuoi nascondere alcune informazioni in un file chiamato Steganography, ma che nasconde solo informazioni, non lo fa eseguire qualsiasi istruzione.
Affinché un file possa eseguire codice deve essere un eseguibile o essere eseguito da un altro programma che legge il file, quindi esegue i comandi nel file.
In questo caso, il raro caso in cui un'immagine potrebbe provocare l'esecuzione del codice è se ci fosse un bug nel software che ha reso l'immagine in base al file. Questo è successo in passato, ma è estremamente raro. Per tutti gli scopi pratici un'immagine non può eseguire istruzioni.
Questo ovviamente non è il caso di PDF, Adobe Flash, ecc.
Puoi, SE sai anche quale stack software toccherà l'immagine sul lato ricevente E SE ci sono vulnerabilità di sicurezza irrisolte in quello stack software.
Il semplice inserimento delle istruzioni nel file JPEG non fa nulla.
Tuttavia, se esiste un modo noto per far sì che una certa implementazione esatta del lettore JPEG si blocchi in un modo su un file JPEG non valido che copierà i dati dal file immagine a cui quei dati non appartengono (come, in cima a variabili che contengono informazioni sul flusso di controllo del programma come puntatori a funzione o indirizzi di ritorno), e se le contromisure a livello di sistema operativo o hardware (ad esempio DEP) non si fermano che dal momento che accada, c'è una possibilità realistica. Tali vulnerabilità sono esistite (ed esistono in legacy) implementazioni del mondo reale.
La versione breve è no, perché i computer (DOVREBBE) conoscono la differenza tra dati e istruzioni. Il peggio che DOVRESTI essere in grado di fare con un JPEG è qualcosa come una zip-bomb o qualcosa che blocca alcune routine di decompressione JPEG. Un programma per caricare & mostra un JPEG non tenterà di eseguire nessuno dei dati nel file, ma solo di leggerlo ed elaborarlo - e se colpisce alcuni dati inaspettatamente non jpeg si fermerà o si bloccherà, o mostrerà semplicemente un immagine davvero incasinata.
TUTTAVIA, a volte (ti sto guardando, Microsoft) le persone cercano di scrivere software utile che può essere vulnerabile (ad esempio) tentando di caricare automaticamente & visualizzare allegati di posta elettronica , creare formati di documenti che possono contenere script / macro, ecc. ed è qui che un file dannoso può causare danni.
L'esempio classico (e ora si spera defunto / protetto contro) sono gli allegati di posta elettronica chiamati qualcosa come .jpg.exe
dove il file è realmente un eseguibile e Windows lo tratterà come tale, ma poiché Windows nasconde l'estensione (nascondendo l'ultima parte .exe) le persone vedi file.jpg
e fai clic su di esso, facendo in modo che il sistema operativo lo esegua.
È la differenza tra leggere un libro e recitare o ut il contenuto del libro - se il libro dice "vai a prendere a pugni qualcuno" non lo farai, perché le parole (dati) nel libro non controllano il tuo cervello anche se il tuo cervello elabora quei dati.