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