W ramach konferencji EXATEL Security Days zostanie rozegrany finał zawodów CTF. Aby się do niego dostać, należało rozwiązać serię nieprostych zadań. Publikujemy jedno z najciekawszych i zapraszamy do zabawy – spróbujcie się z nim zmierzyć.
CTF to świetny sprawdzian umiejętności, wiedzy i spostrzegawczości. W kwalifikacjach do finału wzięło udział 13 drużyn. W najbliższą środę 5 czerwca najlepsze zespoły staną ze sobą w szranki na PGE Narodowym w trakcie konferencji EXATEL Security Days poświęconej praktycznej stronie cyberbezpieczeństwa. Każdy zespół otrzyma listę zadań. Ten, który rozwiąże najwięcej i najszybciej – zwycięży. Ogłoszenie zwycięzców i wręczenie nagród odbędzie się dzień później.
Security Operations Center EXATEL postanowił podzielić się z wami zadaniem, które było częścią eliminacji do finału. Podejmiecie wyzwanie? :-)
Poniżej także wersja do pobrania w pliku PDF.
Rozwiązanie opublikujemy już w poniedziałek, czyli 3 czerwca. Powodzenia!
Aktualizacja 2019-06-03: Rozwiązanie zadania CTF „All your sixty four are belong to Embler”
Komentarze
Zapomnieli powiedzieć że nawet eliminacje były tylko dla wybranych…
Żeby wziąć udział w eliminacjach trzeba było mieć wejściówkę na konferencję albo mieć kogoś, kto nas zarejestruje.
Ponadto niektóre instytucje państwowe okazały się zbyt mało państwowe żeby otrzymać darmowe wejściówki.
Slabe jak gimnazja tutaj komentujacych.
Słabe, powiadasz. To podaj flagę w komentarzu (zatwierdzę komentarz w poniedziałek, zaraz po publikacji rozwiązania).
To bedzie flaga wielkiej Polski ;)
Nie będzie.
Widzę, że zabawa polega na wyłapaniu różnic tekstu względem oryginału, a na koniec należy ciąg odwrócić i zdekodować (czy to aby nie base64?). Bawiłem się chwilę ale chyba gdzieś coś pominąłem: swMzOmgfRrGuaLAG8wdoFSWocGiUXK8i6wSLxLEPAhjSwzLawMsFiBhAkP7JeQBCzdQ!A= i nie wychodzi mi flaga, no chyba, że to ma być taki ciąg: 3:hFhh%ph\”i2@yBu
Zgadza się, ale to dopiero początek zabawy – znalezienie flagi wymaga więcej zachodu, tytuł zadania nie jest przypadkowy.
PS. usuń wykrzyknik i pierwsze „z”
Znaki proponowane do usunięcia wynikają z różnic względem oryginału.
Niestety nie wiem co to Embler i kombinacje z literą E nazwą pewnego języka nic nie dają. Nigdy nie rozwiązywałem żadnego zadania tego typu.
Update: czyżby „C42B” tudzież „\xC4\x2B” ?
Wg ASCII to dawałoby „-+”. Hmmm.
Niestety, nie w tę stronę. Co do znaków, o których napisałam, że do usunięcia – weź pod uwagę, że oryginał jest dostępny w kilku wersjach.
Ja doceniam pomysł i oryginalność zadania.
MOmRrGuaLAG8dFSPcGUXK86ixLEPKMAhwzLaiAkP7JnQBCQA=
?
Myślisz w dobrym kierunku, ale zgubiłeś za dużo znaków.
Spróbowałem, poległem :P
Zapisuje gdzie „doszedłem” czekając na rozwiązanie:
„`
echo -n ‚swMz0mgfRrGuaLAG8wdoFSWocGiUXK8i6wSLxLEPAhjSwzLawMsFiBhAkP7JeQBCdQA=’ | base64 -d | hd
„`
Do tego miejsca prawidłowo :-) Pomyśl nad tytułem, może wpadniesz na coś jeszcze.
Do ukrycia: Chciałbym tylko potwierdzić: to co wrzuciłem zgadza się co do bajta? Tzn czy po zrzuceniu do pliku jego sha256sum wynosi `75d4f7b3809953ba8fee2260844ce566c2f665906e4890d736994304e73597b1`?
To zadanie miało jakąś kategorię? Czy po prostu `misc`?
Ten PDF/obrazek to wszystko co jest potrzebne do rozwiązania (tzn. czy nie trzeba było być na tej konferencji :D)?
1. Sprawdziłam, tak.
2. Kryptografia / reverse.
3. Konferencja dopiero się odbędzie ;-) PDF/obrazek wystarczy do rozwiązania zadania.
Popróbowałem ale się ostatecznie poddaje ;)
Nie trzeba publikować/do ukrycia, pomysły/notatki:
– „All your sixty four” „All your base” = base64, ale to już rozwiązałem wcześniej i w sumie to już zgadłem jak zobaczyłem znak `=`;)
– Na tych otrzymanych 50 „losowych” bajtach próbowałem standardowo `file`, `binwalk`, `binwalk -A`, oglądanie przez `hd` przez brak rezultatów, pomyślałem więc że to najprawdopodobniej jakiś kod maszynowy, ale na jaką architekturę, nie wiedziałem
– dużo później zauważyłem, że „are belong to Embler” „are belong to Us” => Us-Embler = assembler ;) więc to jednak pewnie jakiś kod maszynowy
– testowo próbowałem, odpalać na „pałę” w DOSboxie jako .com
– odpalałem w Ghidrze ale nie potrafiła sama zgadnąć architektury więc próbowałem losowe
– oczywiście także wziąłem się za to do czego nawiązaniem jest tytuł = „All your base are belong to us” = Zero Wing i Sega Mega Drive, procesor Motorola 68000/Zilog Z80
– więc próbowałem Ghidra z architekturą Motorola 68000/Zilog Z80, próbowałem emulator Segi, odpalać ten plik jako ROM
– nawet pobrałem ROM z grą Zero Wing, odpaliłem, pograłem i próbowałem patchować, po znalezieniu 2 bajtów z otrzymanych danych wstawiłem całość – 50 bajtów, i odpaliłem, działała/nie zauważyłem zmian, obejrzałem intro, pograłem/przegrałem, jeśli okaże się że to było to, tylko trzeba było przejść grę to – „xD”
– i jeszcze kilka losowych rzeczy
– próbowałem też odwracać kolejność bajtów (tak jak oryginalny b64 był odwrócony) i powtarzałem powyższe – także bez sukcesu
¯\_(ツ)_/¯
Spróbuj z tą najbardziej oczywistą na dzień dzisiejszy (przestarzałą, ale powszechną).
=AQdCBQeJ7PkAbBFrMaLzwjhMKPELxLS6i8
KXUGc:PSFu8GALaucrR0:M::
Pierwsza linijka to Base64. Druga to zapis konta linuksowego?
Za dużo zgubionych znaków, niepotrzebny podział.
Ale gdzieś tego typu rozwiązania były używane w ataku/kampanii/malware „in the wild”, czy to tylko taka „sztuka dla sztuki” jak połowa zadań typu ctf?
Raczej sztuka dla sztuki ;-)
Patrzac po tresci to base64
Tak, ale tylko w pierwszym etapie.
Mi wyszło coś takiego: ESC{greenbastrd}
I to jest prawidłowa odpowiedź, gratuluję :-)
Chodzi o odwrócenie i zdekodowanie ciągu base64?
Tego?
=AQdCBQeJ7PkAhBiFsMwaLzwSjhAKMKPSELxLSw6i8KXUiGcoWPSFodN8GALauGrRfgm0zMws
Tak, ale to dopiero początek zabawy, no i ciąg jest nie do końca prawidłowy (o kilka znaków za dużo)
Okazuje się, że kluczowe jest jednak znalezienie właściwego tekstu źródłowego. Co dało rezultat w postaci:
=AQdCBQeJ7PkAhBiFsMwaLzwSjhAPELxLSw6i8KXUiGcoWSFodw8GALauGrRfgm0zMws
Wygląda na to, że jest to kod asEmbler-a który deszyfruje (po dopieszczeniu) wartości umieszczone na stosie z:
0x94 0x5c 0xaf 0x22 0x15 0x25 0xa8 0x70
0xb0 0x06 0xf3 0x07 0x1f 0x46 0xb1 0xae
na:
0x5e 0x75 0x24 0x23 0x0e 0x66 0xe0 0x82
0xc8 0x9d 0x90 0xcb 0xba 0x00 0x1b 0x4e
Poprawnie? Czy jest jeszcze jakiś trzeci wymiar?
Jest jeszcze trzeci ;-) Trzeba poprawić błędy i wykonać.
Tak, ten drugi ciąg danych który podałem wcześniej jest już po poprawieniu i wykonaniu kodu ;)
Dobra, inaczej – kod musi wykonać się do końca, 1 iteracja pętli nie wystarczy. Czekam na flagę, z takim kodem powinieneś już do niej dotrzeć :-)
Po przejściu „do końca” dostaje:
3c 53 33 87 f8 2e f0 f1 fd fa 45 b4 51 30 66 1b
o to chodzi?
To masz na stosie? Bo coś mi się nie zgadza.
To może całość, stos przed i po wykonaniu. Drugi break jest na końcu kodu:
(gdb) x/16xb $sp
0xffffcd90: 0x94 0x5c 0xaf 0x22 0x15 0x25 0xa8 0x70
0xffffcd98: 0xb0 0x06 0xf3 0x07 0x1f 0x46 0xb1 0xae
(gdb) cont
Continuing.
Breakpoint 2, 0x08048092 in ?? ()
(gdb) x/16xb $sp
0xffffcd90: 0x53 0x3c 0x87 0x33 0x2e 0xf8 0xf1 0xf0
0xffffcd98: 0xfa 0xfd 0xb4 0x45 0x30 0x51 0x1b 0x66
kod:
section?.text
global _start
_start: ;entry point
mov bl,0x3
xor edx,edx
push 0xaeb1461f
push 0x7f306b0
push 0x70a82515
push 0x22af5c94
jmp init_loop
outer_loop:
mov eax,esp
mov cl,0xf
next_byte:
add bl,BYTE [eax]
rol bl,cl
xor bl,dl
ror bl,0x5
mov BYTE [eax],bl
inc eax
nop
dec cl
jns next_byte
init_loop:
inc edx
jne outer_loop
; write result to stdout
mov edx, 0x10 ;length+1
mov ecx, esp ;message
mov ebx, 1 ;file descriptor
mov eax, 4 ;sys_write
int 0x80 ;call kernel
mov eax, 1 ;sys_exit
int 0x80 ;call kernel
Hm… kod wydaje się prawidłowy. Co masz na stosie przy drugim breaku? To, co podałeś we wcześniejszym komentarzu?
Dokładnie to:
(gdb) x/16xb $sp
0xffffcd90: 0x53 0x3c 0x87 0x33 0x2e 0xf8 0xf1 0xf0
0xffffcd98: 0xfa 0xfd 0xb4 0x45 0x30 0x51 0x1b 0x66
lub jako liczby 32-bit:
(gdb) x/4xw $sp
0xffffcd90: 0x33873c53 0xf0f1f82e 0x45b4fdfa 0x661b5130
Po ilu iteracjach?
Po wszystkich. Może mój procesor krzywo liczy ;] Problem jest z kolejnością, czy to kompletnie nie te dane? Pewnie jutro sie dowiem w czym tkwił problem jak opublikujecie rozwiązanie.
Zaczynasz od tego, co trzeba, pierwsza iteracja (podawana przez Ciebie wcześniej) też się zgadza, ale końcowe dane już nie.
Rzutem na taśmę, {greenbastrd} ?
A gdzie trzy pierwsze litery podziałeś? ;-) Dawaj wszystkie i będzie flaga.
A tak racja, błąd copyego pejsta: ESC{greenbastrd}
No, to teraz mogę Ci oficjalnie pogratulować :-)
PS. Co zmieniłeś, że w końcu wyszło?
Dzięki ;)
Jaki był błąd? Za pierwszym razem założyłem że chodzi o jedną iterację i pierwszy skok po prostu pominąłem, bo inaczej nie było szans na wykonanie kodu. Spowodowało to, że szyfrowanie odbyło się z wyzerowanym rejestrem edx.
Za drugim razem, założyłem, że trzeba zmodyfikować tylko skoki więc w pierwszą iterację wchodziło z edx ustawionym na 1.
Po informacji, że pierwsza iteracja jest poprawna, domyśliłem się o co chodziło ;]
Gratulacje się należą osobie która jako pierwsza zdobyła flagę, mi bez ciągnięcia za uszy by się nie udało :/
Szczęście od boga, że takim testom nie poddano Różyckiego, Zygalskiego i Rajewskiego, bo mogliby nie przejść testu.
„All your sixty four are belong to embler” — doobre, z pół minuty mi zajęło skojarzenie, ale dobre, uśmiałem się :) :) trzeba jednak troche miec na karku żeby to szybko skojarzyć.. no i po wypowiedzeniu na głos łatwiej zajarzyć „embler” :)
„trzeba jednak troche miec na karku żeby to szybko skojarzyć”
Nie koniecznie, ciąg ma charakterystyczne dopełnienie używane w base64
„Bez względu na wszystko”
to dobry kierunek?
Jednak się nie poddałem!
ESC{greenbastrd}
Zdecydowanie za długo mi zeszło, ale jak na CTFowego nooba to jestem bardzo zadowolony, że się w ogóle udało =D No i sporo też błądziłem po „głupich” pomysłach ;)
Dobrze się bawiłem, dzięki za wyzwanie ♥
PS. Wiecie „za ile punktów” było to zadanie?
Super, gratuluję, to prawidłowa odpowiedź :-) Ile można było zgarnąć za to punktów, nie wiem, ale dopytam organizatorów.
Odpowiedź organizatorów: Pierwszy zespół, który rozwiązał zadanie, dostawał 300 pkt. Każdy kolejny mniej.
A tak żeby umiejscowić to gdzieś na skali trudności, to jakie było/jest zadanie o maksymalnej liczbie punktów?
Maksymalne było za 500 pkt. i nikt go nie rozwiązał.