Skip to content

Utils

Formatter

def formatter(data: str, label: str= 'cidsi') -> str:  
    return f'{label}{{{data}}}'

md5 hasher

import hashlib  

from ctf.utils.formatter import formatter  


def convert_to_md5(data: str) -> str:  
    md5_hash = hashlib.md5(data.encode())  
    formatted_string = formatter(md5_hash.hexdigest())  
    return formatted_string

Bacon Cipher Decoder

# Define the Bacon Cipher dictionary  
bacon_dict = {  
    'AAAAA': 'A', 'AAAAB': 'B', 'AAABA': 'C', 'AAABB': 'D', 'AABAA': 'E',  
    'AABAB': 'F', 'AABBA': 'G', 'AABBB': 'H', 'ABAAA': 'I', 'ABAAB': 'K',  
    'ABABA': 'L', 'ABABB': 'M', 'ABBAA': 'N', 'ABBAB': 'O', 'ABBBA': 'P',  
    'ABBBB': 'Q', 'BAAAA': 'R', 'BAAAB': 'S', 'BAABA': 'T', 'BAABB': 'U',  
    'BABAA': 'W', 'BABAB': 'X', 'BABBA': 'Y', 'BABBB': 'Z'  
}  

def decode_bacon_cipher(encoded_message):  
    # Split the encoded message into chunks of 5 characters  
    chunks = [encoded_message[i:i+5] for i in range(0, len(encoded_message), 5)]  
    # Decode each chunk using the Bacon Cipher dictionary  
    decoded_message = ''.join([bacon_dict.get(chunk, '?') for chunk in chunks])  
    return decoded_message

PASE PERDIDO =’) POR LA TÓXICA XD

Enunciado

Pablito faltó a clases y quiere participar en la 4 Competencia de Seguridad Informática CIDSI, uno de sus docentes le dejo una pista, será que Pablito participa de la Competencia??? 494a55574b3354574d565847535a44504c354255535243544a465054454d425347493d3d3d3d3d3d

Solución

import base64  

from ctf.utils.convert_to_md5 import convert_to_md5  

data_input = '494a55574b3354574d565847535a44504c354255535243544a465054454d425347493d3d3d3d3d3d' # this is hex encoded  
decoded = bytes.fromhex(data_input).decode() # decode the hex, 'IJUWK3TWMVXGSZDPL5BUSRCTJFPTEMBSGI======' -> this is base32 encoded  
print(decoded)  
decoded = base64.b32decode(decoded).decode()  # decode the base32, 'Bienvenido_CIDSI_2022' -> this is flag  
print(decoded)  
print(convert_to_md5(decoded))  
# 28e043ef6109375dafe8d541f2896bed  
# 28e043ef6109375dafe8d541f2896bed

Tocino

Enunciado

Puerco Araña nos dejo un mensaje en un idioma muy extraño. ¿Ayudaños a entendrlo por favor? AAABABAAAAABAAAABBBABAABAABBABAABBABAAAAAAAAAAABABABAAAAAAAAAAAABAAAAAAAABAABBABABBAA

el anunciado describe una cadena en este formato AAABABAAAAABAAAABBBABAABAABBABAABBABAAAAAAAAAAABABABAAAAAAAAAAAABAAAAAAAABAABBABABBAA y a esto se le conoce como código Bacon o (código Bacon), un sistema de cifrado ideado por Francis Bacon en el siglo XVI.

Este tipo de cifrado consiste en generar combinaciones de 5 letras usando una alfabeto binario que se representa solo por las letras A, B. Por ejemplo - A = AAAAA - B = AAAAB - C = AAABA entonces la cadena quedaría como:

AAABA BAAAA ABAAA ABBBA BAABA ABBAB AABBA BAAAA AAAAA AABAB ABAAA AAAAA AAAAB AAAAA AAABA ABBAB ABBAA
entonces usamos https://cyberchef.org/, con el Bacon Cipher Decode obtenemos que la cadena es igual a CRIPTOGRAFIABACON usando python
from ctf.utils.bacon_decoder import decode_bacon_cipher  
from ctf.utils.formatter import formatter  

data = 'AAABABAAAAABAAAABBBABAABAABBABAABBABAAAAAAAAAAABABABAAAAAAAAAAAABAAAAAAAABAABBABABBAA'  
decoded = decode_bacon_cipher(data)  
print(formatter(decoded))

Bases

