La fonction main
appel directement la fonction login
. Celle ci commence par afficher des informations, demande le mot de passe, puis appel test_password_valid
. Pour débloquer la porte, elle vérifie si ce qui se trouve à l'adresse 0x2410
est égal à 0xF6
.
4520 <login> 4520: c243 1024 mov.b #0x0, &0x2410 4524: 3f40 7e44 mov #0x447e "Enter the password to continue.", r15 4528: b012 de45 call #0x45de <puts> 452c: 3f40 9e44 mov #0x449e "Remember: passwords are between 8 and 16 characters.", r15 4530: b012 de45 call #0x45de <puts> 4534: 3e40 1c00 mov #0x1c, r14 4538: 3f40 0024 mov #0x2400, r15 453c: b012 ce45 call #0x45ce <getsn> 4540: 3f40 0024 mov #0x2400, r15 4544: b012 5444 call #0x4454 <test_password_valid> 4548: 0f93 tst r15 454a: 0324 jz $+0x8 454c: f240 ba00 1024 mov.b #0xba, &0x2410 4552: 3f40 d344 mov #0x44d3 "Testing if password is valid.", r15 4556: b012 de45 call #0x45de <puts> 455a: f290 f600 1024 cmp.b #0xf6, &0x2410 4560: 0720 jne #0x4570 <login+0x50> 4562: 3f40 f144 mov #0x44f1 "Access granted.", r15 4566: b012 de45 call #0x45de <puts> 456a: b012 4844 call #0x4448 <unlock_door> 456e: 3041 ret 4570: 3f40 0145 mov #0x4501 "That password is not correct.", r15 4574: b012 de45 call #0x45de <puts> 4578: 3041 ret
On remarque aussi que la taille de ce qu'on rentre n'est pas vérifié et que notre entrée est stockée en 0x2400
. Il suffit donc de spécifier comme input 41414141414141414141414141414141f6f6
afin d'écrire la valeur 0xF6
à l'adresse 0x2410
afin d'ouvrir la porte.
Note : dans ce niveau, la fonction test_password_valid
déclenche l'interruption 0x7D
pour appeler un périphérique qui lui connais et vérifie le mot de passe. (cf https://microcorruption.com/manual.pdf
)