Flag Hunters writeup

Descripción
Lyrics jump from verses to the refrain kind of like a subroutine call. There’s a hidden refrain this program doesn’t print by default.
Can you get it to print it? There might be something in it for you.
The program’s source code can be downloaded here.
Connect to the program with netcat: $ nc verbal-sleep.picoctf.net 60492
Flag Hunters solución
Nos descargamos el archivo y le echamos un vistazo al código.
codium lyric-reader.py
Lo más importante es lo siguiente:
elif re.match(r"CROWD.*", line):
crowd = input('Crowd: ')
song_lines[lip] = 'Crowd: ' + crowd
lip += 1
Este fragmento hace que lo que introduzcamos por pantalla se almacene en el array de las canciones. Será nuestra única forma de interactuar con el programa.
for line in song_lines[lip].split(';'):
...
elif re.match(r"RETURN [0-9]+", line):
lip = int(line.split()[1]
El programa separa las lineas de song_lines[lip] por ‘;’, además, tenemos acceso a este array debido a que podemos introducir texto en el ‘Crowd:’. Una de las palabras clave que se usan es ‘RETURN’, que mueve el ‘lip’ (puntero para imprimir la canción) al valor que proporcionemos en el return.
secret_intro = \
'''Pico warriors rising, puzzles laid bare,
Solving each challenge with precision and flair.
With unity and skill, flags we deliver,
The ether’s ours to conquer, '''\
+ flag + '\n'
Por último, tenemos la intro secreta, donde se encuentra la flag, pero que no aparecerá de base al interactuar con el servidor.
Con lo cual, tenemos que insertar en el array de canciones una cadena de caracteres tal que ‘test;RETURN 3’, para que, en la siguiente ejecución, se separen con el ‘;’ y el RETURN nos lleve al final de la intro secreta. El número 3 se obtiene de contar las líneas de la intro secreta (empezando por el 0), para imprimir sólo la última.

Nota: También se puede usar ‘RETURN 0’, haciendo que se imprima toda la intro secreta y no sólo la flag.
Con esto se habría completado el CTF.
