Hello World

Auteur: Brouettelover 2024-01-03 14:18:29
Categories: > Tags:

Description

Cet article est le premier d’une sorte de cours sur assembler qui va m’être utile pour tout ce qui conserne le reverse engineering et powned.

Je ne suis pas super familier avec la programmation très bas niveau, je vais donc aller étape par étape dans ma manière d’apprendre ce langage.

Je vais donc commencer par créé un simple programme “hello world” qui va m’afficher “hello world” à l’exécution.
## Programme

Voici le code :

section .data
    hello db 'Hello, World!',0

section .text
    global _start

_start:
    ; write the string to stdout
    mov rax, 1            ; syscall number for sys_write
    mov rdi, 1            ; file descriptor 1 is stdout
    mov rsi, hello        ; pointer to the string
    mov rdx, 13           ; length of the string
    syscall

    ; exit the program
    mov rax, 60           ; syscall number for sys_exit
    xor rdi, rdi          ; exit code 0
    syscall
Partie 1 - section .data :
  • section .data : est une fonction qui n'est pas interprété par l'assembleur, elle est donc utilisé pour définir une section de manière informative afin de structuré le code
  • hello db 'Hello, World!',0 : "hello" est le nom de la variable. "db" indique que l'on déclare des octets. 'hello world',0 indique la séquence sauvegardé en mémoire suivie par un octet à 0 (qui est le standar pour indiquer la fin d'une chaîne de caractères).
Partie 2 - section .text :
  • section .text : est une fonction qui n'est pas interprété par l'assembleur, elle est donc utilisé pour définir une section de manière informative afin de structuré le code
  • global _start : "global" est une instruction qui indique que le "symbole" est accessible depuis l'extérieur
  • _start: est un standard qui indique de manière générale le début d'un programme, il représente "la fonction de démarrage".
Partie 3 - les instructions "mov,syscall,xor" :
  • mov : est une instruction qui permet de copier des données d'une source vers une destination (mov destination, source). exemple : mov eax, 42 copie 42 dans le registre eax.
  • syscall : est utilisé pour effectué un appel système sous linux c'est à dire de demander au système d'exploitation d'effectuer certaines actions. Les arguments sont généralement placé dans des registes comme "rax,rdi,rsi,..." qui sont interprétés par l'OS qui sera comment géré les valeurs présentes dans les registres
  • xor: est comme en logique boolléenne un "ou exclusif" qui va être appliqué d'une source vers une destination comme ceci : xor destination, source (cette opération est utilisé pour remettre à 0 les données d'un registre) xor eax, eax ; Mettre à zéro le registre eax (eax XOR eax)

Le code commenté :

section .data ; structure pour dire que cette section reprend les données
    hello db 'Hello, World!',0 ; stock 'Hello Worlds!',0 dans hello

section .text ; structure pour dire que cette section reprend les fonctions
    global _start ; déclaration d'une fonction _start qui est exécuter au démarrage du programme

_start:
    ; afficher le message contenu dans "hello" vers la sortie standard
    mov rax, 1            ; demande à l'os lors du syscall d'utiliser la fonction 'write' - (write est l'équivalent d'afficher)
    mov rdi, 1           ; donne l'instruction d'envoyé le message vers la sortie standard (2, est pour les messages d'erreurs)
    mov rsi, hello        ; pointeur vers ma variable "hello" qui stock ma chaine de caractère "hello world!",0
    mov rdx, 13           ; la taille de ma chaine de caractères
    syscall ; appel le système d'exploitation

    ; exit the program
    mov rax, 60           ; demande à l'os lors du syscall de sortir de l'application pour signifié qu'elle a terminé
    xor rdi, rdi ; assure de remettre la valeur du registre à 0 ce qui signifie un code de sortie de 0 qui en général veut dire que le programme a bien fonctionné 
    syscall ; appel le système d'exploitation

Pour compiler de l’assembleur en x64 :

nasm -f elf64 Premierprog

Ce qui va me créé un objet assembleur : Premierprog.o
Le fichier compilié ne contient que la partie visible du code, pour intégré les fonctionnalités de linux par exemple il faut le linker avec ld.

Pour créer un exécutable directement à partir du fichier compilié :

ld -o Hello Premierprog.o