Bonsoir,
Je sais qu’il y a quelques assassins du langage d’assemblage x86 donc voici mon problème:
Pour une raison qui m’est personelle (ici), je me suis lancé, comme dirait quelqu’un ici qui se reconnaîtra, dans la jungle avec ma bite et mon couteau mais sans mon couteau.
J’ai trouvé un cours qui ma foi me semble correct seulement, l’auteur veut à tout pris assembler sous environnement Windows.
Etant un fervent utilisateur de GNU/Linux (ArchLinux) je me suis dit que pas grave on va adapter, le jeu d’instructions ne changeant pas, ni la syntaxe de FASM.
En revanche là ou ça change c’est quand on veut préparer le terrain en fonction du format de l’éxecutable.
J’ai donc remplacé le PE Console par un ELF mais en ayant lu la documentation de FASM j’ai l’impression qu’il y a un petit problème:
Certaines directives comme entry
n’ont pas l’air de fonctionner ni même global
.
Voici le code qui ne sert à rien que j’ai écrit:
; first_program source code
; ELF Format
format ELF
; =================================
section '.text' executable
global_start
extrn exit
_start:
; All begins here
mov eax,3
push 0
call exit
FASM m’insulte depuis tout à l’heure dès qu’il passe la section .text en me disant que global_start est une instruction illégale.
Qué paso ?
Merci bien.
PS: Pas de troll sur la légitimité du langage d’assemblage, je souhaite juste qu’on réponde à ma question si possible, merci.
THE EDIT:
J’ai fini par trouver la solution tout seul. Connaître le langage C et avoir lu quelques bouquins systèmes m’ont aidé dans ma recherche quand même lol
Voici la solution:
1 - Quand on lit une documentation, on la lit jusqu’au bout. La partie de la doc sur le format Executable and Linkable Format
2 - Se rapeller qu’il n’y a pas 62000 interruptions système sous GNU/Linux mais une seule (0x80) qui va lire la valeur contenue dans le registre eax
au moment de son appel -> Source
Pour ceux que ça intéresse et qui n’ont pas envie de télécharger les sources du kernel juste pour trouver un putain de code d’interruption -> C’est ici que ça se passe ATTENTION: Ce sont les appels systèmes pour du 32 bits, la liste date de 1999–2000, pour l’appel exit ça pose pas de soucis mais je ne sais pas si pour le dernier kernel cela est encore valable selon les appels.
3 - Voici le résultat commenté par mes soins:
; Minimal ELF executable ASM code with FASM syntax
; ELF Format
format ELF executable 3 ; L'instruction format défini le format de l'éxécutable à assembler, ici un ELF (32 bits, ELF64 pour un 64 bits)
; Le nombre << magique >> '3' défini GNU/Linux comme système d'exploitation cible
entry _start ; On défini ensuite le point d'entrée (Ici le label _start)
; =================================
segment readable executable ; Début d'un nouveau segment (Pour un éxécutable sans fichiers objets. FASM autorise de ne pas passer par l'édition
; de liens afin d'assembler directement notre programme. Dans le cas contraire, l'instruction segment se transforme
; en '.section')
_start:
; Entrée du programme
mov eax,1 ; On affecte la valeur 1 au registre étendu eax (mov dest,source)
int 0x80 ; On fait appel à l'interruption système 0x80 qui se chargera de lire la valeur
; contenue dans le registre eax et de faire l'appel système correspondant.
; =================================
; Cela reviens à écrire en C :
;
; int main(void)
; {
; return 0;
; }
;
; En fait la fonction C main() fait elle même appel à l'interruption système sys_exit (Lu dans mes bouquins).
;
; [Je comprends pourquoi Dieu nous a envoyé Dennis M. Ritchie du coup]
Voilà voilà