f200 – Number π
Description
Find the flag in this file.
Solução
Conseguimos matar esse challenge após o CTF, visto que só 3 times conseguiram resolver durante a competição, e não foram lançados write-ups do mesmo. Pedimos uma dica no canal do ASIS, e alguém falou:
1 |
<mxn> pi apparently was pifs |
Com essa dica, pesquisamos sobre o pifs e achamos o link do projeto no github: https://github.com/philipl/pifs. Conforme as palavras (irônicas) do autor: “πfs is a revolutionary new file system that, instead of wasting space storing your data on your hard drive, stores your data in π! You’ll never run out of space again – π holds every file that could possibly exist! They said 100% compression was impossible? You’re looking at it!”
Olhando atentamente o png que foi disponibilizado no challenge, podemos ver vários 0s e 1s no meio da imagem, mas como ela está com transparência, fica de difícil visualização. Olhando com a tool stegsolve, fica mais claro:
Extraindo eles, temos:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
11010100000 00101000101000000010 000100100000001010001010000 0001010011110000000000011101000 0000000011001000000000000111100000 0001111000100000000110001100000000100 011101000000000000101100000001101001010 0000101010001110000000000011101000000010 010010000000000101011110000001110101111000 0001110101111000000111111000100000000000111 010000000110101111000000110001110100000001 010101110000000110100101000001010111000000 0000100101011100000001110110010000000001 010111000000011111000100000000101011110 00000110000101100000000010001110000 00000010010000000000101011110000 00110001110100000000010101110 000000110000000000000110 110000100000000 |
Após criarmos um arquivo de teste do pifs para entendermos seu funcionamento, tivemos certeza de que se tratava do mesmo. O pifs calcula o pi diretamente na base hexadecimal (http://www.wolframalpha.com/input/?i=pi+in+hexadecimal), então ele pega 2 digitos hexadecimais de PI começando na posição dada por um short, por isso 2 bytes da pifs são usados para representar 1 do arquivo original, sendo que um short ocupa 2 bytes. Sabendo isso, revertemos os bits para a flag:
Criamos o arquivo gera_metadata.py:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
#!/usr/bin/python2.7 metadata = """ 11010100000 00101000101000000010 000100100000001010001010000 0001010011110000000000011101000 0000000011001000000000000111100000 0001111000100000000110001100000000100 011101000000000000101100000001101001010 0000101010001110000000000011101000000010 010010000000000101011110000001110101111000 0001110101111000000111111000100000000000111 010000000110101111000000110001110100000001 010101110000000110100101000001010111000000 0000100101011100000001110110010000000001 010111000000011111000100000000101011110 00000110000101100000000010001110000 00000010010000000000101011110000 00110001110100000000010101110 000000110000000000000110 110000100000000 """ metadata = ''.join([c for c in metadata if c in '01']) metadata = '0' * (8 - len(metadata)%8) + metadata with open('metadata', 'wb') as f: f.write(''.join([chr(int(metadata[i:i+8],2)) for i in xrange(0,len(metadata),8)])) |
E executamos:
1 2 3 4 5 6 7 |
mkdir -p mdd && cd mdd python ../gera_metadata.py cd .. mkdir -p mnt ./πfs -o mdd=$(readlink -f mdd) mnt cat mnt/metadata ASIS{4716b435ce8ddd6ede25a2926d0c8d42} |
Flag
ASIS{4716b435ce8ddd6ede25a2926d0c8d42}
Criador por
CTF-BR Team
© 2014 - Todos os Direitos Reservados