Comparatif de chaînes de caractère et exécution de commande système

Introduction

Nous reprenons le principe du programme du mot magique en le combinant à l'exécution d'une commande système simple.

Le programme demande à ce que l'utilisateur rentre un mot.
Si le mot 'magique' est entré, alors le programme répond 'BRAVO' et exécute la commande 'ls' pour afficher le contenu du répertoire courant puis quitte !


Code du programme magiquels.asm

section .data
prompt_message db 'Entrez un mot: ', 0
prompt_len equ $-prompt_message
magic_word db 'magique', 0
magic_len equ $-magic_word
bravo_message db 'BRAVO', 10
bravo_len equ $-bravo_message
error_message db 'ERREUR', 10
error_len equ $-error_message
command db '/bin/ls', 0
argv dq command, 0
envp dq 0

section .bss
input_buffer resb 50

section .text
global _start

_start:
; Affichage du message d'invite
mov rax, 4
mov rdi, 1
mov rsi, prompt_message
mov rdx, prompt_len
syscall

; Lecture de l'entrée utilisateur
mov rax, 3
mov rdi, 0
mov rsi, input_buffer
mov rdx, 50
syscall

; Stocker la longueur réelle lue dans rax, et soustraire 1 pour enlever le newline
sub rax, 1

; Comparer l'entrée avec 'magique'
mov rdi, input_buffer
mov rsi, magic_word
mov rcx, rax ; Utiliser la longueur ajustée
call compare_strings

; Décider sur la base du résultat de la comparaison
test rax, rax
jz magic_matched
jmp error_occurred

magic_matched:
; Affichage de 'BRAVO'
mov rax, 4
mov rdi, 1
mov rsi, bravo_message
mov rdx, bravo_len
syscall

; Exécuter 'ls'
mov rax, 59 ; Le numéro de système pour sys_execve sur FreeBSD
lea rdi, [command] ; Le premier argument de sys_execve, le chemin du programme
lea rsi, [argv] ; Le deuxième argument, le tableau d'arguments
lea rdx, [envp] ; Le troisième argument, le tableau d'environnement
syscall ; Appeler le système

error_occurred:
; Affichage de 'ERREUR'
mov rax, 4
mov rdi, 1
mov rsi, error_message
mov rdx, error_len
syscall

exit:
; Sortie du programme
mov rax, 1
xor rdi, rdi
syscall

compare_strings:
; Comparaison caractère par caractère
repe cmpsb
jecxz equal ; Sauter si tous les caractères ont été comparés et sont égaux
mov rax, 1
ret
equal:
xor rax, rax ; Résultat zéro indique une égalité
ret

Assembler

nasm -f elf64 magiquels.asm -o magiquels.o

Linker

ld magiquels.o -o magiquels

Lancer le programme

./magiquels


↑ Haut de page