App - Système

samedi 1er août 2020, 03:22  #1
App - Système ELF x86 - Stack buffer overflow basic 1
r0n
r0n
  • 1 posts

Bonsoir,

J’essaie de résoudre ce challenge depuis 3h maintenant.

Avant ça j’ai lu la première ressource fourni : https://www.root-me.org/fr/Documentation/Applicatif/Debordement-de-tampon-dans-la-pile#
puis ça ne m’a pas bien inspiré alors j’ai tenté ma chance sur la deuxième ressource (vidéo), qui s’avère très clair : https://www.youtube.com/watch?v=u-OZQkv2ebw et que je pense avoir bien compris.

Et la je me dis que je tiens quelques chose mais j’ai pas mal de question auquel je n’ai pas les réponses, par rapport au calcul dans le premier papier et avec mes tentatives sur le serveur (j’ai repris le shellcode fournit dans la ressource n°1 en jouant sur la taille des offsets).

Alors pour ce qui est de la première ressource je re explique cette première partie pour être sur d’avoir compris :D :

"Commençons par le plus simple : le buffer. Comme expliqué dans les pages sur la segmentation, quand la fonction enregistrer_nom() est appellée, plusieurs variables sont empilées tour-à-tour. Tout d’abord, les arguments, donc le pointeur *nom_saisi. Puis l’adresse de retour et le frame pointer de la fonction main(), et enfin les variables locales, donc buffer_nom. Puisque le but est de réécrire l’adresse de retour, il faut réécrire tout buffer_nom, plus le frame pointer (4 bytes), puis l’adresse de retour. Cela fait 108 bytes, plus le byte nul qui terminera la chaîne de caractères : 109. Côté NOP sled, il est possible d’en prendre un bien plus large en le placant après l’adresse de retour et non avant, mais cela n’a pas trop d’importance ici."

La pile est censé avoir cette tête ? : (sens bas>haut)
push nom_saisi
push RET
push FP main()
push buffer_nom

et on veut < ré écrire > l’adresse de retour ? (pourquoi, il serai peut etre bon de le rappeler s’il vous plait, je commence a fatiguer :) )

Pour cela on doit calculer combien chaque élément prends de place en mémoire soit :
buffer_nom = 100 bytes, frame pointer = 4 bytes, RET = 4 bytes = 108 + 1 pour le byte fin de chaine.

Deuxième morceaux pas très clair :

"Maintenant, le plus délicat dans notre cas est de calculer l’offset. ...
Nous allons essayer d’y aller par tâtonnements : en effet, nous avons le droit à une erreur de 40 octets grâce à l’étendue du NOP sled. Il faut en premier lieu voir la différence entre la pile du programme exploité et celle du programme exploitant : on voit que le main de l’exploitant a 6*4 = 24 bytes en plus pour ses arguments locaux. Comme le programme exploité fait un appel de fonction, il utilise au moins 12 bytes en plus (argument, adresse de retour, frame pointer). Tout ceci fait déjà un décalage de 88 bytes de manière sûre. Le compilateur peut induire des biais supplémentaires (alignement de la pile au début d’une fonction, alignement du buffer sur un multiple de 4 ou 16, ...). ....
Ainsi, le plus rapide est souvent comme ici de faire une approximation puis d’ajouter la moitié de la longueur du NOP sled à chaque tentative jusqu’à tomber dans le NOP sled."

Alors comment il obtient 88 bytes "sur" ? Si je compte ce qu’il a détaillé soit 6*4 = 24 bytes + 12 bytes = 36 bytes ? même en ajoutant la marge d’erreur de 40 octects je trouve 76 bytes, je suis encore 12 bytes manquant.
Et magiquement ça devrait faire 164 bytes d’offset ?

Pour ce qui est de l’alignement, je l’ai constaté quand j’ai "> disas main", la présence de l’instruction "and 0xFFFFFFF0 esp" est bien présente (mais esp ne devrait il pas être inversé avec la valeur a comparé ? comme je l’ai vu sur stackoverflow : https://stackoverflow.com/questions/24588858/and-esp-0xfffffff0 ou bien il sauvegarde le résultat automatiquement dans esp étant donné que c’est le seul registre dans l’opération ?)

J’ai encore des questions quand aux valeur donné par "disas main" du shellcode que j’utilise mais je ferais un autre sujet pour essayer de ne pas déborder de trop sur celui là ou j’editerai ce post (s’il vous plait un modérateur pourrait me conseiller la marche a suivre ?).

Merci par ailleurs a tous ceux qui m’auront lu et répondu !

lundi 3 août 2020, 00:14  #2
App - Système ELF x86 - Stack buffer overflow basic 1
ElTouco72
  • 283 posts

hello,

je pense que tu te prends beaucoup trop la tête pour ce premier challenge que même une bille comme moi a réussi en n’y connaissant quasi rien en app-sys