Lire un dump mémoire sans connaître l’ordre des octets, c’est lire une adresse à l’envers sans le savoir — une erreur fréquente, et facile à éviter une fois le principe posé.

Bit de poids fort

On appelle bit de poids fort le bit le plus à gauche dans une représentation binaire, celui qui porte le plus grand poids. On l’écrit parfois msb, en minuscule, pour le distinguer de MSB (Most Significant Byte, l’octet de poids fort).

Un système big-endian stocke l’octet de poids fort d’un mot à l’adresse mémoire la plus basse, et l’octet de poids faible à l’adresse la plus haute. Un système little-endian, à l’inverse — et c’est le cas de l’immense majorité des architectures x86/AMD64 que l’on rencontre en exploitation — stocke l’octet de poids faible à l’adresse la plus basse.

Pourquoi cela compte

L’endianness importe à trois titres au moins : le réseau, où TCP/IP impose par convention le big-endian ; la compatibilité entre architectures, lorsqu’on échange des données binaires brutes ; et l’analyse mémoire, où mal lire l’ordre des octets fausse toute interprétation d’une adresse ou d’une valeur dumpée.

En pratique, sous GDB (ou GEF), afficher un mot puis les octets qui le composent rend la confusion impossible :

gef➤  x/w 0x7fffffffd639
0x7fffffffd639:    0x64f7fe1e
gef➤  x/4b 0x7fffffffd639
0x7fffffffd639:    0x1e    0xfe    0xf7    0x64

Le mot 0x64f7fe1e est bien stocké, en mémoire, avec l’octet 0x1e en tête — c’est l’octet de poids faible, à l’adresse la plus basse. Retenir ce renversement est indispensable dès qu’on manipule des adresses écrasées à la main lors d’un débordement de pile.