Este es un ejercicio muy bueno, parta solucionar el ejercicio me llevo a pensar mucho tiempo a pesar de ser muy fácil, la idea final del ejercicio proviene de un blog Challenge 13: bases | ctf-writeups

Enunciado

Esto es de cajon si sabes de que hablo lo resolverás rápido siempre hay que aprender las bases del encriptado. Así que comienza.

La entrada es

9e^6t:./`?>'a@B>#\O@@7FdK<`j0;9l"Qb=]]]_=]e]q@W#_$9h0"X<*4)r@5(GW='&:?<btZ39egTB<`iig9en_!:KL^u9iZ:,:01RP>"D7S;__0B=&rILA5u689l<ET:KC>:@k]WW@VfRi@TGcX

Solución

Entonces se me que es desencriptarlo con todas las base 85,64,62,58,,32

logrado en cyber chef ![[Pasted image 20241216051940.png]] entonces la bandera es:

hay_que_aprender_las_bases

Algo le pasa a mi cabeza

algo le pasa es mi cabeza es un ejercicio muy interesante ya que la cadena que se nos da la parecer son las instrucciones de un lenguaje de programación llamado Brainfuck

Breve introducción a Brainfuck

  1. Comandos básicos:

    • >: Mueve el puntero de memoria una celda a la derecha.
    • <: Mueve el puntero de memoria una celda a la izquierda.
    • +: Incrementa el valor en la celda actual.
    • -: Decrementa el valor en la celda actual.
    • [ y ]: Comienzo y final de un bucle (si el valor actual es 0, salta al final del bucle).
    • .: Imprime el carácter ASCII correspondiente al valor en la celda actual.
    • ,: Lee un carácter de entrada y almacena su valor ASCII en la celda actual.
    • Propósito:
      El lenguaje manipula directamente valores ASCII en celdas de memoria. Cada secuencia como la que muestras probablemente genera texto al decodificarse.

Cómo interpretar la cadena

Tu cadena realiza una serie de operaciones en memoria para generar caracteres ASCII como salida. Cada grupo de comandos ajusta el valor en las celdas y los imprime.


Interprete Brainfuck

def brainfuck_interpreter(code):
    """Interprets Brainfuck code and returns the output."""
    memory = [0] * 30000  # Memory array
    pointer = 0  # Memory pointer
    output = []
    code_pointer = 0  # Code pointer
    loop_stack = []  # Stack to handle loops

    while code_pointer < len(code):
        command = code[code_pointer]

        if command == '>':
            pointer += 1
        elif command == '<':
            pointer -= 1
        elif command == '+':
            memory[pointer] = (memory[pointer] + 1) % 256
        elif command == '-':
            memory[pointer] = (memory[pointer] - 1) % 256
        elif command == '.':
            output.append(chr(memory[pointer]))
        elif command == ',':
            # Input is not handled in this example
            pass
        elif command == '[':
            if memory[pointer] == 0:
                # Jump to the command after the matching ']'
                open_brackets = 1
                while open_brackets > 0:
                    code_pointer += 1
                    if code[code_pointer] == '[':
                        open_brackets += 1
                    elif code[code_pointer] == ']':
                        open_brackets -= 1
            else:
                loop_stack.append(code_pointer)
        elif command == ']':
            if memory[pointer] != 0:
                code_pointer = loop_stack[-1]
            else:
                loop_stack.pop()

        code_pointer += 1

    return ''.join(output)

# Brainfuck program provided
brainfuck_code = ">+++++++++++[<+++++++++++>-]<-----.+.>+++++[<----->-]<+++.>++++[<++++>-]<--.--------.>+++[<+++>-]<.++++++.>++++[<---->-]<+.------.++++++.>++++[<++++>-]<--.+.>++++[<---->-]<---.--.>+++[<+++>-]<++.+++++.>+++[<--->-]<--.+++++.-----.---.>++++++++[<-------->-]<-."
decoded_output = brainfuck_interpreter(brainfuck_code)
print(decoded_output)

la bandera es tu_mente_esta_jodida

Ok?

un ejercicio muy interesante hablando de leguajes de programación raras

La cadena que proporcionaste, "Ook. Ook? Ook. ..." es una referencia directa a "The Secret of the Ook", una frase famosa utilizada en la obra de "Brainfuck".

La clave está en que "Ook" es un término recurrente en una parodia del lenguaje de programación Brainfuck, utilizada para hacer referencia a una versión simplificada de este lenguaje llamada "Ook!".

Compilador

Ook! Programming Language - Esoteric Code Decoder, Online Translator

la bandera es lenguaje_de_monos