Il linguaggio Assembly è un basso Linguaggio di programmazione. I linguaggi di programmazione di basso livello sono
vicino al linguaggio macchina, non portatile e con quasi no astrazione. Per farvi capire python e ruby sono linguaggi di alto livello.

Il linguaggio assembly è uno strato intermedio tra codice macchina e (quasi) tutti i linguaggi di alto livello. Linguaggi di alto livello che richiedono una macchina virtuale (come JAVA) hanno un approccio diverso. La macchina virtuale viene eseguita
il codice e potrebbe convertirlo in Assembly quindi Machine codice in fase di esecuzione utilizzando un compilatore JIT (Just In Time
compilatore). JVM (Java Virtual Machine) è scritto in C ++

  • Ecco alcuni dettagli aggiuntivi sul principale caratteristiche :
    • Vicino al codice macchina ogni codice macchina è rappresentato da un’unica istruzione.
    • Non portatile: perché è vicino al codice macchina, il codice può essere utilizzato su quella specifica macchina. Se noi ne hai bisogno su un’altra macchina, avremo bisogno di riscrivere il codice!
  • Nessuna astrazione: ogni istruzione può essere direttamente convertito in un codice macchina a seconda del suo operando.
    Il linguaggio non fornisce oggetti, classi, riutilizzabili funzioni, o anche istruzioni di controllo o cicli. Tutto questo può essere ottenuto in assembly, ma con molto codice!

Ci sono molti linguaggi di programmazione di alto livello che fanno la vita degli sviluppatori è più facile e, per alcuni sviluppatori, questi
linguaggi rendono lo sviluppo di applicazioni un’arte e un divertimento. È molto più facile creare programmi di alto livello con questi  linguaggi, inoltre è più facile sia eseguire il debug che mantenere il costo e seguimento. Unico utilizzo ancora pratico è nel malware analisi, ma anche per driver o applicazione che lavorando tra hardware/kernel oppure parti di software specifiche.

Il linguaggio assembly è stato necessario per un tempo piuttosto lungo, per creare un codice ottimizzato per motivi di prestazioni.
Ma con i compilatori moderni forniti con intelligent e ottimizzatori, l’utilizzo di una lingua di basso livello è diminuito!

Come abbiamo detto, uno degli usi migliori è per:

  1. Reverse engineering del codice di un eseguibile esistente.
    • Trova una vulnerabilità e crea un exploit
    • Comprendere la funzionalità dell’eseguibile. (Per analisi malware, questo è ciò di cui abbiamo bisogno).

Durante il debug del software, miriamo al processo in esecuzione e dobbiamo capire il codice eseguibile (il codice macchina).
Leggere questo codice come istruzioni di assembly è molto più semplice che leggere sequenze di infiniti numeri esadecimali
( byte code). Imparare il linguaggio Assembly ci aiuterà a capire il comportamento di questo programma durante l’esecuzione a livello di CPU e memoria, stack, e con tale conoscenza possiamo deviare il codice durante esecuzione per prendere altri percorsi che soddisfano la nostra analisi. O ancora a livello di malware portarlo a decodificarlo in memoria e poi leggerlo.. in caso di packer o compressione.