giovedì 9 dicembre 2010

Scrivere lo shellcode

Nella scrittura dello shellcode bisogna rispettare alcune regole e utilizzare vari espedienti, requisito essenziale è che lo shellcode deve essere autonomo e non contenere byte null poichè questo fatto farebbe terminare la stringa.Ovviamente per poter scrivere shellcode bisogna conoscere il linguaggio assembly, per il processore x86 vi sono due tipi di sintassi la AT&T e la sintassi intel, probabilmente quest'ultima è più leggibile.In linux i programmi assemblatori che adottano la sintassi AT&T sono chiamati "gas", mentre quelli che adottano la sintassi intel sono chiamati "nasm".Abbiamo già visto alcuni registri del microprocessore quali EIP,ESP,EBD essi per il linguaggio assembly possono essere considerati delle variabili, anche se in generale non è opportuno utilizzarli come variabili di uso generale .I registri EAX,EBX,ECX,EDX,ESI,EDI sono molto più adatti allo scopo. Si tratta di registri a 32 bit, tuttavia è possibile accedere ad essi anche a piccoli blocchi utilizzando una diversa notazione.In generale la sintassi tipica del linguaggio nasm è la seguente:

istruzione <destinazione>, <origine>

Ora vediamo qualche istruzione utile nella costruzione dello shellcode:

mov -Utilizzata per impostare i valori iniziali.
add -Aggiunge il valore.
sub -Sottrae il valore.
push -Inserire valori nello stack.
pop  -Recupera valori dallo stack.
jmp -Modifica EIP impostando un determinato indirizzo.
call -Richiama una funzione, inserendo un indirizzo in EIP e un indirizzo di ritorno nello stack.
lea -Aquisisce l' indirizzo di una porzione di memoria.
int -Richiama interrupt.

Oltre alle istruzioni in assembly i vari sistemi operativi mettono a disposizione del programmatore una serie di funzioni facilmente richiamabili dall' assembly, esse sono le "chiamate di sistema" e vengono innescate tramite interrupt, in linux nel file /usr/include/asm/unistd.h è presente una lista delle chiamate di sistema,queste funzioni comprendono funzioni sui files , funzioni sulle directory e funzioni sui processi.Utilizzando le istruzioni che ho elencato e le chiamate di sistema è possibile scrivere bytecode in grado di svolgere svariate funzioni, e ne prossimi articoli ne vedremo qualche esempio.Intanto se intendete approfondire l 'argomento "linguaggio assembly" ho da consigliarvi un ottimo corso che potete scaricare da questo indirizzo http://www.manuali.net/manuali/intro/programmazione/corso_assembly_x86_2.html

Nessun commento:

Posta un commento