Writeup: FlareOn 2022: 004 - darn_mice
1. TLDR
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.
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