Ce niveau est très similaire à Whitehorse. La seule différence est qu'ici la fonction strcpy
est utilisée, ce qui interdit l'utilisation de null byte dans l'entrée utilisateur.
On reprend le shellcode précédent en le modifiant légèrement :
nop nop xor r15, r15 mov.b #0x7F, r15 push r15 call #0x454C
Le XOR, MOV, PUSH permet de ne pas utiliser de null byte. Un problème se pose quand même, toutes les instructions se codent sur 4 octets. Si on regarde de plus prêt comment est codé le mov.b #0x7f, rf15
, on se rend compte que celle ci contient un null byte : \x7f\x40\x7f\x00
. Comme on a bien spécifié qu'un seule octet doit être transféré, il est possible de tricher en modifiant le null byte par une valeur quelconque qui sera ignorée.
Le code réellement assemblé donne : 034303430fef7f407f000f12b0124c45
. Et en trichant : 034303430fef7f407f420f12b0124c45
.
On ajoute l'adresse du shellcode dans la stack à la fin, et le tour est joué. 034303430fef7f407f420f12b0124c45f043
permet de valider le niveau.
Le principe est exactement le même que sur Whitehorse, la seule différence est l'adresse de la fonction INT
.
414141414141414141414141414141414C453C447F
permet de valider le niveau.