ShellFl0w – Assembly: Th3_Rubb!t_Jump
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 <strong>left = right</strong> (Quindi non c‘è differenza) allora ZF è impostato. if <strong>left < right</strong> allora CF è impostato. if <strong>left > right</strong> 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.
1 2 3 4 5 6 7 8 9 10 |
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:
1 2 3 4 5 6 7 8 9 10 |
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.
Source: https://www.freenixsecurity.net/it/2017/11/29/shellfl0w-assembly-th3_rubbt_jump/
Se vuoi sostenerci, puoi farlo acquistando qualsiasi cosa dai diversi link di affiliazione che abbiamo nel nostro sito o partendo da qui oppure alcune di queste distribuzioni GNU/Linux che sono disponibili sul nostro negozio online, quelle mancanti possono essere comunque richieste, e su cui trovi anche PC, NAS e il ns ServerOne. Se ti senti generoso, puoi anche donarmi solo 1€ o più se vuoi con PayPal e aiutarmi a continuare a pubblicare più contenuti come questo. Grazie!
Hai dubbi o problemi? Ti aiutiamo noi!
Se vuoi rimanere sempre aggiornato, iscriviti al nostro canale Telegram.Se vuoi ricevere supporto per qualsiasi dubbio o problema, iscriviti alla nostra community Facebook o gruppo Telegram.
Cosa ne pensi? Fateci sapere i vostri pensieri nei commenti qui sotto.
Ti piace quello che leggi? Per favore condividilo con gli altri.