Segmentation mémoire et Buffer Overflow

penguin rootCet article est un hommage au cours sur le reverse ingineering et l’exploitation des failles applicatives rédigé en français (oui oui !) par monsieur @Friz_N et mis à la disposition du lecteur sur  Base-Hacking.org  ! Je vous somme de le lire et relire.

Le cours est divisé en plusieurs chapitres qui se consacrent chacun à un mécanisme particulier de cet exaltant sujet. L’auteur s’est inspiré du livre Hacking: The Art of Exploitation de Jon Ericksson que vous n’aurez aucun mal à trouver sur la toile. Et pour vous donner l’eau à la bouche, voici comment est structuré son cours :

  • Tout d’abord, une petite introduction aux exploits applicatifs
  •  Une vue globale de la mémoire, son organisation et son utilisation
  • Les buffer overflows : comment un bug peut permettre de détourner une application
  • Les strings formatées, l’interprétation des chaînes de caractères par un programme

Et puisqu’il est coutume sur 0x0ff.info d’apporter une plus-value au sujet traité, voici ma contribution à cette édifice, une Cheat Sheet sur la segmentation mémoire à imprimer puis à coller non loin de votre ordinateur, une anti-sèche qui j’espère vous aidera à fixer rapidement les connaissances distillées par FrizN.

Memory Segmentation Cheat Sheet

Cette pompe contient sans doute quelques erreurs techniques, et de nombreuses atteintes à la langue officielle de l’île de Bretagne. Si vous découvrez quelques unes de ces coquilles, je vous conjure d’en faire part dans les commentaires de cet article pour que je puisse corriger ça au plus vite !  ;-)

Si vous voulez vous faire une idée sur le rendu une fois imprimée, cliquez ->ICI<- !

Révisions

  1. Version 1 : Version initiale
  2. Version 2 : Modification de la description de la Heap et suppression de la flèche suggérant à tord que la variable nb de la fonction main() était créée dans la Heap.  – Remerciement à Marc Falzon
  3. Version 3 : Précision sur les registres R.X  – Remerciement à Christophe Courtaut
  4. Version 4 (actuelle) : Pushing/Popping en anglais, Registre AX et non AH dans le tableau  – Remerciement à yaap
Spread The luvz..Share on FacebookTweet about this on TwitterShare on Google+Share on TumblrShare on LinkedInPin on PinterestShare on Reddit
  • Marc Falzon

    Très bonne initiative, il y a cependant une erreur : les variables locales aux fonctions sont stockées sur la stack (“nb” dans main(), “intern” et “buffer” dans func(), par exemple), pas le heap.

    Beau boulot ! :)

    m.

    • Merci pour le retour, la modification a bien été reportée sur la Cheat Sheet ! :)

  • Christophe Courtaut

    En effet, un cheat sheet bien sympa.

    En revanche la representation de la memoire est souvent faite dans l’autre sens (cad les addresses hautes en haut et les addresses basses en bas, comme ici par exemple http://static.duartes.org/img/blogPosts/linuxFlexibleAddressSpaceLayout.png), car cela est une representation qui peut sembler plus logique quand on fais un peu d’assembleur (j’empile des arguments, la stack descend dans les addresses, donc du coup je vais chercher mes arguments plus haut, par exemple ebp+8).

    Bref c’est un detail, ca reste un super taf ;)

    • Merci pour le compliment ! :-) J’ai choisi ce sens car la mémoire dans un désassembleur est en général représentée des adresses les plus basses vers les adresses les plus hautes. Mais les deux représentations ont leurs bons côtés apparemment !

      • Christophe Courtaut

        Le seule interet de la representation de bas vers le haut est de faire en sorte que la stack soit dans le sens auquel on s’attend a avoir un stack (cad quelque chose qui part d’en bas, sur lequel on rajoute des elements qui vont le faire grossir/monter). Des que l’on manipuler des addresses, la representation du haut vers le bas semble beaucoup plus approprier, donc cela depend donc du public viser par ton cheatsheet ;)

  • Christophe Courtaut

    Autre petite remarque, mais tant qu’a faire les choses bien, autant etre le plus precis possible, dans la partie global registers, tu decris les registres pour x86, or tu parle des registres rax,.., qui sont des registres qui font partie de l’archi x86-64 uniquement