-
Vérifier l'existence d'un utilisateur (sys_getlogin)
Vérifier l'existence d'un utilisateur sur le système et afficher un résultat selon
Créez le programme check_user.asm :
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 check_user.asm -o check_user.o
- Linker
ld check_user.o -o check_user
- Lancer le programme
./check_user
Tags : check, user, vérifier, existence, utilisateur, FreeBSD, nasm
-
Commentaires