Navaja Negra 7e – Transmission

Aquí os traigo el segundo writeup del CTF de Navaja Negra, esta vez es una prueba de stego en la que nos dan un wav y el siguiente enunciado y pista:

Transmission

150

Hey Rick! A transmision from Fvk-u-1337!

Hint: This gonna FUCK your BRAIN!

La verdad es que hasta que no leí la pista no se me ocurrió que demonios hacer con esta prueba, pero luego de verla deduje que básicamente lo que teníamos que obtener es un brainfuck del wav.

Para comenzar utilice la librería de python wave para poder abrir el wav e ir analizando poco a poco a mano el contenido de cada frame para obtener los 8 posibles valores que tiene el código de brainfuck y obtuve los siguientes resultados:

0:3395700
1:705600
2:4939200
3:1455300
4:705600
5:705600
6:1278900
7:0

Como veis uno de ellos da 0, supuse que sería la “,” ya que se utiliza para input, con lo cual nos quedamos con 7 caracteres a utilizar, pero ¿esos números son un poco grandes no? Como estaba leyendo frame a frame en lugar de utilizar el sample rate, calculando el MCD de todos esos valores veo que coincide con el Sample Rate de 44100, lo cual reduce considerablemente la cantidad de caracteres con los que trabajar.

Con esto ya tenemos identificados que frames corresponden a cada uno de los caracteres de brainfuck, ahora solo nos queda probar todas las posibles combinaciones y ejecutar el código para ver si todo está bien.

Buscando por google me encontré con esta librería para python que nos da la posibilidad de ejecutar código de brainfuck fácilmente: https://github.com/pocmo/Python-Brainfuck

Mi código final quedó así:

import wave
import brainfuck
from itertools import product, combinations, permutations

f = wave.open("test_mono.wav", "r")
longitud = f.getnframes()
g=open("output.raw", "w")
output=""

stuff=["+","-","[","]","<",">","."]
for i in xrange(1, (longitud/44100)+1):
	frame=f.readframes(44100)
	if frame == "\xa6\x03"*44100:
		output+="0"
	elif frame == "K\x07"*44100:
		output+="1"
	elif frame == "\xf0\n"*44100:
		output+="2"
	elif frame == "\x95\x0e"*44100:
		output+="3"
	elif frame == "9\x12"*44100:
		output+="4"
	elif frame == "}\x19"*44100:
		output+="5"
	elif frame == "\xdb\x15"*44100:
		output+="6"



for x in list(permutations(stuff, 7)):
	buff=str(output)
	buff=buff.replace("0",x[0])
	buff=buff.replace("1",x[1])
	buff=buff.replace("2",x[2])
	buff=buff.replace("3",x[3])
	buff=buff.replace("4",x[4])
	buff=buff.replace("5",x[5])
	buff=buff.replace("6",x[6])
	try:
		g.write(brainfuck.evaluate(buff))
	except:
		pass

g.close()

Como veis primero genero un string utilizando place holders con el código de brainfuck y a continuación realizo una iteracción por todas las posibles combinaciones ejecutando el código y guardando el output en un archivo.

No salió tan limpio como yo esperaba… Entre los loops infinitos que se generaban en brainfuck, problemas de codificación, que la librería escribía a sys.stout y tuve que editarla ….

Pero el resultado si que fue satisfactorio, después de unos pocos interrupts con el teclado y finalmente teniendo que matar el proceso el archivo de output mostraba un montón de basura al final del tailf que estaba usando para ver el output, pero revisando todos los resultados nos encontramos la flag:

Flag: nn7ed{G3t_Schwifty_and_h0rny}

Ni de lejos es la solución más limpia que existe y el script se puede mejorar de mil maneras, pero después del trabajo que me dio me conforme con contentarme en sacar la flag jeje.

Espero os haya gustado, saludos y gracias por la visita!

Agradecimiento a @SerBarristan por corregirme el typo en la flag … otra vez xD

Esta entrada fue publicada en ctf, estego, navaja negra 7e, writeups. Guarda el enlace permanente.

3 respuestas a Navaja Negra 7e – Transmission

  1. Mikel dijo:

    Muy interesante solución!. Te quería comentar si tienes pensado escribir el writeup del 1er Challenge Web, estoy comenzando a jugar CTF, y aunque este se supone es el mas básico de los ejercicios, no lo he podido hacer. Me esta matando la cabeza. Saludos

    • KALRONG dijo:

      Pues la verdad es que no tenía pensado ya que no miré los de web ya que no es precisamente mi especialidad jeje pero si puedo intentaré hacerlo aunque estos días estaré liado con los de la cybercamp para publicarlos todos juntos

Responder a MikelCancelar respuesta

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.