ShellFl0w – Assembly Hack (x64)

Assembly Hack (x64):

Introduzione:

Molto spesso ci viene riferito che per “bucare” un sistema computazionale, bisogna fare l’uso degli Exploit.
Vero, in molti casi l’utilizzo di questi porta ad un vantaggio niente male.
ShellFl0w non vi insegna a utilizzare gli exploit, in quanto sarebbe banale.

Dai un pesce a un uomo e lo nutrirai per un giorno. Insegnagli a pescare e lo nutrirai per tutta la vita.

Questo aforisma è l’esatto ragionamento che dobbiamo intraprendere, in quanto solo grazie alle nostre conoscenze siamo in grado di costruire un piano per sfruttare una vulnerabilità, ergo impareremo insieme come si programmano gli Exploit e quale pensiero sviluppare, la scrittura di exploit richiede delle conoscenze non poco banali in campo di programmazione, appunto per questo scriveremo del codice Assembly, con l’assembler NASM.

Divertiamoci con Assembly:

NASM, o Netwide Assembler, è un software libero Intel x86 assembler che può essere usato per scrivere programmi a 16 bit, 32 bit (IA-32) ed a 64 bit (x86-64). Faremo utilizzo di questo!

in primis scriviamo quello che è il nostro codice, per ora basta copiare ed incollare.
ALERT: Lavoro qui con il registro 64 bit, e su Linux, su altre architetture software potrebbero esserci problemi

section .data
msg db "Hello, World!",10
section .text
global _start

_start:
mov rax, 1
mov rdi, 1
mov rsi, msg
mov rdx, 16
syscall

mov rax, 60
mov rdi, 0
syscall

Passaggio 1:
——————————————————————————-
section .data
msg db "Hello, World!",10

——————————————————————————-
msg è il nome assegnato all’address in memory, qual’ora noi chiamassimo “msg” otteremo la sua posizione.

db è Define Byte, significa che definiamiamo alcuni raw bytes di dati da inserire poi nel codice.

“Hello,  World!” sono i bytes di dati che abbiamo definito

il “,10” finale è incluso nel bytes di dati definiti, e sta ad indicare una new line (Una nuova linea, a capo essenzialmente)

Passaggio 2:

Per ora siamo interessati solo a log interi e registri xmm. Dovresti già sapere quali sono i registri, ma ecco una breve recensione. I 16 registri pieni sono 64 bit larghi e sono chiamati:

R0  R1  R2  R3  R4  R5  R6  R7  R8  R9  R10  R11  R12  R13  R14  R15
RAX RCX RDX RBX RSP RBP RSI RDI

Quando scriviamo del codice assembly possiamo decidere di accedere a dei registri, più grande è l’architettura di sistema, più grandi sono i registri.
I Registri sono parte del processore che temporanemante detiene la memoria, nelle architettire x86_64, i registri detengono 64 bits.
Più avanti chiaramente lavoreremo con le restanti architetture, che ci torneranno utili.

Passaggio 3:

Programmi in memoria

Quando i processi sono caricati dentro la memoria, essi di solito vengono divisi in piccoli sezioni. Infatti, esisono sei sezioni principali che alcuni verrano trattati in questo articolo, altri più avanti.

.text Section
The .text section in base corrisponde alla .text portion di un file eseguibile binario.
Contiene le istruzioni che la macchina che dovrà eseguire.

.data Section
La .data section contiene i valori delle “variabili” inizializzate.
nel nostro caso: msg

Passaggio 4:

syscall
Una system call, oppure una syscall, è quando un programma richiede un servizio dal kernel. I system calls variano tra i sistemi operativi per ovvi motivi, ogni sistema operativo diverso, usa un diverso kernel.

Tutti i syscalls hanno un ID associato con un numero.

Se siete interessati (e dovreste) vi consiglio la lettura della lista delle syscall, che si può facilmente reperire su internet, ma magari ci faccio un articolo apparte, a fine capitolo.

Passaggio Finale:

In questo caso faremo uso di una syscall (sys_write) che ci permetterà di visualizzare una stringa, quindi un output di una “variabile”, ergo printare.

mov rax, 1
mov rdi, 1
mov rsi, msg
mov rdx, 16
syscall

Questa porzione di codice, segue questa logica:
1] Nel registro: “rax“, inseriremo l’ID della syscall interessata, in questo caso: sys_write che ha come ID: 1, quindi rax == 1.
2] Nel registro: “rdi“, inseriremo il primo argomento del file_descriptor, abbiamo queste possibilità: 0,1,2; Per 0 si indica lo standard d’input, per 1 per standard output, per 2 lo standard error. Chiaramente l’errore, o il pensiero logico dell’errore (cosa si intende per errore) viene definito dal programmatore. In questo caso inseriremo 1, perchè il nostro interesse è l’output.
3] Nel registro: “rsi“, inseriremo il “buffer”, in questo caso la nostra stringa: msg.
4] Nel registro: “rdx“, il cosiddetto: “count”, ossia la lenght del buffer (msg), specifichiamo “16” ovvero la quantità di byte da stampare (msg + 15, ossia l’ultimo byte che stamperà)
5] Chiuderemo con syscall, alla chiamata al kernel.

mov rax, 60
mov rdi, 0
syscall

Questa porzione di codice si occupa del ret, ossia del classico return che possiamo vedere in C:
1] Nel registro: “rax“, inseriremo l’ID (60) equivalente a sys_exit, per uscire.
2] Come parametro della syscall, in “rdi” inseriremo 0 in quanto non abbiamo nessun error code.

global _start

_start:

Questo è molto importante al nostro programmma, in maniera arrangiata diciamo che l’assembler analizza e cerca di trovare _start in quanto, grazie ad esso sa esattamente dove partire, ossia da codesto label!
in global _start serve per lo appunto questo servizio, permette la globalizzazione del label.

┌─[freenix@sec]─[~]
└──╼ $ nasm -felf64 code.asm // Assembliamo
┌─[freenix@sec]─[~]
└──╼ $ ld code.o -o result   // Linkiamo
┌─[freenix@sec]─[~]
└──╼ $ ./result              //Eseguiamo
Hello world!

Nei prossimi articoli entreremo sempre nel dettaglio, per ora ci acconentiamo di questa base.

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