Altro Imparare Assembly

Dany_Glitch33

Utente Electrum
20 Aprile 2020
628
14
124
153
Ciao a tutti, stavo leggendo Hacking: The Art Of Exploitation di Jon Erickson e nella parte di introduzione al C parla anche di x86 Assembly, con lo stile Intel. Qualcuno potrebbe indicarmi una guida o un altro libro da seguire (magari più moderno) per capirlo meglio, almeno le basi? Grazie.
 
  • Mi piace
Reazioni: mattstack
In rete trovi la guida di RaMsoft, anche se tratta per lo più 8086.
Se vuoi iniziare da x86 - e forse è il caso ormai - ci sono alcune risorse.
Per citarne 2: Assembly Language for X86 Processors e Modern X86 Assembly Language Programming: 32-bit, 64-bit, SSE, and AVX.

Qualche altra risorsa: https://www.cs.virginia.edu/~evans/cs216/guides/x86.html e https://riptutorial.com/x86
Se cerchi trovi altro.

Devi però decidere subito su quale OS smanettare, perchè cambiano tutte le chiamate alle API, ovviamente.
Come assemblatori sotto Windows ti direi di utilizzare MASM, e sotto Linux NASM (ma ce ne sono molteplici).
 
In rete trovi la guida di RaMsoft, anche se tratta per lo più 8086.
Se vuoi iniziare da x86 - e forse è il caso ormai - ci sono alcune risorse.
Per citarne 2: Assembly Language for X86 Processors e Modern X86 Assembly Language Programming: 32-bit, 64-bit, SSE, and AVX.

Qualche altra risorsa: https://www.cs.virginia.edu/~evans/cs216/guides/x86.html e https://riptutorial.com/x86
Se cerchi trovi altro.

Devi però decidere subito su quale OS smanettare, perchè cambiano tutte le chiamate alle API, ovviamente.
Come assemblatori sotto Windows ti direi di utilizzare MASM, e sotto Linux NASM (ma ce ne sono molteplici).
Grazie per le risorse, sono su Linux quindi potrei usare NASM.
 
su linux non si usa nasm. ma gcc / gas (binutils), sintassi at&t.
---
ops post vecchio scusate, visto dopo
 
:) no problem, si vedo che c'e'

assembly per x86 onestamente bello ma resta un gioco, scritto un client email intiero a suo tempo,
appunto per gioco didattico.

Invece in ambiente linux, assembly e' usato spesso nelle prime fasi di boot,
un po' in tutte le architetture,
anche nei bootloader, per determinate operazioni che in C non si possono fare.

comodissimo anche inline assembly con gcc.

i sorgenti del kernel sono un ottima scuola.
 
Si per l'accesso ad alcuni registri o certe istruzioni, suppongo.
Personalmente non mi sono mai trovato bene ad usare asm inline con GCC... ma probabilmente è dovuto alla comodità di utilizzarlo inline con MSVC, dove è di fatto come scrivere in MASM.

Bell'impresa un client email. Io mi sono fermato a cose più semplici: il parse del PE header e un parser per BMP, con tanto di applicazione di alcuni "filtri" (grayscale, color inversion e altro).
 
Personalmente non mi sono mai trovato bene ad usare asm inline con GCC... ma probabilmente è dovuto alla comodità di utilizzarlo inline con MSVC, dove è di fatto come scrivere in MASM.
si non e' immediato da capire, anche perche quando passi variabili al blocco assembly la sintassi cambia lievemente % = %% etc .
Bell'impresa un client email. Io mi sono fermato a cose più semplici: il parse del PE header e un parser per BMP, con tanto di applicazione di alcuni "filtri" (grayscale, color inversion e altro).
mah si, roba fatta molti anni fa su windows, prima che mi venisse la passione per linux. Alla fine, erano quasi tutte "call" alle api win32, nulla di che , piu tanto codice che altro.
 
si non e' immediato da capire, anche perche quando passi variabili al blocco assembly la sintassi cambia lievemente % = %% etc .

Eh infatti, guarda invece questa:
C:
#include<stdio.h>

#define   LEN    12

int main() {
  int vect1[LEN] = {1,2,3,4,5,6,7,8,9,10,11,12};
  int vect2[LEN] = {1,2,3,4,5,6,7,8,9,10,11,12};

  int res_vect1[LEN];
  
  int i = 0;
  
  __asm
  {
    lea      eax, vect1
    lea      ebx, vect2
    xor      ecx, ecx

    _while:
    cmp      ecx, LEN * 4
    jge      _end
    
      movups   xmm0, [eax + ecx] 
      movups   xmm1, [ebx + ecx]
    
      addps    xmm0, xmm1                 
      movups   [res_vect1 + ecx], xmm0     
      
      add      ecx, 4
      jmp      _while
    
    _end:
  
  }

  printf("Sum:\n\tV = (");
  for(; i<LEN; i++) {
    printf("%d, ", *(res_vect1+i));
  }
  printf("\b\b)\n");

  return 0;
}

mah si, roba fatta molti anni fa su windows, prima che mi venisse la passione per linux. Alla fine, erano quasi tutte "call" alle api win32, nulla di che , piu tanto codice che altro.
Applicazione GUI o no? Altrimenti avrai avuto 100 righe già per creare la finestra e gestire 2 eventi di base.

