Co nie co o warsztatach, które prowadziłem na SEConference, pisałem już wcześniej. M.in. obiecałem wtedy podsumowanie ankiet uczestników, a do tego postanowiłem podzielić się kilkoma spostrzeżeniami.

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:

2010-04-26 09:21:48 = RobertG
{
Można by użyć xxd
}
2010-04-26 10:05:37 = CoLinS
{
Na szybko napisać własny ;)
}
2010-04-26 10:37:38 = Gynvael Coldwind
{
@RobertG
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 ;)
}
2010-04-26 14:27:03 = Radom
{
PowerShell nie jest zainstalowany domyślnie w windowsie. A czy możliwe był ozwykłe otworzenie pliku jako tekst np. w notatniku++ i wyciąć interesujący nas fragment.?

Pozdrawiam
}
2010-04-26 14:43:30 = Zuezuo
{
vim -b plik.bin
a potem komendami:
512x - kasujemy 512 bajtow
65536(strzalka w prawo) - przesuwamy się o 64k
itd ...
}
2010-04-26 15:25:24 = Gynvael Coldwind
{
@Radom
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 ;)
}
2010-04-26 23:10:36 = magu
{
a to hexedytor byl zabroniony ? o_0
}
2010-04-27 06:48:02 = Gynvael Coldwind
{
@magu
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).
}
2010-04-27 09:30:42 = Mariusz Kędziora
{
No ale w Windows 7 PowerShell jest chyba od razu zainstalowany. Więc pod Windows 7 jak nic skorzystałbym z PowerShell.

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" :)
}
2010-04-27 09:32:46 = CoLinS
{
A może warto by takie programy nosić ze sobą na pendrivie?
}
2010-04-27 10:17:58 = Gynvael Coldwind
{
@Mariusz Kędziora
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 ;)
}
2010-04-27 11:59:43 = CoLinS
{
W dzisiejszych czasach to pendrivy nosi się razem z kluczami ;p
}
2010-04-27 14:21:51 = Mariusz Kędziora
{
@Gynvael Coldwind:
Ż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...
}
2010-04-28 07:03:21 = Gynvael Coldwind
{
@CoLinS
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
:))
}
2010-04-28 17:30:02 = przemoc
{
Zacznijmy od początku. Nie "nie co", a "nieco", co nie?

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ć.
}
2010-04-28 23:51:14 = Gynvael Coldwind
{
@przemoc
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ę ? :)
}
2010-05-03 08:01:04 = Paweł Goleń
{
PowerShell jest paskudny i wygląda jak Perl :P Ja tam korzystam z Pythona, głównie IPythona, a wykonanie zadania wyglądałoby mniej więcej tak:

i = open('input','rb')
o = open('output','wb')
i.seek(0x200)
o.write(i.read(65536))
i.close()
o.close()
}
2010-05-03 10:34:59 = Gynvael Coldwind
{
@Paweł Goleń
Taak, python dobrza rzecz :)
}
2010-06-24 01:13:31 = szopenfx
{
@Gynvael Coldwind
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
}
2010-06-24 06:59:01 = Gynvael Coldwind
{
@szopenfx
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:

Nick:
URL (optional):
Math captcha: 5 ∗ 2 + 9 =