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