Finish projet AVL

This commit is contained in:
Tunui Franken 2024-02-28 20:15:53 +01:00
parent e3f240bcab
commit 4782c624a5
8 changed files with 64 additions and 29 deletions

View 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

View file

@ -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()

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 79 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

View file

@ -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}