Breve introduzione alla programmazione in Assembly sotto Linux |
|
|
18/05/2000 |
by "Ritz" |
|
|
Published by Quequero |
|
|
||
| UIC's form |
|
UIC's form |
Difficoltà |
(X)NewBies ( )Intermedio ( )Avanzato ( )Master |
Siete stufi del solito Windoze asm? Bene, è venuto il momento di migrare a Linux e provare a vedere da lì cosa si può fare di bello con questo linguaggio.
NOTA INTRODUTTIVA: molto di questo materiale lo potere trovare sul Linux Assembly HOWTO (prelevabile da linuxassembly.org): questo testo ne rappresenta un breve riassunto e riadattamento in italiano con alcune aggiunte.
Introduzione |
In questo tute cercherò di introdurre alla programmazione in asm da Linux, spiegando soprattutto i punti fondamentali e le differenze dal Win.
Essay |
Questi tute dovrebbero iniziare con frasi del tipo "Linux ormai è un sistema operativo che rappresenta una valida alternativa..." bla bla bla, ma queste cose non penso che vi interessino troppo, visto che se state leggendo questo testo significa che usate già Linux e vi interessa iniziare a programmare in asm pure da qui, o quantomeno siete interessati all'argomento.
Per "introduzione" all'asm coding under Linuz non intendo una spiegazione dalle *basi* dell'asm, cose tipo architettura dei processori x86 e loro set di istruzioni devono già essere nel drive hda di chi legge. Similmente, non starò qui a spiegare i motivi per cui in Linux bisognerebbe programmare in asm quando esso è basato (+ di Win) su altri linguaggi, C in primis. Btw, come per ogni SO la programmazione in asm al 90% non è una questione di necessità (salvo casi particolari naturalmente), besì una scelta che si fa per passione e curiosità personale, certo usare l'asm per fare *ogni* cosa sarebbe alquanto scomodo e lungo, anche se i risultati finali sarebbero eccellenti.
Fatta questa pallosa premessa, iniziamo a vedere un po' di cosette per programmare in asm sotto tale sistema.
First of all, ci serve un compilatore (a meno di non andare avanti a scrivede opcode con BIEW;) ), quelli più usati sono 2, il GAS e il NASM (oltre al GCC che permette di inserire codice asm all'interno di un file c).
In GAS (GNU Assembler), scaricabile da ftp://ftp.varesearch.com/pub/support/hjl/binutils/, è stato progettato inizialmente come compilatore 32 bit sotto unix, il che comporta una particolarità: esso utilizza la sintassi AT&T, e non quella Intel, e qui possono essere dolori per uno che ha già programmato in asm sotto Win32 o DOS. Infatti, una delle regole di tale sintassi è che il registro di destinazione in un'istruzione deve essere SEMPRE il secondo... se infatti noi volessimo copiare ebx in eax non dovremmo scrivere mov eax, ebx, bensì mov ebx, eax... e questo fatto potrebbe esser fonte di casini per i primi tempi. Altre peculiarità di tale sintassi sono:
- Il nome dei registri è preceduto da "%" (es. mov %ebx, %eax) per poter includere simboli c nel codice senza far confusione.
- La lunghezza dell'operando va posposta all'istruzione che opera su di esso. Ad esempio, per copiare bx (word) in ax (word) si scriverà movw %bx, %ax, per il byte si usa la lettera b, per la dword la lettera l.
- Ogni operando immediato va posposto al simbolo "$" (quello di Bill Gate$), ad esempio addl $5,%eax.
- Non mettere un prefisso a un operando indica che è un indirizzo di memoria. Es. movl $ciao,%eax muove l'offset di ciao in eax, mentre movl ciao,%eax muove il contenuto di ciao (la dw da esso puntato) in eax.
Come vedete la cosa è abbastanza incasinata, e nonostante esista un prog in grado di convertire la sintassi Intel in AT&T in Intel (ftp://x2ftp.oulu.fi/pub/msdos/programming/convert/ta2asv08.zip) io stesso sono più propenso per una NASM-like syntax.
Infatti, il compilatore dove ci si sente più a proprio agio nel linux asm coding è il NASM, Netwide Assembler, che probabilmente è pure il + usato. Lo si trova a http://www.cryogen.com/Nasm/, la versione più recente è la 0.98. Esso supporta vari formati di file, cmq a noi interessa la versione per linux, ovvero quella che genera gli ELF.
Esistono anche altri compilatori (es. AS86), cmq sono meno utilizzati dei quelli suddetti;).
Per quanto riguarda la programmazione tramite macro... sia il GAS che il NASM supportano il macroprocessing, per il 1° esiste il GASP, che aggiunge proprio delle macro al linguaggio, e pue il NASM le supporta (fare riferimento ai docz scaricabili dal sito relativo). Esistono poi altri tool o compilatori come AS86, CPP, M4, Tunes project, ecc... che però non ha senso analizzare uno per uno, visto che potranno semmai essere utili in seguito.
Per il linker, invece, non ci sono problemi, in quanto quello + usato è ld, disponibile in quasi tutte le distribuzioni di Linux.
Come introduzione penso che possa andar bene, se volete maggiori info leggete il Linux Assembly HOWTO di Konstantin Boldyshev e François-René Rideau. Ecco di seguito una raccolta di link molto interessanti al riguardo.
Ed ecco ora una bella lista di libri da leggere 4 phun & prophit (divertitevi gente;) )
IA32 (x86):
sandpile.org, Intel,
AMD, Cyrix, x86 bugs
Alpha: Digital Alpha papers,
Digital
Documentation Library, more
manuals
SPARC: SPARC International Standard
Documents Repository
MIPS: MIPS Online Publications Library
PPC: Beginners Guide to
PowerPC Assembly Language
The Art Of Assembly Language ;penso che tutti prima o poi la debbano leggere:).
Progetti vari:
NASM
BIEW ;lo HIEW di Linux
UPX ;packer
Intel2gas ;lo dice il nome =)
A2I ;AT&T to Intel
Assembly Programming Journal ;the
unexpected calssic:))
Note finali |
Spero che molti, leggendo questo breve essay, si siano interessati alla programmazione a basso livello soto Linux, che penso sia molto interessante, forse proprio per il fatto che è un terreno ancora poco esplorato. Se siete interessati all'argomento, scrivetemi una mail: nel caso la cosa riscuota un certo "successo" avrei in mente di creare una mailing list italiana al riguardo.
Dal canto mio, cercherò di scrivere alcuni tute al riguardo, il prossimo molto probabilmente avrà un sorgente di un classico prog. compilabile col NASM in versione Linux e FreeBSD.
Ciauzz a tutti,
@2000 by Ritz
Disclaimer |
| UIC's page of reverse engineering, scegli dove andare: |
| Home Anonimato Assembly CrackMe ContactMe Forum Iscrizione |
| Lezioni Links Linux NewBies News Playstation |
| Tools Tutorial Search UIC Faq |
| UIC |