App - Système

lundi 27 juillet 2015, 15:20  #1
ELF64 - Stack buffer overflow - basic - passage paramètres à bash
franb
  • 5 posts

Bonjour à tous, dans ce challenge, j’arrive bien à executer callMeMaybe.
Par ailleurs, si je remplace dans cette fonction
system("/bin/bash")
par
scanf("%s", buffer) ;
printf("-> %s\n", buffer) ;

je peux faire afficher les lignes que je veux. par contre visiblement /bin/bash ne reçoit rien, c’est vraiment curieux. J’ai fait beaucoup de tests mais je coince. Une indication pour m’indiquer vers où chercher serait bienvenue ? SI c’est un pbm courant évoqué dans ce forum (c’est possible et sans doute probable), je veux bien un lien vers le sujet où cela est évoqué (pas trouvé).

mardi 28 juillet 2015, 09:17  #2
ELF64 - Stack buffer overflow - basic - passage paramètres à bash
franb
  • 5 posts

Ok, poser une question, c’est souvent y répondre et c’est le cas ici. Mais je ne comprends pas la raison pour laquelle le passage simple d’agurments ne fonctionne pas.
Pour ceux qui ont ce souci : lire le manuel de bash

mercredi 13 septembre 2017, 12:06  #3
ELF64 - Stack buffer overflow - basic - passage paramètres à bash
Yandros
  • 9 posts

Résolu alors ?

Pour ceux qui auraient ce problème, il faut savoir que system("/bin/[ba]sh") attend des commandes du stdin. Or avec une attaque du type
python -c 'print payload' | ./executable
le stdin est déjà "fermé" quand le programme passe la main à /bin/sh ce qui provoque que /bin/sh n’a rien à faire et part ... sans résultat visible donc.

Solutions :
1) On "garde la main sur le stdin" en concaténant le payload et votre entrée :

python -c 'print payload'  > /tmp/pl
cat /tmp/pl - | ./executable

Ou en une seule ligne (méthode la plus pratique) !) :
(python -c 'print payload' ; cat -) | ./executable

2) On connaît déjà la commande console que l’on souhaite utiliser (e.g. cat .passwd). On la rajoute alors en fin de payload si jamais le programme vulnérable arrête de "consommer" le stdin après un retour à la ligne par exemple (le cas de scanf) :
python -c 'print payload + "\ncat .passwd"'  > /tmp/pl