ShellFl0w – Assembly: Th3_Rubb!t_Jump

Introduzione

Bene, siamo quasi alla fine della parte dedicata ad Assembly di questo capitolo: C_Ass3mbly.sh,  in questo articolo approfondirò alcuni concetti che sono stati espressi in precedenza e poi tratteremo delle strutture di controllo, come funzionano e quando inserirle.
A fine di questo capitolo, arriveranno i video che ritratteranno queste nozioni e probabilmente ci saranno anche delle esclusive.

Strutture di Controllo

Grazie ai linguaggi di alto livello come C/C++, Java e Python sappiamo quelle che sono le strutture di controllo o condizionali, in assembly non ci incontreremo con queste, ma con i suoi antenati (i goto ad esempio), la logica che definisce l’utilizzo di questi è data dal programmatore e dipenda da esso il suo corretto funzionamento, un po’ come tutto il linguaggio Assembly.

Comparazioni

Le strutture di controllo ragionano in base alla comparazione dei dati, ossia la sottrazione tra due operandi di quale il risultato di questa operazione determina un risultato estrapolato dal registro FLAGS (Ricorda, il risultato non viene memorizzato da nessuna parte), questo contiene al suo interno molte varianti che possono essere prese in considerazione in base al risultato ricevuto.

Per gli interi senza segno:

ci sono 2 flag (bit nel registro FLAGS) che sono importanti: lo Zero flag (ZF) e il carry flag . Lo Zero flag e’ settato se la differenza risultante e’ 0. Il carry flage’ usato come flag di prestito nella sottrazione.
cmp left, right: grazie al risultato possiamo constatare che flag restituisce.

Ora poniamo diversi esempi pratici:

Per gli interi con segno:
Ci sono tre flag importanti: Lo Zero Flag (ZF), OverFlow Flag (OF) e lo Sign Flag (SF):

  • Lo Zero Flag rimano lo stesso come nell’esempio precedente.
  • L’Overflow Flag è impostato quando c’è un caso di OverFlow o UnderFlow.
  • Il Sign Flag invece se il risultato dell’operazione è negativo.

Vediamo diversi esempi pratici anche qua:

Perchè cmp 10, 10 restituisce 0? Beh perchè chiaramente 10 – 10 = 0, quindi se è 0 allora è un Zero flag. Mentre cmp 10, 5 quindi 5 – 10 restituisce -5 quindi numero negativo quindi Sign Flag.

Noi prendiamo come punto di riferimento cmp, ma non è l’unico che possiamo utilizzare per le comparazioni.

Con i jump noi possiamo decidere a quale parte del codice saltare e volendo possiamo creare delle iterazioni, giusto per fare un esempio vediamo sto codice:

Ora abbiamo visto quelli che sono i jump condizionati, ossia quei jump che dato un cmp eseguirà una determinata azione, ecco un esempio di jump non-condizionato

Questi sono gli “opcode” che possiamo utilizzare quando dobbiamo specificare la condizione del jump, nel codice precedente noi abbiamo impostato che se nella comparazione avessimo ottenuto un Zero Flag, allora si avrebbe ottenuto un jump, prendendo lo stesso codice, ci si può divertire nel:

Per quanto possa sembrare difficile, Assembly non è un linguaggio difficile ma la parte cruciale di questo è l’organizzazione, in fatti se si impara realmente come funziona questo linguaggio e in generale come un computer funziona, non è impossibile dedicarsi a questo senza troppi problemi, come sempre consiglio di approfondire questi argomenti.



Leave a comment