From 3523b38a0a34ae0c1e792c1464c2c2bb708716e1 Mon Sep 17 00:00:00 2001 From: Enotias Date: Wed, 14 Feb 2024 19:15:48 +0100 Subject: [PATCH 1/6] Add files via upload --- src/content/posts/wu_fcsc_2022_a_l_envers.md | 63 ++++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 src/content/posts/wu_fcsc_2022_a_l_envers.md diff --git a/src/content/posts/wu_fcsc_2022_a_l_envers.md b/src/content/posts/wu_fcsc_2022_a_l_envers.md new file mode 100644 index 0000000..fd67080 --- /dev/null +++ b/src/content/posts/wu_fcsc_2022_a_l_envers.md @@ -0,0 +1,63 @@ +# Challenge FSCS 2022 : A l'envers + +## Première idée +Le programme contenu dans le docker nous envoie des mots un par un. Le challenge consiste à lui renvoyer les mots en les inversants. Ma première idée consiste à faire simplement un script pyhton qui renvoie le mot retourné. Mais problème : comment intérargir avec le challenge, ie récupérer les mots qu'il envoie et lui retourner les mots inversés ? En effet, une simple pipe ne suffit pas puisqu'il faut lire plusieurs fois ce qu'envoie le challenge et à chaque fois lui envoyer une réponse. + +## Pwntools +Pour résoudre ce problème, on utilise la librairie python Pwntools. Pour commencer, on set la target (le docker) avec la fonction `remote` : `target = remote("localhost", 4000)` +Ensuite, on veut récupérer ce qu'envoie la target, l'inverser puis le renvoyer. Tout ceci est possible avec les méthodes suivantes: +`target.recvuntil(bstr)` `target.recvline()` `target.sendline()` +On commence donc par demander au script d'attendre tant que on n'a pas une ligne du style `>>> txt` avec `target.recvuntil(b">>>")` : on se contente de lire ce qu'il y a après les chevrons, et on ajoute un _b_ pour préciser qu'il s'agit d'un bytestring et non d'un string qu'on souhaite lire. + +## Premier problème +Les deux dernières méthodes ne renvoient / prennent pas un string, mais un bytestring. Voici ce qui est renvoyé par la première méthode : +`b' ANSSI\n'` +_On remarque qu'on a bien récupéré seulement ce qui suivait les chevrons_. Dans l'état, on ne peut pas en faire grand chose. On note aussi qu'il faut se débarasser des caractères superflus. Pour convertir un bytestring en string, il faut le décoder avec la méthode : `.decode("utf-8")` (ou un autre type d'encodage bien évidemment). De même, on passe d'un string à un bytestring avec la fonction `bytes(str,str encoding)`. On sait donc maintenant passer de l'un à l'autre, et donc notre scipt ressemble désormais à ça : + +```py +from pwn import * + +target = remote("localhost",4000) + +target.recvuntil(b">>>") +bytestring = target.recvline() +string = bytestring.decode("utf-8") +string = string[:-1:-1] +bstr = bytes(string,'utf-8') +target.sendline(bstr) +``` + +Plus qu'à rajouter une petite boucle `While True:` et on est bon ! Ou presque ... + +## Deuxième problème +En effet, le programme renvoie désormais une erreur lorsqu'on l'execute. Elle est dûe au `recvuntil(b">>>")`. Lorsque le docker envoie le flag (à la fin de l'execution du docker), la ligne ne commence pas par des chevrons. On va donc feinter en utilisant la méthode `target.interactive()` qui permet de redonner la main au terminal lors de l'execution du script, et ce en catchant l'erreur, afin d'arrêter le script. On rajoute donc au début de la boucle + +```py +try: + target.recvuntil(b">>> ") +except: + target.interactive() +``` + + +Et voilà ! + +## Programme final +```py +from pwn import * + +target = remote("localhost",4000) + +while True: + try: + target.recvuntil(b">>> ") + except: + target.interactive() + bytestring = target.recvline() + string = bytestring.decode("utf-8") + string = string[:len(string)-1] + string = string[::-1] + bstr = bytes(string,'utf-8') + + target.sendline(bstr) +``` \ No newline at end of file From d076e3af85f73503571cc9097f2c72bd9f751ffb Mon Sep 17 00:00:00 2001 From: Enotias Date: Wed, 14 Feb 2024 19:26:59 +0100 Subject: [PATCH 2/6] Update src/content/posts/wu_fcsc_2022_a_l_envers.md Co-authored-by: ClementMabileau --- src/content/posts/wu_fcsc_2022_a_l_envers.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/content/posts/wu_fcsc_2022_a_l_envers.md b/src/content/posts/wu_fcsc_2022_a_l_envers.md index fd67080..bcb8029 100644 --- a/src/content/posts/wu_fcsc_2022_a_l_envers.md +++ b/src/content/posts/wu_fcsc_2022_a_l_envers.md @@ -1,4 +1,9 @@ -# Challenge FSCS 2022 : A l'envers +--- +title: "Write-up de "A l'envers" - FSCS 2022" +date: 2024-14-02 +draft: false +tags: ["write-up","FCSC","programming","pwntools"] +--- ## Première idée Le programme contenu dans le docker nous envoie des mots un par un. Le challenge consiste à lui renvoyer les mots en les inversants. Ma première idée consiste à faire simplement un script pyhton qui renvoie le mot retourné. Mais problème : comment intérargir avec le challenge, ie récupérer les mots qu'il envoie et lui retourner les mots inversés ? En effet, une simple pipe ne suffit pas puisqu'il faut lire plusieurs fois ce qu'envoie le challenge et à chaque fois lui envoyer une réponse. From e069ef4512f354fc9b18502bca89cad893009300 Mon Sep 17 00:00:00 2001 From: Enotias Date: Wed, 14 Feb 2024 19:31:08 +0100 Subject: [PATCH 3/6] Update src/content/posts/wu_fcsc_2022_a_l_envers.md Co-authored-by: ClementMabileau --- src/content/posts/wu_fcsc_2022_a_l_envers.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/content/posts/wu_fcsc_2022_a_l_envers.md b/src/content/posts/wu_fcsc_2022_a_l_envers.md index bcb8029..96df79a 100644 --- a/src/content/posts/wu_fcsc_2022_a_l_envers.md +++ b/src/content/posts/wu_fcsc_2022_a_l_envers.md @@ -5,6 +5,8 @@ draft: false tags: ["write-up","FCSC","programming","pwntools"] --- +> on peut retrouver ce challenge sur [Hacropole](https://hackropole.fr/fr/challenges/misc/fcsc2022-misc-a-l-envers/) + ## Première idée Le programme contenu dans le docker nous envoie des mots un par un. Le challenge consiste à lui renvoyer les mots en les inversants. Ma première idée consiste à faire simplement un script pyhton qui renvoie le mot retourné. Mais problème : comment intérargir avec le challenge, ie récupérer les mots qu'il envoie et lui retourner les mots inversés ? En effet, une simple pipe ne suffit pas puisqu'il faut lire plusieurs fois ce qu'envoie le challenge et à chaque fois lui envoyer une réponse. From 03b6c8b1a6d2ff80541f3aa8720d32007118fbb1 Mon Sep 17 00:00:00 2001 From: Enotias Date: Wed, 14 Feb 2024 19:33:09 +0100 Subject: [PATCH 4/6] Update src/content/posts/wu_fcsc_2022_a_l_envers.md Co-authored-by: ClementMabileau --- src/content/posts/wu_fcsc_2022_a_l_envers.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/content/posts/wu_fcsc_2022_a_l_envers.md b/src/content/posts/wu_fcsc_2022_a_l_envers.md index 96df79a..66b4f70 100644 --- a/src/content/posts/wu_fcsc_2022_a_l_envers.md +++ b/src/content/posts/wu_fcsc_2022_a_l_envers.md @@ -1,5 +1,5 @@ --- -title: "Write-up de "A l'envers" - FSCS 2022" +title: "Write-up de 'A l'envers' - FSCS 2022" date: 2024-14-02 draft: false tags: ["write-up","FCSC","programming","pwntools"] From e2f95105f72449343c0bf2648c877134979e6305 Mon Sep 17 00:00:00 2001 From: Enotias Date: Wed, 14 Feb 2024 19:39:26 +0100 Subject: [PATCH 5/6] Update src/content/posts/wu_fcsc_2022_a_l_envers.md --- src/content/posts/wu_fcsc_2022_a_l_envers.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/content/posts/wu_fcsc_2022_a_l_envers.md b/src/content/posts/wu_fcsc_2022_a_l_envers.md index 66b4f70..08f8298 100644 --- a/src/content/posts/wu_fcsc_2022_a_l_envers.md +++ b/src/content/posts/wu_fcsc_2022_a_l_envers.md @@ -5,7 +5,7 @@ draft: false tags: ["write-up","FCSC","programming","pwntools"] --- -> on peut retrouver ce challenge sur [Hacropole](https://hackropole.fr/fr/challenges/misc/fcsc2022-misc-a-l-envers/) +> On peut retrouver ce challenge sur [Hacropole](https://hackropole.fr/fr/challenges/misc/fcsc2022-misc-a-l-envers/) ## Première idée Le programme contenu dans le docker nous envoie des mots un par un. Le challenge consiste à lui renvoyer les mots en les inversants. Ma première idée consiste à faire simplement un script pyhton qui renvoie le mot retourné. Mais problème : comment intérargir avec le challenge, ie récupérer les mots qu'il envoie et lui retourner les mots inversés ? En effet, une simple pipe ne suffit pas puisqu'il faut lire plusieurs fois ce qu'envoie le challenge et à chaque fois lui envoyer une réponse. From 0f20acde8a4daa443bb5b75b36679117a1129cee Mon Sep 17 00:00:00 2001 From: Enotias Date: Wed, 14 Feb 2024 19:40:25 +0100 Subject: [PATCH 6/6] Update src/content/posts/wu_fcsc_2022_a_l_envers.md --- src/content/posts/wu_fcsc_2022_a_l_envers.md | 1 + 1 file changed, 1 insertion(+) diff --git a/src/content/posts/wu_fcsc_2022_a_l_envers.md b/src/content/posts/wu_fcsc_2022_a_l_envers.md index 08f8298..859e668 100644 --- a/src/content/posts/wu_fcsc_2022_a_l_envers.md +++ b/src/content/posts/wu_fcsc_2022_a_l_envers.md @@ -1,6 +1,7 @@ --- title: "Write-up de 'A l'envers' - FSCS 2022" date: 2024-14-02 +author: Thomas Roberge draft: false tags: ["write-up","FCSC","programming","pwntools"] ---