Outils pour utilisateurs

Outils du site


writeup:microcorruption:adis_ababa

Adis Ababa

La fonction main est plutôt simple, elle lit un input utilisateur d'un taille max de 19 octets à l'adresse 0x2400 puis copie cette chaine dans un buffer sur la stack via la fonction strcpy. Elle appelle ensuite la fonction test_password_valid qui retourne 1 si le mot de passe est valide et 0 si non. Cette valeur est stockée sur la stack juste avant le buffer de l'input pour être comparée plus tard afin de décider si la porte doit être ouverte ou non.

seg000:00004438                 add.w   #0FFEAh, SP
seg000:0000443C                 clr.w   16h+var_16(SP)
seg000:00004440                 push.w  #aLoginWithUsern ; "Login with username:password below to a"...
seg000:00004444                 call    #printf
seg000:00004448                 mov.w   #asc_451B, 18h+var_18(SP) ; ">> "
seg000:0000444E                 call    #printf
seg000:00004452                 incd.w  SP
seg000:00004454                 mov.w   #13h, R14
seg000:00004458                 mov.w   #2400h, R15
seg000:0000445C                 call    #getsn
seg000:00004460                 mov.w   SP, R11
seg000:00004462                 incd.w  R11
seg000:00004464                 mov.w   #2400h, R14
seg000:00004468                 mov.w   R11, R15
seg000:0000446A                 call    #strcpy
seg000:0000446E                 mov.w   #2400h, R15
seg000:00004472                 call    #test_password_valid
seg000:00004476                 mov.w   R15, 16h+var_16(SP)

Juste après ce morceau de programme, on remarque que la fonction printf est appelée sur notre entrée utilisateur. Vous voyez le problème ? On a une jolie format string qui permet d'écrire le flag stockée sur la stack afin d'ouvrir la porte :-D

Je ne vais pas détailler ici comment exploiter une format string, voici juste ma solution : 30382578256e

writeup/microcorruption/adis_ababa.txt · Dernière modification: 2014/11/05 18:03 par tlk