String Cryptography

Home / Wiki / String Cryptography

String Cryptography

> Pwn2Win > Pwn2Win 2016 > String Cryptography

Analyze the samples below, obtained by intercepting some Club communications, in order to understand the logic behind the codification/generation of the strings. Then, access the address below and decode the 10 words which will be provided. Learning how to decode this will be useful again later!

Samples we obtained:

“Flow” -> Original string (plaintext) -> Codified string

[5, 0, 8, 3, 4, 9, 6, 2, 7, 1] -> aDuLteRInE -> iKbTcfTKqI
[1, 3, 6, 4, 9, 2, 7, 0, 8, 5] -> aboMINAblE -> igvNRVEdqI
[0, 9, 2, 8, 4, 7, 5, 1, 6, 3] -> ACIdophiLS -> JHQjvwkmPS
[5, 6, 9, 1, 3, 8, 2, 4, 7, 0] -> hypOCOtYLs -> mhtPJOcCNy
[9, 7, 6, 3, 4, 0, 5, 8, 1, 2] -> fuRcATIOns -> kcAiATLXou
[6, 0, 1, 2, 8, 7, 9, 4, 5, 3] -> ACeTaNiLid -> BCmYfRiTpk
[8, 0, 4, 5, 2, 7, 3, 6, 1, 9] -> FURriErIes -> JAYynIsKet
[9, 1, 8, 3, 6, 7, 0, 2, 5, 4] -> KidnAPPeRs -> MrivJRWkUw
[0, 5, 2, 9, 1, 6, 8, 4, 7, 3] -> GarmeNTiNG -> LjatlNBmRI
We already discovered some properties of the codification by carrying a fast cryptanalysis which might be helpful:

“0” is the string’s initial position
Periodic boundary condition
Case sensitive codification

Format of the result expected by the server: word1,word2,word3,…

nc pool.pwn2win.party 4040

Primeiro tentamos identificar como a cifra é feita. Pelos exemplos aparenta ser uma cifra de permutação, onde o fluxo faz o papel da chave. Além disso, a dica “‘0’ is the string’s initial position” deu a entender que cada dígito do fluxo indica um caractere da string. Resta saber como identificar a chave da permutação para cada caractere.

A primeira ideia que tivemos é que o dado um dígito no fluxo (ex: 0), o dígito seguinte indica a chave de permutação. Verificando pelo dígito 0, isso realmente acontece. Por exemplo, na primeira cifra fornecida ([5, 0, 8, 3, 4, 9, 6, 2, 7, 1] -> aDuLteRInE -> iKbTcfTKqI) o primeiro caractere é somado com 8, já que 8 sucede 0 no fluxo.

Esse padrão, porém não se repete para todos os caracteres. Então notamos que para os dígitos ímpares a chave do fluxo é o dígito anterior a ele. Por exemplo, no fluxo [5, 0, 8, 3, 4, 9, 6, 2, 7, 1] a chave do caractere 1 é 7.

Com isso escrevemos o código para decifrar uma mensagem a partir de um fluxo, mostrado abaixo.

Agora, só precisamos conectar com o servidor para receber as cifras dele, decifrar e enviar a resposta. Para fazer isso usamos a biblioteca pwntools. O código completo é mostrado abaixo:

Ao executar este código, obtivemos a flag do servidor:

CTF-BR{This_encryption_is_crazy_bro!_Thinking_different…}

Criado por

Pão de Batãta

Recent Posts