[Misc] circuito #HackTheFDI

Este reto consistía en resolver un circuito digital por lo que tuve que desempolvar los apuntes de FC de primero. El circuito venía incompleto ya que le faltaba la ROM que se encontraba en otro reto.

El circuito es el siguiente:

securityrobot

y la memoria ROM tenía los siguientes datos:

rom

Para automatizar el proceso e intentar hacerlo lo menos aburrido posible me programé un script en python para resolverlo.

#!/usr/bin/env python

def generateBinaryTable(binTable):
    a = 0
    while a < 16:
        binTable.append(str(bin(a))[2:].rjust(4, '0'))
        a = a + 1

# a = first bit
# b = second bit
# c = carry
#
# return sum, carry
def sumaBit(a, b, c):
    f = 0
    sum = 0
    carry = 0

    if a == 0 and b == 0:
        if c == 0:
            sum = 0
        elif c == 1:
            sum = 1
    elif a == 0 and b == 1:
        if c == 0:
            sum = 1
        elif c == 1:
            sum = 0
            carry = 1
    elif a == 1 and b == 0:
        if c == 0:
            sum = 1
        elif c == 1:
            sum = 0
            carry = 1
    elif a == 1 and b == 1:
        if c == 0:
            sum = 0
            carry = 1
        elif c == 1:
            sum = 1
            carry = 1

    return sum, carry

if __name__ == '__main__':
    binTable = []
    generateBinaryTable(binTable)
    for item in binTable:
        # INPUT --------------------------------
        x0 = int(item[3])
        x1 = int(item[2])
        x2 = int(item[1])
        x3 = int(item[0])

        a0 = x0
        a1 = x1
        a2 = a3 = b0 = b1 = b2 = 0
        b3 = x2
        # ---------------------------------------

        # ADDER ---------------------------------
        s0 = s1 = s2 = s3 = 0
        acarreo = 0

        s0, acarreo = sumaBit(a0, b0, acarreo)
        s1, acarreo = sumaBit(a1, b1, acarreo)
        s2, acarreo = sumaBit(a2, b2, acarreo)
        s3, acarreo = sumaBit(a3, b3, acarreo)

        # MUX 2a1 - 1 ---------------------------
        if s1 == 0:   e1 = 1
        elif s1 == 1: e1 = 0

        if x2 == 0:
            a0 = 1
        elif x2 == 1:
            a0 = e1
        # ---------------------------------------

        # MUX 2a1 - 2 ---------------------------
        if x2 == 0:
            a1 = 0
        elif x2 == 1:
            a1 = s1
        # ---------------------------------------

        # DEC 2a4 -------------------------------
        if s2 == 0 and s3 == 0:
            # 0001
            a2 = 1
            a3 = 0
        elif s2 == 0 and s3 == 1:
            # 0010
            a2 = 0
            a3 = 0
        elif s2 == 1 and s3 == 0:
            # 0100
            a2 = 0
            a3 = 0
        elif s2 == 1 and s3 == 1:
            # 1000
            a2 = 0
            a3 = 1
        # ---------------------------------------

        # ROM 16a4 ------------------------------
        rom = ["0111","1110","0101","0011","1000",
               "0001","1010","1100","1111","1110",
               "0100","0011","0101","0000","1011",
               "0110"]
        # print str(a3)+str(a2)+str(a1)+str(a0)
        position = int(str(a3)+str(a2)+str(a1)+str(a0), 2)
        # print position

        e0 = int(rom[position][3])
        e1 = int(rom[position][2])
        e2 = int(rom[position][1])
        e3 = int(rom[position][0])
        # print str(e3)+str(e2)+str(e1)+str(e0)
        # ---------------------------------------

        # MUX 4a1 -------------------------------
        # Only 00 or 10 outputs
        if x3 == 0:
           f = e0
        elif x3 == 1:
           f = e2
        # ---------------------------------------

        print f,

Ejecutamos el programa para obtener los bits de la función f del circuito:

$ python circ.py

misc_circ_done

La flag es: 1111001100001111

Esta entrada fue publicada en CTF, HackTheFDI, Misc. Guarda el enlace permanente.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

w

Conectando a %s