CTF #nullcon 2012: Programación 3

nullcon1.jpg

En el tercer nivel nos encontramos con un trozo de código escrito en Brainfuck, un lenguaje un tanto peculiar y que claramente hace honor a su nombre. Algún le dedicaré una entrada en el blog.

El código con en el que tenemos que lidiar es este:

>+++++++[<+++++++>-]<---
.
.
>+++++[<+++++>-]<++
>++++++[<++++++>-]<+
>+++++++++[<--------->-]<+++
>++++++++[<++++++++>-]<++++++
>++[<-->-]<-
++
>++++[<++++>-]<+
>++++++++[<-------->-]<--------
>+++[<--->-]<---
>+++++++++[<+++++++++>-]<---
>+++[<--->-]<
>++++[<++++>-]<+
>++++[<---->-]<-
>++++[<++++>-]<---
>+++++++++[<--------->-]<-
>++++++++[<++++++++>-]<+++++
>++++[<++++>-]<+
>++++[<---->-]<-
>++++[<++++>-]<---
>+++++++++[<--------->-]<-
>+++++++++[<+++++++++>-]<++++
--
>++++[<---->-]<++
>++++++++[<-------->-]<-----
>++++++++[<++++++++>-]<+++++++
--
>++++[<++++>-]<-
-
>+++++++++[<--------->-]<++++++
+
>+++[<--->-]<
>+++++++++[<+++++++++>-]<--
+++
>+++++++++[<--------->-]<-
>+++++++++[<+++++++++>-]<++
---
++
>+++[<--->-]<
>++[<++>-]<+
>++[<++>-]<++
>++++[<---->-]<++
>++++++++[<-------->-]<++
+
+++
>+++[<--->-]<---
>+++++++++[<+++++++++>-]<-
>+++[<--->-]<--
>++++[<++++>-]<---
>+++[<--->-]<
>++[<++>-]<++
>+++[<--->-]<--
>+++++++[<------->-]<-----
>++++[<---->-]<++
>++++++[<++++++>-]<+++++
>+++++[<+++++>-]<++++
>++++++++[<-------->-]<------
>+++++++++[<+++++++++>-]<++++++++
>+++[<--->-]<-
>++[<++>-]<++
>+++++++++[<--------->-]<----
>++++++++[<++++++++>-]<++++
>+++[<+++>-]<++
>+++++++++[<--------->-]<++
>+++++++++[<+++++++++>-]<++++++
>++++[<---->-]<--
>++++++++[<-------->-]<-----
>+++++++++[<+++++++++>-]<++++++
>++++[<---->-]<++
+++
.
>+++++++++[<--------->-]<+++++
>+++++++++[<+++++++++>-]<++
>++++[<---->-]<++
>+++[<+++>-]<
>+++[<--->-]<-
>++++++++[<-------->-]<----
>++++++++[<++++++++>-]<+++++
>++++[<++++>-]<+
>++++[<---->-]<+++
+++
>+++++++++[<--------->-]<+++++
>++++++++[<++++++++>-]<++++
>++++[<++++>-]<+++
>+++++[<----->-]<+++
>++++[<++++>-]<+
>+++[<--->-]<---
>++++[<++++>-]<---
>+++++++++[<--------->-]<--
>++++++++[<++++++++>-]<+
>++[<++>-]<+
>++++[<++++>-]<--
>++++[<---->-]<+
>++++[<++++>-]<---
>+++++++++[<--------->-]<-
>+++++++++[<+++++++++>-]<++++++++
>+++[<--->-]<-
>++[<++>-]<++
>++++++++[<-------->-]<-------
.

Si buscas por Google hay muchos intérpretes y conversores para este lenguaje. Si ejecutamos dicho código tal y como está, esta es la salida: ..l.. Después de mirar un rato y depurar un poco el código, la solución a la que llegué fue poner un ‘.’ (punto) al final de cada línea que no tenía punto. El punto significa poner el byte actual en la salida. Así tras haber hecho eso y ejecutar de nuevo la salida que obtenemos es:

…In fact, never ever use gets() or sprintf(), period. If you do we will send evil dwarfs after you.. Que es nuestro flag.