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.

if left = right  (Quindi non c'è differenza) allora ZF è impostato.
if left < right allora CF è impostato.
if left > right allora niente è impostato perchè non c'è nessun resto.

Ora poniamo diversi esempi pratici:

cmp 10, 20    ; Imposta un Carry Flag perchè vright è maggiore di vleft
cmp 10, 10    ; Imposta un Zero Flag perchè la sottrazione tra questi valori è 0, quindi sono uguali

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:

cmp 10, 10    ; Imposta un Zero Flag perchè la sottrazione tra questi valori è 0, quindi sono uguali
cmp 10, 5     ; Sign Flag
cmp 10, 15    ; OverFlow

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.

JZ   ->  ZF E' IMPOSTATO
JNZ  ->  ZF NON IMPOSTATO
JO   ->  OF E' IMPOSTATO
JNO  ->  OF NON IMPOSTATO
JS   ->  SF E' IMPOSTATO
JNS  ->  SF NON IMPOSTATO
JC   ->  CF E' IMPOSTATO
JNC  ->  CF NON IMPOSTATO
JP   ->  PF E' IMPOSTATO
JNP  ->  PF NON IMPOSTATO

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:

        mov eax, 0
loop_start:
        add eax, 1
        cmp eax, 10
        jz _ok
        loop loop_start
_ok:
    ...

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

jmp whereyouwant

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:

JE salta se vleft = vright
JNE salta se vleft != vright
JL, JNGE salta se vleft < vright
JB, JNAE salta se vleft < vright
JLE, JNG salta se vleft ≤ vright
JBE, JNA salta se vleft ≤ vright
JG, JNLE salta se vleft > vright
JA, JNBE salta se vleft > vright
JGE, JNL salta se vleft ≥ vright
JAE, JNB salta se vleft ≥ vright

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.

Author: Neb

$whoami
Neb

$cat neb.txt

Keen on Computer Science, He always studies Computer Programming, Managment of Computer Systems and CyberSecurity (Offensive Side).
Have interest in experimental the use of new technologies. Co-founder of FreeNIX Security

My skills are:

Programming Skills:

– Web Development: JavaScript, PHP and HTML
– Desktop Application: Python3(Qt or GTK), C++(Qt)
– CLI Application: Python, C/C++, Crystal, Assembly and Rust

System Skills:

– Knowledge Unix Server System (CentOS, Ubuntu, Debian and BSD)
– Windows Server Administrator (AD, DC and many other)
– Virtualization with VMware, VirtualBox and Qemu

Network Skills:

– Indipendent Study of Routing and Switching

CyberSecurity Skills:

– Penetration Testing (Check Vuln):
– Exploitation
– Report

Location: Taranto, Apulia, Italy
Age: 18
Sex: Male