Vérifier l'existence d'un utilisateur


Scénario No.1

L'utilisateur 'marcel' est entré de façon statique dans le programme.

Ecrire le programme user.asm suivant

section .data
 user db 'marcel',0 ; Nom de l'utilisateur à vérifier
 msg_exist db 'L'utilisateur existe', 10, 0 ; Message si l'utilisateur existe
 len_exist equ $ - msg_exist ; Longueur du message si l'utilisateur existe
 msg_not_exist db 'L'utilisateur n'existe pas', 0xA, 0 ; Message si l'utilisateur n'existe pas
 len_not_exist equ $ - msg_not_exist ; Longueur du message si l'utilisateur n'existe pas

section .bss
 login resb 256 ; Buffer pour stocker le nom de l'utilisateur connecté

section .text
 global _start

_start:
 ; Appel système pour obtenir le nom de l'utilisateur connecté
 mov eax, 49 ; Numéro de l'appel système sys_getlogin (49)
 lea rdi, [login] ; Pointeur sur le buffer pour le nom d'utilisateur
 mov rsi, 256 ; Taille du buffer
 syscall ; Appel système

 ; Comparer le nom d'utilisateur obtenu avec 'majekla'
 mov rdi, user ; Pointeur sur le nom d'utilisateur à vérifier
 mov rsi, login ; Pointeur sur le nom d'utilisateur obtenu
 call strcmp ; Appel à strcmp
 test eax, eax ; Vérifier le résultat de strcmp
 jz user_exists ; Sauter si les chaînes sont identiques

 ; Si l'utilisateur n'existe pas
 mov rax, 4 ; sys_write
 mov rdi, 1 ; stdout
 mov rsi, msg_not_exist ; Message à afficher
 mov rdx, len_not_exist ; Longueur du message
 syscall ; Appel système pour afficher le message
 jmp exit ; Aller à la fin du programme

user_exists:
 ; Si l'utilisateur existe
 mov rax, 4 ; sys_write
 mov rdi, 1 ; stdout
 mov rsi, msg_exist ; Message à afficher
 mov rdx, len_exist ; Longueur du message
 syscall ; Appel système pour afficher le message

exit:
 ; Terminer le programme
 mov rax, 1 ; sys_exit
 xor rdi, rdi ; Code de retour
 syscall ; Appel système

; Fonction strcmp (compare deux chaînes)
strcmp:
 push rdi ; Sauvegarder RDI
 push rsi ; Sauvegarder RSI
 push rcx ; Sauvegarder RCX
 xor rcx, rcx ; RCX = 0
 cld ; Effacer la direction flag pour l'incrémentation

strcmp_loop:
 lodsb ; Charger le byte à [RSI] dans AL et incrémenter RSI
 scasb ; Comparer AL avec le byte à [RDI] et incrémenter RDI
 jne strcmp_done ; Si non égal, fin de la boucle
 test al, al ; Vérifier si nous avons atteint la fin de la chaîne
 jnz strcmp_loop ; Si non, continuer la boucle

 xor eax, eax ; Les chaînes sont identiques
 jmp strcmp_cleanup ; Nettoyer et retourner

strcmp_done:
 mov eax, 1 ; Les chaînes sont différentes
 sub al, [rdi - 1] ; Calculer la différence

strcmp_cleanup:
 pop rcx ; Restaurer RCX
 pop rsi ; Restaurer RSI
 pop rdi ; Restaurer RDI
 ret ; Retourner

Assembler

nasm -f elf64 user.asm

Linker

ld user.o -o user

Lancer le programme

./user

Scénario No.2

Le programme demande d'entrer l'username à vérifier puis effectue la vérification.

./user


↑ Haut de page