Writeup: FlareOn 2022: 004 - darn_mice

Task description

1. TLDR

TLDR graph

2. Dane wejściowe

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

Przedmiotem zadania był plik PE:

darn_mice.exe

3. Analiza wstępna

Zweryfikowałem typ pliku darn_mice.exe :

$ file darn_mice.exe
darn_mice.exe: PE32 executable (console) Intel 80386, for MS Windows

Uruchomienie konsolowego programu darn_mice.exe nie wskazywało na jakąkolwiek interakcję z użytkownikiem. Po wpisaniu testowego parametru do programu, na standardowym wyjściu pojawił się tekst i program zakończył się nieoczekiwanym błędem:

>darn_mice.exe flare
On your plate, you see four olives.
You leave the room, and a mouse EATS one!

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

4. Analiza kodu

Szybka analiza kodu pozwoliła ujawnić, że ponownie należy się zmierzyć z szyfrogramem i algorytmem RC4.

rc4

W celu odszyfrowania flagi trzeba było podać hasło jako argument programu. Hasło tuż przed odszyfrowaniem flagi było rozszerzano do właściwego klucza rc4 z wykorzystaniem soli o wartości salty oraz algorytmu PBKDF2-HMAC-SHA512.

Był jeszcze jeden problem: hasło musiało być krótsze niż 36 znaków i podlegało weryfikacji. Weryfikacja polegała na odszyfrowaniu hasła szyfrem afinicznym (p[i]+k[i]) mod 256 z ustalonym, stałym kluczem:

50 5e 5e a3 4f 5b 51 5e 5e 97 a3 80 90 a3 80 90 a3 80 90 a3 80 90 a3 80 90 a3 80 90 a3 80 90 a2 a3 6b 7f 00

Każdy bajt hasła po odszyfrowaniu musiał stanowić poprawny shellcode możliwy do uruchomienia w formacie:

shellcode(shellcode)

5. Wygenerowanie szyfrogramu

Wybranym tekstem jawnym został rozkaz RETN (0xC3). Opracowałem zatem skrypt, który wygenerowałby hasło do programu, które generowałby ciąg bajtów (tekst jawny) 0xC3

from malduck import xor

key = b"\x50\x5e\x5e\xa3\x4f\x5b\x51\x5e\x5e\x97\xa3\x80\x90\xa3\x80\x90\xa3\x80\x90\xa3\x80\x90\xa3\x80\x90\xa3\x80\x90\xa3\x80\x90\xa2\xa3\x6b\x7f"
plaintext = b'\xc3'*35 # RETN

ciphertext = ''.join([chr(p-k) for (k,p) in zip(key,plaintext)])
print(ciphertext)

Po uruchomieniu otrzymałem hasło do programu (szyfrogram):

see three, C3 C3 C3 C3 C3 C3 C3! XD

6. Odczytanie flagi

Uruchomiłem program podając wyznaczony argument:

> .\darn_mice.exe "see three, C3 C3 C3 C3 C3 C3 C3! XD"
On your plate, you see four olives.
You leave the room, and a mouse EATS one!
Nibble...
Nibble...
Nibble...
Nibble...
Nibble...
Nibble...
Nibble...
Nibble...
Nibble...
Nibble...
Nibble...
Nibble...
Nibble...
Nibble...
Nibble...
Nibble...
Nibble...
Nibble...
Nibble...
Nibble...
Nibble...
Nibble...
Nibble...
Nibble...
Nibble...
Nibble...
Nibble...
Nibble...
Nibble...
Nibble...
Nibble...
Nibble...
Nibble...
Nibble...
Nibble...
When you return, you only: see three, C3 C3 C3 C3 C3 C3 C3! XD
i_w0uld_l1k3_to_RETurn_this_joke@flare-on.com

Zatem flaga to:

i_w0uld_l1k3_to_RETurn_this_joke@flare-on.com