Io al contrario negli ultimi anni ho accantonato un pò Linux, lo uso solo come OS per lavoro. Prima però ho utilizzato per qualche anno Arch, che ho sempre adorato.
 
Ultima modifica da un moderatore:
Applicazione GUI o no? Altrimenti avrai avuto 100 righe già per creare la finestra e gestire 2 eventi di base.
era un app che usava le finestre/dialog di base delle api win32, parlo dei tempi di xp, si figuriamoci se mi mettevo a creare io le finiestre non finivo piu. :) Avevo acquistato tasm5.0 32bit, che ho ancora qui in una scatola :)

Io lavoro nel kernel, per me linux e' il pane quotidiano, roba m$ qui casa mia tutta bandita ormai da oltre 20 anni, per altro visto il tuo avatar forse ci siamo gia visti in altro forum :) Dopo tanti anni di debian unstable, ora uso Arch e void sul portatile.
 
  • Mi piace
Reazioni: DispatchCode
era un app che usava le finestre/dialog di base delle api win32, parlo dei tempi di xp, si figuriamoci se mi mettevo a creare io le finiestre non finivo piu. :) Avevo acquistato tasm5.0 32bit, che ho ancora qui in una scatola :)

Io lavoro nel kernel, per me linux e' il pane quotidiano, roba m$ qui casa mia tutta bandita ormai da oltre 20 anni, per altro visto il tuo avatar forse ci siamo gia visti in altro forum :) Dopo tanti anni di debian unstable, ora uso Arch e void sul portatile.

Si con quella di base saranno 60 righe, più o meno.
Quello che scrissi io - direi 7-8 anni fa - faceva questo:
Immagine di partenza:
68747470733a2f2f6269746275636b65742e6f72672f7265706f2f4d426f64424d2f696d616765732f323435323436343236312d74696765722e706e67


Alcuni filtri:

68747470733a2f2f6269746275636b65742e6f72672f7265706f2f4d426f64424d2f696d616765732f333532323132303132382d6f75747075742e706e67


68747470733a2f2f6269746275636b65742e6f72672f7265706f2f4d426f64424d2f696d616765732f333131313037323739342d6f75747075742e706e67


68747470733a2f2f6269746275636b65742e6f72672f7265706f2f4d426f64424d2f696d616765732f333735343338323433312d6f75747075742e706e67

Il codice è pietoso (non ottimizzato, e per non usare la FPU usavo operazioni su interi che si avvicinavano al risultato ma con un margine di errore, trovi un commento scritto in una specie di inglese), ma lo trovi qui.


Btw si, sono sempre io: stesso nick e stesso avatar. Ho avuto la conferma fossi tu quando ho visto il nome dalla shell nell'output di uno degli esercizi. Mi fa piacere vederti anche qui ;)
 
belli i filtri !

questo un po di assembly linux x86 at&t di un piccolo OS monotask scritto tempo fa.


in linux hai due formati ".S" e ".s", il primo e' un assembly che puo essere miscelato con
#define e altre cose del C (compilato con gcc). Il secondo, s minuscola e' assembly puro.
 
in linux hai due formati ".S" e ".s", il primo e' un assembly che puo essere miscelato con
#define e altre cose del C (compilato con gcc). Il secondo, s minuscola e' assembly puro.

Questo non lo sapevo; avevo visto le differenze nelle estensioni, ma non conoscevo il significato.
l sorgente è interessante comunque. Non conoscendo AT&T vedo alcune cose "strane", ma evito di farti domande qui (siamo già OT rispetto al quesito di @Dany_Glitch33 ). Potresti adattarlo a PML5T anche. :asd:

Perchè non lo pubblichi qui sul forum, aprendo un topic? Volendo puoi scrivere anche un piccolo "articolo/guida" sulla sua realizzazione, spiegando eventualmente qualche parte di quel codice.

Contrassegno come risolto questo topic senza chiuderlo, così se altri hanno suggerimenti sui libri potranno linkarli.
 
Questo non lo sapevo; avevo visto le differenze nelle estensioni, ma non conoscevo il significato.
l sorgente è interessante comunque. Non conoscendo AT&T vedo alcune cose "strane", ma evito di farti domande qui (siamo già OT rispetto al quesito di @Dany_Glitch33 ). Potresti adattarlo a PML5T anche. :asd:

Perchè non lo pubblichi qui sul forum, aprendo un topic? Volendo puoi scrivere anche un piccolo "articolo/guida" sulla sua realizzazione, spiegando eventualmente qualche parte di quel codice.

Contrassegno come risolto questo topic senza chiuderlo, così se altri hanno suggerimenti sui libri potranno linkarli.
Fa niente, sono comunque degli esempi di codice Assembly, quindi non è troppo OT :)
 
Ultima modifica da un moderatore:
No problem ! Se a qaulcuno interessa potro scrivere due righe su come si programma in assembly su linux / gcc in thread separato.
Messaggio unito automaticamente:

Come libro, a sup tempo avevo letto Linguaggio Assembly Avanzato - Peter Norton, mi era piaciuto, ormai roba da mummie, x86 16 bit real mode.