Zacznę od tego, o czym dowiedziałem się z ankiet (były one dla mnie bardzo istotne, szczególnie, że były to pierwsze formalne warsztaty).
Stanowcza większość osób, które trafiły na warsztaty, miała niewielką styczność z RE, tj. tylko rzucili okiem (ale najwyraźniej ich zainteresowało, skoro się pojawili ;>). Tylko pojedyncze osoby przyznały się do bycia reverserami :)
Jeśli chodzi o formę warsztatów, to głosy były równo podzielone między "było OK", "całkiem ciekawie" i "było kapitalnie!", a negatywne opcje (tj. "Zzz..." i "ujdzie") były "niewykorzystane", tak więc prawdopodobnie rozwój moich warsztatów będzie nadal zmierzał w tym kierunku ;>
Również wszyscy (którzy oddali ankiety) stwierdzili, że jest możliwe, iż spotkamy się na kolejnych warsztatach (11 głosów trafiło na opcje "bardzo chętnie" oraz "ba! sure! ofc!", a jeden na "całkiem możliwe", opcje negatywne zostały niewykorzystane).
Do materiałów (wydruków, prezentacji, oraz filmików) zastrzeżeń nie miał nikt - chociaż mi narzuciło się kilka rzeczy (w prezentacji - była under-used imo).
Jeśli chodzi o poszczególne części, to "MBR key" i "Windows crackme" zostały uznane przez większość za odrobinę za trudną i w zasadzie muszę się zgodzić, że niepotrzebnie wrzuciłem tam kilka zabezpieczeń. Najbardziej podobała się natomiast część z pinpadem, oraz część ostatnia (analiza formatu danych), która została również uznana za najłatwiejszą (i taka też miała być, więc się cieszę, że tak wyszło).
Wyniki z ankiet mówią również, że uczestnicy najwięcej nowych rzeczy dowiedzieli się w części z pinpadem, a najwięcej znanego materiału było (zgodnie z przewidywaniami) w części z Windowsowym crackme.
Jeśli chodzi o ostatnie pytanie, to po prostu wrzucę wyniki:
Czy uważasz, że StarCraft 2 rządzi?
3 - tak!
4 - ba!
5 - ofc!
3 - yep!
2 - yeah!
1 - a co to? (dopisane długopisem na ankiecie ;>)
1 - 7331 (dopisane długopisem na ankiecie ;>)
1 - NOPE! (dopisane długopisem na ankiecie ;>)
(w jednym przypadku zostało dorysowane jeszcze 6 pól, wszystkie zaznaczone ;>)
Podsumowując, uznaję, że jak na pierwsze moje warsztaty prowadzone z nieznanymi mi wcześniej osobami, to wyszło zadziwiająco dobrze. Ofc postaram się, aby następnym razem było jeszcze lepiej, szczególnie, że już wiem co trzeba poprawić (trochę się dowiedziałem z ankiet, trochę sam wywnioskowałem w trakcie warsztatów).
Anyway, dodam, że mi się pracowało z uczestnikami warsztatów bardzo dobrze, i jak na poziom rzeczy które przygotowałem, to wywiązali się z zadań kapitalnie :) (szczególnie zadanie z analizą danych poszło dużo lepiej niż się spodziewałem).
Na warsztatach natomiast natknąłem się na dwa problemy, które były dla mnie zaskoczeniem.
Pierwszym z nich była sprawa "ręcznej" konwersji składni pewnej partii danych na format adekwatny do języka programowania używanego przez daną osobę. Dane wyglądały tak:
.text:12345678h dw 1234h, 4567h, 12C3h, 0AB3h, 1234h, ... (20 linii po 10 WORDów)
Najszybszym rozwiązaniem powyższego (aby np. skonwertować do składni C/C++), moim zdaniem, jest użycie kilku regexpów (wyrażeń regularnych), które usuną 'h' i '^.*dw', czy dodadzą '0x' po spacji.
Jak się jednak okazało, spora część uczestników zahaczyła się na tej konwersji, nie za bardzo wiedząc jak to ugryźć - część stosowanych przez nich edytorów w ogóle nie miała regexpów, a w innych przypadkach po prostu dany uczestnik nigdy wcześniej się regexpami nie bawił.
Jeżeli, drogi czytelniku, również nie wiedziałbyś, jak taką konwersję szybko dokonać, gorąco zachęcam do zapoznania się z wyrażeniami regularnymi, oraz zaopatrzenia się w edytor który je obsługuje (np. gvim, visual studio czy choćby odpalany z linii poleceń sed). Zachęcam również do wykonania paru ćwiczeń, związanych z konwersją danych z jednego formatu, na inny - to się na prawdę często przydaje :)
Drugi problem dotyczył natomiast wyekstraktowania fragmentu pliku. Tj. był sobie plik o wielkości 1.4MB, z którego trzeba było wyciąć fragment wielkości około 64KB (lub większy) zaczynając od offsetu 200h. Oczywiście, każdy by sobie z tym poradził mając dd, ale problem był taki, że nikt tego dd nie miał (po za jedną szczęśliwą osobą które miała VMkę z linuxem pod ręką ;>), a ja nie miałem jak udostępnić (nie było netu).
Problem rozwiązaliśmy za pomocą Total Commandera i jego opcji "Split File" (Podziel Plik) oraz "Combine Files" (Połącz Pliki) - a konkretniej, najpierw podzieliliśmy 1.4MB na 4 części i odrzuciliśmy drugą, trzecią i czwartą. Następnie podzieliliśmy pierwszą część na fragmenty po 512 bajtów, odrzuciliśmy pierwszą i scaliliśmy resztę - sposób jest ofc bardzo na około, ale chciałem pokazać, że nawet takim dziwnym sposobem idzie to zrobić.
W tym miejscu chciałbym zachęcić czytelników do wymyślenia innych sposobów jak taką operację wykonać, nie mając dd na komputerze :) (tak, to jest to zadanie z tytułu postu).
I w sumie tyle! Zachęcam do dyskusji i dzielenia się pomysłami :)
Comments:
Taak, to niezły pomysł ;)
Kurcze, szkoda, że na Windowsie by default nie ma takich aplikacyjek... z drugiej strony, zawsze twierdziłem, że konsola windy jest używalna po zainstalowaniu *nixowych tooli ;)
@CoLinS
Yep ;)
Ofc to wymaga kompilatora lub interpretera jakiegoś języka...
Chociaż np. PowerShell czy VBS to standard na Windowsie i to zawsze jest ;)
Pozdrawiam
a potem komendami:
512x - kasujemy 512 bajtow
65536(strzalka w prawo) - przesuwamy się o 64k
itd ...
Tak na prawdę obaj mamy rację - jest by default w nowych Windowsach (2008 R2 i 7) ;)
Jak notatnik++ radzi sobie ze znakami "specjalnymi", tj ascii < 32 ?
@Zuezuo
Też może być ;)
Do ćwiczenia dołożę utrudnienie - jak to zrobić na czystej instalacji a) Windows XP, b) Windows 7 ;)
A jakiż to hexedytor jest dostępny na czystej instalacji Windowsa ? :)
Anyway, padła również propozycja wykorzystania debug.com, która jest niezła, ale ofc nie zadziała na systemach 64-bitowych (bo NTVDM w Long Mode nie działa z uwagi na brak VM86).
W wypadku Windows XP? Nie mam zielonego pojęcia co bym zrobił :) Chyba zacząłbym szukać internetu jakoś - bo pewnie byłoby to najszybsze, choć najmniej "sophisticated" :)
PowerShell to świetny wybór imo.. wczoraj w końcu się w tym pobawiłem i jestem pod wrażeniem ;)
Co do internetu, a w zasadzie Internetu (hehe wg niektórych źródeł powinno się to pisać z dużej litery - bo to nazwa własna; ale chyba już na tyle to słowo weszło do codziennego użycia/języka, że "internet" też jest poprawnie ;> - ot taka dygresja), to jest to zawsze dobry pomysł :) niestety, w sytuacji o której pisałem, nie było dostępu do Internetu ;(
@CoLinS
Dobry pomysł, ale - powołując się na prawa Murphiego - i tak się zapomni o pendrivie jak będzie potrzebny ;)
Że Internetu nie było to ja wiem :) Tylko się zastanawiałem, czy nie szybciej (choć mniej "ładnie") byłoby wyjść i rozejrzeć się za jakimś hot spotem na przykład i zdobyć dostęp do netu :) Ten net to wszędzie ostatnio bywa...
Imo w dzisiejszych czasach trzyma się takie rzeczy online, żeby nie nosić dodatkowego "klucza" :)
Ale domyślam się, że co człowiek, to metoda :)
@Mariusz Kędziora
:))
Co do zadanka. Przypomniałem sobie o findstr - takie coś z obsługą wyrażeń regularnych. Niestety te regexpy w findstr są trochę wybrakowane (), sam findstr nie ma odpowiednika opcji -o z grepa, a nawet gdyby miał, to potrzeba jeszcze kotwic do początku i końca pliku, bo ^ i $ nie byłyby wystarczające. Tak więc nie tędy droga...
W XP (Vista/7 pewnie też) mamy natomiast cscript/wscript, a więc wystarczy klepnąć skrypt w stylu:
Const ForReading = 1, ForWriting = 2
Dim inputFile, outputFile, fso, file, pos, bytes, data
Set fso = CreateObject("Scripting.FileSystemObject")
Set objArgs = WScript.Arguments
If objArgs.Count > 0 Then
inputFile = objArgs(0)
Else
Set oFO = CreateObject("SAFRCFileDlg.FileOpen")
oFO.OpenFileOpenDlg
inputFile = oFO.FileName
End If
If Not fso.FileExists(inputFile) Then
MsgBox("Input file doesn't exist!")
WScript.Quit
End If
If objArgs.Count > 1 Then
pos = objArgs(1)
Else
pos = InputBox("Read position (blank = 0)")
End If
If pos = "" Then
pos = 0
End If
If objArgs.Count > 2 Then
bytes = objArgs(2)
Else
bytes = InputBox("Read bytes (blank = 0)")
End If
If bytes = "" Then
bytes = 0
End If
If objArgs.Count > 3 Then
outputFile = objArgs(3)
Else
Set oFO = CreateObject("SAFRCFileDlg.FileSave")
oFO.FileName = ""
oFO.OpenFileSaveDlg
outputFile = oFO.FileName
End If
If outputFile = "" Then
MsgBox("No output file specified!")
WScript.Quit
End If
Set file = fso.OpenTextFile(inputFile, ForReading)
file.Skip(CInt(pos))
data = file.Read(CInt(bytes))
file.Close
Set file = fso.OpenTextFile(outputFile, ForWriting, True)
file.Write(data)
file.Close
Proste 2 testy wykazały, że chyba działa. Kod jest mało idiotoodporny i ohydny, tak jak ohydny jest vbs. Widać, że hardkodując parametry byłby o wiele prostszy. Tym samym jest jak najbardziej do klepnięcia raz-dwa, o ile pamięta się jak w tym ustrojstwie cokolwiek napisać. Przyznam, że sam w pierwszym odruchu sięgnąłem po jakieś swoje skrypty sprzed 4 latach, które zmuszony byłem wówczas popełnić.
Nieco.. nie co.. masakra jakaś ;) Anyway, thx :)
Anyway, ah, w końcu ktoś rzucił jakimś kodem ;)
To może teraz ktoś pokazałby jak w PowerShellu zrobić taką operację ? :)
i = open('input','rb')
o = open('output','wb')
i.seek(0x200)
o.write(i.read(65536))
i.close()
o.close()
Taak, python dobrza rzecz :)
We wszystkich wersjach windowsa (napewno od win98) jest taki program konsolowy "edit" - wygląda na toporny edytor pod dosa i w rzeczywistości taki jest, ale może też posłużyć jako systemowy hexedytor (ascii-edytor) plik można wczytać w trybie binarnym i dla np. łatwiejszego znalezienia offsetu przy wczytaniu określić szerokość wiersza na np. 64 a usuwanie to już tylko zaznaczenie odpowiednich obszarów i "delete". Podczas zapisu, żaden bajt nie zmieni swojego znaczenia. Dodatkowo można też zapisywać bajty o odpowiedniej wartości przez alt + 0nr_ascii. Konkludując to nie prawda, że windows nie ma systemowego edytora bajtowego :P
Ah, właśnie, edit /b :)
Tak, to jest świetny pomysł.
Niestety nie ma go na wersjach 64-bitowych, ponieważ to jednak program DOSowy, a jak wiadomo w Long Mode nie ma obsługi VM86, więc nie ma i NTVDM.
Ciekawe czy na Windows 7 32-bitowym nadal jest :)
Add a comment: