• 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 Tags : , , , , , ,
  • Commentaires

    Aucun commentaire pour le moment

    Suivre le flux RSS des commentaires


    Ajouter un commentaire

    Nom / Pseudo :

    E-mail (facultatif) :

    Site Web (facultatif) :

    Commentaire :