Я прошел недавно Matasano Microcorruption CTF. Очень крутой challenge для тех кто хочет "пощупать" реверсинг для встроенных платформ или проэксплуатировать переполнение буфера в 16-битном микропроцессоре и написать шелкод для него. Но не имеет возможности или не знает с чего начать.

Смысл квеста "ломать" замкИ, которые работают на микроконтроллере MSP430. Все работает в браузере - парни из Matasano Security постарались и написали онлайн отладчик/дизассемблер для MSP430. Всего 19 уровней с возрастающей сложностью. Над последними двумя уровнями придется "поморщить мозг". Очень зачетный квест.

Отладчик в браузере - это очень удобно с одной стороны. Можно проходить квест лежа на диване с планшетом. В то же время отладчик имеет весьма ограниченный набор команд. Через 10 минут неактивности сессия отваливается и все выставленные брейкпоинты исчезают - нужно их заново ставить, что раздражает. К тому же последние уровни содержат много ассемблерного кода. Поэтому браузерный отладчик не очень удобен и хочется полноценного gdb.

Фанат микропроцессора MSP430 и Matasano Microcorruption CTF  написал эмулятор -  https://github.com/cemeyer/msp430-emu-uctf. На гитхабе написано подробно как ставить этот эмулятор и коннектить к нему GDB. В качестве аргумента эмулятору передается romfile.

Выкладываю питон-скрипт который конвертит live memory dump из браузерного отладчика в romfile. Может кому пригодится.


import binascii, sys

def main():
    fINname = sys.argv[1]
    fOUTname = sys.argv[2]
    
    fIN = open(fINname,"rb")
    fOUT = open(fOUTname,"wb")

    bytesWritten = 0

    while True:
        line  = fIN.readline()

        if line == "":
            break
        
        l = line.split(" ")

        a0 = int(l[0][:-1],16)
       
        if l[-1] == "*\r\n":
            line = fIN.readline()
            l = line.split(" ")

            a1 = int(l[0][:-1],16)

            for i in range(a1-a0):
                fOUT.write("\x00")
                bytesWritten += 1
            
        s = binascii.unhexlify("".join(l[3:-3]))
        fOUT.write(s)
        bytesWritten += len(s)

    print "[+] Bytes written",bytesWritten
    fIN.close()
    fOUT.close()

if __name__ == "__main__":
    main()