Informasjon

Forfatter(e) Nikita Tyunyayev
Frist 29/03/2027 23:59:59
Innleveringsgrense 3 innleveringer
hver 5 time(r)
Kategorimerkelapper s6

Merkelapper

Logg inn

TP6 : Buffer Overflow

Le simulateur est disponible ici : http://asm.info.ucl.ac.be/ Vous pouvez trouver le syllabus ici : https://sites.uclouvain.be/LSINC1102/pfo/introduction.html


Buffer Overflow

Le programme suivant implémente un système de login simplifié en assembleur. Il copie le mot de passe fourni par l'utilisateur (passwd_user_provided) dans un buffer de taille fixe (passwd_user_stored), puis compare ce buffer avec le mot de passe secret passwd.

Lisez attentivement le code et lancer le dans le simulateur avant de commencer l'exercice.

JMP .start
passwd_user_provided: DB "???" ; -> A remplacer par votre chaîne d'entrée
DB 0
passwd_user_stored: DB "USER INPUT FIXED BUFFER"
DB 0
passwd: DB "secret password"
DB 0
succesfull_login_msg: DB "Login Succesful"
DB 0
failed_login_msg: DB "Login Failed"
DB 0

.start:
    MOV D, passwd_user_provided
    PUSH passwd_user_stored
    CALL str_cpy
    POP D
    MOV D, passwd_user_stored
    PUSH passwd
    CALL str_cmp
    POP D
    CMP A, 1
    JNE .end_fail
    JMP .end_success
.end_success:
MOV D, succesfull_login_msg
PUSH DP
CALL print
HLT
.end_fail:
MOV D, failed_login_msg
PUSH DP
CALL print
HLT

Le programme utilise des fonctions utilitaires intentionnellement vulnérables :

; Implementation of some utilities here
; Copying of a string
; This is a dangerous function :(
str_cpy:
PUSH B
PUSH C
MOV B, [SP+6]
.loop_str_cpy:
MOV A, [D]
MOV [B], A
ADD B, 2
ADD D, 2
CMP A, 0
JNE .loop_str_cpy
POP C
POP B
RET

; This is buggy function :(
str_cmp:
PUSH B
PUSH C
MOV B, [SP+6]
.loop_str_cmp:
MOV A, [D]
MOV C, [B]
CMP C, 0
JE .str_cmp_equal
CMP A, C
JNE .str_cmp_not_equal
ADD D, 2
ADD B, 2
JMP .loop_str_cmp

.str_cmp_equal:
MOV A, 1
POP C
POP B
RET

.str_cmp_not_equal:
MOV A, 0
POP C
POP B
RET

;Function used to print to the screen
print:
   MOV SM, 1
   PUSH C
   PUSH B
   MOV C, [SP+6]
   MOV B, 0
.print_loop:
   MOV A, [D]
   MOV [C], A
   INC D
   INC C
   INC D
   INC C
   CMP B, [D]
   JNZ .print_loop
   POP B
   POP C
   RET

Rappel simulateur : chaque caractère DB occupe 2 octets.

Votre objectif : trouver la chaine de caractère à la place de "???" pour que le login réussisse.

Contraintes :

  • Vous ne pouvez pas utiliser secret password ni aucune chaîne qui la contient comme sous-chaîne.
  • Soumettez uniquement la valeur de passwd_user_provided.

Indices :

  • Observez la disposition des variables en mémoire : que se passe-t-il si str_cpy reçoit une chaîne plus longue que le buffer de destination ?
  • Examinez attentivement la condition d'arrêt de str_cmp : sur quel opérande vérifie-t-elle le zéro ?

Le nombre de soumission est volontairement très limités. Assurez-vous d'avoir une solution qui marche dans le simulateur avant de soumettre sur INGInious