ZSK WC WAT
Wprowadzenie do laboratoriów z
inspekcji kodu
Adam E. Patkowski
2
●
DOS, Real Address Mode, V86
−
Szesnastobitowość
−
Przestrzeń adresowa: 1M + 64K -16
−
Adresacja SEG:OFFSET
−
Moduł wykonywalny: w 64K-bajtowych segmentach
(jednocześnie max. 6, wg CS, DS, ES, SS, FS, GS)
−
Ograniczenia na używanie rejestrów
−
Ograniczona lista rozkazów (+prefiksowane 32b)
−
Moduły ładowalne w formacie .COM lub .EXE
−
Komunikacja za pomocą przerwań
●
Windows 16-bitowe
−
Moduły ładowalne w formacie NE (New Executable)
−
Komunikacja za pomocą wywołań
międzysegmentowych (CALL FAR) procedur usług
Trzy
Trzy
ś
ś
rodowiska
rodowiska
3
●
Windows 32-bitowe
−
Pamięć wirtualna 4GB dla każdego programu
−
Rozszerzona (32-bitowa) lista rozkazów
(+prefiksowane 64-bitowe w IA-32e)
−
Komunikacja z systemem za pomocą wywołań
procedur usługowych rozkazami CALL
−
Można abstrahować od zawartości rejestrów
segmentowych
−
Znikają liczne ograniczenia
−
Moduły ładowalne w formacie PE (Portable Executable)
●
Windows 64-bitowe
−
…
Cztery
Cztery
ś
ś
rodowiska
rodowiska
4
4
Modu
Modu
ł
ł
ł
ł
adowalny .EXE (DOS)
adowalny .EXE (DOS)
EXE header
00 word "MZ" - Link file .EXE signature (Mark Zbikowski?)
02 word length of image mod 512
04 word size of file in 512 byte pages
06 word number of relocation items following header
08 word size of header in 16 byte paragraphs, used to locate the
beginning of the load module
0A word min # of paragraphs needed to run program
0C word max # of paragraphs the program would like
0E word offset in load module of stack segment (in paras)
10 word initial SP value to be loaded
12 word negative checksum of pgm used while by EXEC loads
pgm
14 word program entry point, (initial IP value)
16 word offset in load module of the code segment (in paras)
18 word offset in .EXE file of first relocation item
1A word overlay number (0 for root program)
RELOCATION TABLE
IMAGE
5
5
Modu
Modu
ł
ł
ł
ł
adowalny .EXE
adowalny .EXE
●
relocation table and the program load module follow the header
●
relocation entries are 32 bit values representing the offset into the
load module needing patched
●
once the relocatable item is found, the CS register is added to the
value found at the calculated offset
●
●
Registers at load time of the EXE file are as follows:
●
AX:
contains number of characters in command tail, or 0
●
BX:CX32 bit value indicating the load module memory size
●
DX
zero
●
SS:SPset to stack segment if defined else, SS=CS and SP=0 or
top of memory.
●
DS
set to segment address of EXE header
●
ES
set to segment address of EXE header
●
CS:IP far address of program entry point, (label on "END„ statement
of program)
6
6
PE
PE
-
-
Portable
Portable
Executable
Executable
----------------------------------------------------------
IMAGE_DOS_HEADER
----------------------------------------------------------
IMAGE_FILE_HEADER
----------------------------------------------------------
IMAGE_OPTIONAL_HEADER
----------------------------------------------------------
IMAGE_DIRECTORY_ENTRIES
----------------------------------------------------------
IMAGE_SECTION_HEADER
----------------------------------------------------------
SEKCJA 1
----------------------------------------------------------
SEKCJA 2
----------------------------------------------------------
...
----------------------------------------------------------
SEKCJA n
----------------------------------------------------------
IMAGE_DOS_HEADER – to stub, a. z ważniejszych pól zawiera wskaźnik do
IMAGE_FILE_HEADER - znajduje się tu m.in. sygnatura (PE i 2 zera), ilość sekcji, rodzaj procesora, na
którym program może być wykonywany, i inne
IMAGE_OPTIONAL_HEADER - takie informacje jak np. adres punktu startu, rozmiar pliku, wyrównanie itd..
IMAGE_DIRECTORY_ENTRIES - jest to tablica struktur, zawierająca adresy i rozmiary sekcji związanych
z działaniem pliku, czyli np. sekcja z importami. struktur takich jest 16, przy czym niektóre mogą być
wypełnione zerami, czyli po prostu nie są używane w danym pliku
IMAGE_SECTION_HEADER - jest to tablica z informacjami o poszczególnych sekcjach. ich rozmiar,
nazwa, adres fizyczny i wirtualny, blablabla
SEKCJA 1-n - a tu juz same sekcje, zawierające kod, dane, resource'y...
7
●
Programy liniowe, a sterowane zdarzeniami
−
DOS – liniowe
−
Windows – sterowane zdarzeniami lub liniowe
●
W programach liniowych można prześledzić wykonywanie
programów od początku do końca: program działa od
chwili uruchomienia do końca, wywołując od czasu do
czasu usługi systemowe…
●
W programach sterowanych zdarzeniami śledzić można
działanie programów obsługi zdarzeń: program po
zarejestrowaniu podprogramów obsługi zdarzeń „kończy”
działanie i oczekuje na wywołania przez system; od tej
chwili reaguje na zdarzenia (zamiana ról z SO: „nie wołaj
mnie, to ja zawołam ciebie”)
Programy sterowane zdarzeniami
Programy sterowane zdarzeniami
8
8
Program sterowany zdarzeniami
Program sterowany zdarzeniami
●
Fragment inicjujący: Rejestracja klas okien, dla każdej
klasy adres procedury obsługi okna, po czym pętla
oczekiwania na komunikaty
●
RegisterClass
●
CreateWindow
●
Pętla (tylko komunikat WM_QUIT kończy)
−
GetMessage (zwykle +TranslateMessage) czeka na komunikat
−
DispatchMessage (spowoduje wywołanie przez system obsługi okna)
●
Procedury obsługi okien – tu jest właściwy program!
−
Na WM_DESTROY woła PostQuitMessage (wysłanie
WM_QUIT)
−
Zwykle woła DefWindowProc – standardową obslugę okna
Windows – gdy zrobi już własne działania
(italikami zapisano wyzej nazwy funkcji systemowych)
9
9
Komunikaty
Komunikaty
-
-
przyk
przyk
ł
ł
ady
ady
●
WM_KILLFOCUS otrzymuje okno, które straciło
fokus na rzecz innego
●
WM_SETFOCUS dostaje z kolei to okno, które fokus
otrzymało
●
WM_przyciskBUTTONakcja – myszka
−
Przycisk L lewy
−
Przycisk M środkowy
−
Przycisk R prawy
−
Akcja DOWN wciśnięcie przycisku
−
Akcja UP zwolnienie przycisku
−
Akcja DBLCLK dwukrotne kliknięcie
10
●
Edytory binarne
HIEW
●
Debuggery
−
Szesnastobitowe pod DOS
TD
−
Szesnastobitowe pod Windows
TDW
−
Trzydziestodwubitowe
●
TDW32
●
OllyDbg
●
SoftIce (produkt NuMega, chyba najlepszy, gdyby nie IDA)
●
Programy do generowania patchy –
PatchFX
●
Disassemblery –
W32dsm89
●
Disassemblery z wykonywaniem kodu –
IDA Pro
●
Identyfikatory –
PEiD
●
Programy rozpakowujące –
PROCDUMP
●
Dekompilatory – Dede, Dis#, VBdecompiler, Mocha…
●
Edytory resursów –
ResHacker
Narzedzia
Narzedzia
reverse
reverse
engineering
engineering
11
●
Tylko tryb zastępowania (nie ma wstawiania)
●
Wyświetlanie w postaci
−
Tekstowej
−
Szesnastkowej
−
Zdisasemblowanej
●
F3 – edycja
−
F2 tryb asemblacji
−
F9 wprowadzenie do pliku
●
F7 – szukanie
●
Adresy
−
Od początku pliku 00010123: (tak zawsze w trakcie edycji!)
−
Adres w przestrzeni wirtualnej .00400000: (kropka przed)
HIEW
HIEW
12
●
TD
,
TDW
.
TDW32
−
Kursor operatora i okna
−
CtrlF2 – reset
−
F7 – wykonać jeden rozkaz
−
F8 – jeden rozkaz lub podprogram
−
altF7 – jeden rozkaz lub sekwencję przerwania
wewnętrznego
−
F9 – wykonywać do końca lub punktu
przerwania
−
F4 – wykonywać do kursora operatora
−
F2 – ustawić/skasować punkt przerwania
−
W V86 klawisz F5 pokazuje ekran operatora…
Debuggery
Debuggery
Borland
Borland
13
13
Debugger
Debugger
to narz
to narz
ę
ę
dzie uruchomieniowe!
dzie uruchomieniowe!
●
Debugger pozwala badać zachowanie się
programów w pamięci (modułów
wykonywalnych)
●
Po zrozumieniu działania programu i
rozpoznaniu pożądanych zmian (dla
osiągnięcia jakiegoś celu) utrwalić można te
zmiany tylko zmieniając program na dysku
(moduł ładowalny)
●
Zmiana musi być taka, aby moduł
wykonywalny po załadowaniu do pamięci był
zgodny z oczekiwaniami…
●
Dlatego znajomość budowy EXE (w wersji
MZ, NE, PE), DLL itd. jest użyteczna.
14
14
Zagnie
Zagnie
ż
ż
d
d
ż
ż
ane podprogramy
ane podprogramy
●
Przykład programu pod DOS
●
Denttop (16b) pod Windows
●
Typhon.exe
– program z problemem…
−
To nietypowy – liniowy program Windows
−
Program zwykle składa się z
zagnieżdżanych podprogramów – to może
znacznie przyspieszyć poszukiwania…
●
Typhon (32b) pod Windows
– szukanie
15
15
Jak to si
Jak to si
ę
ę
robi
robi
–
–
idea
idea
…
…
●
Można oczywiście poznać i zrozumieć cały
program lepiej od autora…
−
tak trzeba postąpić przy inspekcji kodów
binarnych…
−
ale lepiej zanalizować tylko niezbędne
fragmenty:
●
…wybrać niepożądany „objaw”
●
Zlokalizować fragment kodu, generujący
objaw
●
Zobaczyć, gdzie wcześniej występuje
rozwidlenie toru algorytmu (skok warunkowy)
z gałęzią omijającą objaw
●
Zanalizować od czego zależy ten skok i
wymyślić najskuteczniejszą modyfikację
16
16
Typowe konstrukcje
Typowe konstrukcje
…
…
●
Zagnieżdżane podprogramy – poznaliśmy
●
Podprogram, procedura a funkcja
●
Wywołania funkcji:
−
PUSH parametr_n
−
…
−
PUSH parametr_2
−
PUSH parametr_1
−
CALL FUNKCJA
−
ADD ESP, n*4 ; zdjęcie ze stosu parametrów
●
Wynik w EAX (lub AX i DX – w AX mniej
znacz.)
17
17
Budowa podprogramu
Budowa podprogramu
●
W programach 16-bitowych:
−
PUSH BP
−
MOV BP, SP
−
SUB SP, wielkosc_danych_lok
; miejsce na dane
−
…
−
MOV SP, BP
−
POP BP
−
RET
●
W programach 32-bitowych:
−
PUSH EBP
−
MOV EBP,ESP
−
ADD ESP,0FFFF????H
; to odejmowanie!
−
…
−
MOV ESP,EBP
−
RETF
●
MOV EAX,[EBP+8] to odwołanie do parametru funkcji
●
MOV EAX,[EBP-4] a to do zmiennych lokalnych
(dynamicznych)
18
18
Por
Por
ó
ó
wnania
wnania
●
Tekstów z wzorcem
−
PUSH adres_pierwszego_łąńcucha
−
PUSH adres_drugiego_łańcucha
−
CALL lcmpstrA
−
Wynik: AEX równe 0 oznacza identyczne
●
Funkcji skrótu (np. numer seryjny lub wynik funkcji
hash)
−
Przekształcenie tekstu wejściowego do wartości
−
CMP rejestr, [wartość]
19
19
Gdy nie wystarcz
Gdy nie wystarcz
ą
ą
debuggery
debuggery
●
W programach sterowanych zdarzeniami
(poznamy bliżej za chwilę) nie ma
bezpośredniej drogi od początku do
„objawu”. Wówczas trzeba czegoś więcej niż
prosty debugger. Użyteczne: szczęście lub…
●
Disassemblery
−
WdASM
−
IDA
●
i inne
narzędzia
…
−
PEid
−
ProcDump
−
Patch generators
20