> For the complete documentation index, see [llms.txt](https://sansong.gitbook.io/cyber/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://sansong.gitbook.io/cyber/pwn/32-bit-vs-64-bit.md).

# 32-bit vs 64-bit

La taille 32 ou 64 bits correspond à **la taille adresses mémoires**.&#x20;

Un système $$n$$-bits peut accéder à $$2^n$$ adresses différentes.

* 32-bits: 4 octets
* 64-bits: 8 octets

{% hint style="success" %}
La taille des registres est différente en fonction

* 32-bits: `eax`
* 64-bits: `rax`
  {% endhint %}

Un programme 32-bits peut être exécuté sur un OS 64-bits mais pas l'inverse (qui peut le plus peut le moins).

{% hint style="success" %}
En 32-bits les arguments d'une fonction sont poussés sur la pile alors qu'en 64-bits ils sont passés par registres.
{% endhint %}

**Compiler un programme en 32-bits**

```
gcc -m32 program.c -o program
```

{% hint style="info" %}
Compiler un programme 32-bits sur un OS 64-bits peut remonter cette erreur

```
bits/predefs.h : aucun fichier ou répertoire de ce type
```

Résoudre le problème:

```
// c
sudo apt-get install gcc-multilib
// c++
sudo apt-get install g++-multilib
```

{% endhint %}

**Déterminer le type d'un binaire**

```
$ file <program>
program: ELF 64-bit [...]
```
