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
Je ne vais pas détailler ici comment exploiter une format string, voici juste ma solution : 30382578256e