Writeup: FlareOn 2022: 003 - Magic 8 Ball

Task description

1. TLDR

TLDR graph

2. Dane wejściowe

Plik z zadaniem znajduje się tutaj. Hasło: flare.

Przedmiotem zadania był plik PE wraz z plikami towarzyszącymi:

Magic8Ball.exe
SDL2.dll
SDL2_image.dll
SDL2_ttf.dll
assets/
libjpeg-9.dll
libpng16-16.dll
libtiff-5.dll
libwebp-7.dll
zlib1.dll

./assets:
DroidSans.ttf
LICENSE.txt
NotoSans_Regular.ttf
OFL.txt
OpenSans_regular.ttf
ball_paint.png

Nazwy plików sugerowały, że program został wytworzony z wykorzystaniem technologii SDL (Simple DirectMedia Layer)

3. Analiza wstępna

Zweryfikowałem typ pliku Magic8Ball.exe :

$ file Magic8Ball.exe
Magic8Ball.exe: PE32 executable (GUI) Intel 80386, for MS Windows

Program po uruchomieniu prezentował okno jak poniżej:

main window

Następnie załadowałem program do środowiska IDA

4. Analiza kodu

Moją uwagę zwrócił jeden z fragmentów kodu, który odpowiedzialny był za weryfikację kolejności wciśniętych klawiszy:

key

Oczekiwana kolejność wciśniętych klawiszy została zapisana poniżej:

LLURULDUL

Następnie następowało wywołanie funkcji odpowiadającej za odczytanie flagi:

call_get_flag

Zanim to miało jeszcze nastąpić, weryfikowana była poprawność podanego pytania: gimme flag pls?

5. Odczytanie flagi

Po wprowadzeniu pytania gimme flag pls? oraz wprowadzeniu sekwencji klawiszy LLURULDUL[ENTER] była prezentowana flaga:

flag

U_cRackeD_th1$_maG1cBaLL_!!_@flare-on.com

6. Wersja alternatywna

Zaglądając głębiej do funkcji odpowiadającej za odczytanie flagi, można było poznać charkaterystyczne pętle dla algorytmu RC4. Szyfrogramem były wartości dodawane na stos:

ciphertext

Kluczem był oczekiwany ciąg wciśniętych klawiszy LLURULDUL

Napisałem zatem skrypt w celu odszyfrowania flagi:

from malduck import rc4

encrypted = [b"\x33\x12\x2A\x35",
    b"\xB2\x64\x57\x87", 
    b"\x34\xA6\xEF\x00", 
    b"\x3E\xDE\xE0\x01", 
    b"\x40\xEC\x21\x01", 
    b"\xB0\x69\x1D\x26", 
    b"\x7B\xB2\x69\xB0", 
    b"\x06\xEB\x22\x56", 
    b"\xCB\x5D\xF2\xBE", 
    b"\x51\x2B\x0F\x79",
    b"\x00\x00\x00\x55"]
 
ciphertext = b''.join([dword[::-1] for dword in encrypted])[0:41]

key = b'LLURULDUL'
plaintext = rc4(key, ciphertext)

print(plaintext)

Po uruchomieniu prezentowa jest flaga:

b'U_cRackeD_th1$_maG1cBaLL_!!_@flare-on.com'