Breve introduzione alla programmazione in Assembly sotto Linux


18/05/2000

by "Ritz"

 

 

UIC's Home Page

Published by Quequero


Il tute di Ritz � un ottimo preludio per tutti coloro che volessero iniziare a programmare in ASM su Linux, Ritz inoltre vi parla di converitori: sintassi intel->AT&T, beh, per quanto utili vi possano sembrare, cercate di smanettare il pi� possibile con la sintassi AT&T pura, ve lo consiglio caldamente per due motivi:
1) Si migliora in modo piuttosto corposo la vostra elasticit� mentale con i vari linguaggi....E credetemi, � davvero tanto! Forse � la dote che TUTTI i reverser DOVREBBERO avere!
2) Il GDB (GNU Debugger) vi restituisce i listati in Assembly con sintassi AT&T quindi meglio imparare tale sintassi scrivendola piuttosto che confondendosi le idee al momento del debugging....Reverser avvisato..............
 
UIC's form
E-mail: [email protected] 
IRC chan: #crack-it
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 alla programmazione in Assembly sotto Linux
Written by Ritz

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.

 

linuxassembly ;bellissimo sito di asm sotto linux con vari doc e tool (spec. le asmutils)
libASM ;libreria e routine varie
ELF kickers
Alpha Linux BLAS ;algebra subroutines
cpuburn ;CPU loading utilities
ASMIX ;unix utilities scritte in GAS
smallutils ;altre utiliti in GAS per x86 e Sparc
Jan's Linux & Assembler HomePage ;asm coding con le libc
mailto:[email protected] per iscriversi alla ml
 

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

Queste informazioni sono solo a scopo puramente didattico. Non mi assumo alcuna responsabilit� se con volstro Alpha nuovo di zecca riuscite a compilare solo listati per x86. Se cos� fosse, rivolgetevi al rivenditore di fiducia;)).

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