crushing
Autor: HenriUz
Código:
Este desafio consiste em analisar um código que fez uma "criptografia" em um texto. Existem 3 funções principais no código:
main
:
Aqui nós temos algumas variáveis sendo criadas, as principais são: a lista
(nome editado por mim) que irá armazenar ponteiros; o local_10
que conta a posição que o caractere/hexadecimal aparece; o local_14
que vai pegando os caracteres.
No código o primeiro for
zera a lista
e o segundo lê os caracteres digitados (?), no final a função que irá escrever no arquivo é chamada.
add_char_to_map
:
Essa função recebe três parâmetros, o primeiro é a lista
, o segundo é o binário do caractere char
e o terceiro o índice/posição idx
que ele aparece. No código nós também temos outras variáveis importantes: local_10
é a variável que irá calcular uma posição na lista por meio da multiplicação do binário do caractere e 0x8
, e receberá o valor apontado por aquela posição (note que na primeira vez que entrar em uma posição nova o valor vai ser zero, ou seja, não aponta para nada); puVar1
é um ponteiro que irá apontar para o índice informado.
O código inicialmente verifica se local_10
é nulo (não aponta para nada), se for ele salva naquela posição o puVar1
(índice do caractere), se não for ele entra em for que irá percorrer as posições seguintes à calculada inicialmente até achar uma que não aponte para nada, salvando nessa posição o índice.
serialize_and_output
:
Essa função recebe apenas a lista
como parâmetro (no código param_1
), suas variáveis importantes são: pp
que é um ponteiro de ponteiro e irá receber o ponteiro armazenado na posição calculada pela multiplicação do local_c
(o i
do for) e 0x8
; local_28
recebe o número de caracteres iguais (como a posição dos caracteres iguais estão colocados de forma adjacente na lista, a função list_len
recebe a posição e verifica quantas casas ela tem que andar para ficar nulo).
O código tem um loop indo de 0 até 255, e para cada iteração ele usa o valor do local_c
para calcular uma posição na lista (note que terá vezes que esse valor irá bater com o binário dos caracteres digitados) e irá escrever no arquivo o tamanho seguido pelas posições que o caractere (local_c
convertido para hexadecimal) aparece na mensagem (se o tamanho não for 0).
Resolução:
Se abrirmos o arquivo com um editor de texto normal não iremos entender nada, mas se abrirmos com um hexdump iremos ver exatamente o que aconteceu no código, ou seja, irá ter um valor indicando a quantidade e em seguida as posições.
Como resolver: um script básico em python já o suficiente. Primeiro importamos a biblioteca pwn, abrimos o arquivo e e criamos uma string para conter a mensagem
Depois percorremos o arquivo da mesma forma que ele foi armazenado
Resultado:
Organizer 1: Hey, did you finalize the password for the next... you know?
Organizer 2: Yeah, I did. It's "HTB{4_v3ry_b4d_compr3ss1on_sch3m3}"
Organizer 1: "HTB{4_v3ry_b4d_compr3ss1on_sch3m3}," got it. Sounds ominous enough to keep things interesting. Where do we spread the word?
Organizer 2: Let's stick to the usual channels: encrypted messages to the leaders and discreetly slip it into the training manuals for the participants.
Organizer 1: Perfect. And let's make sure it's not leaked this time. Last thing we need is an early bird getting the worm.
Organizer 2: Agreed. We can't afford any slip-ups, especially with the stakes so high. The anticipation leading up to it should be palpable.
Organizer 1: Absolutely. The thrill of the unknown is what keeps them coming back for more. "HTB{4_v3ry_b4d_compr3ss1on_sch3m3}" it is then.
Flag: HTB{4_v3ry_b4d_compr3ss1on_sch3m3}
HTB{4_v3ry_b4d_compr3ss1on_sch3m3}
Atualizado