grzonu
Były Moderator
- Dołączył
- Grudzień 26, 2006
- Posty
- 1390
No to chciałem napisać arta o tym jak windows wywołuje funkcje do wywołania których konieczne jest wejście w tryb
jądra do którego program usera który jest w ring3(sterowniki i jądro sa w ring0) nie ma dostepu. Mechanizm ten nosi
nazwe syscall. Przedstawie jak wyglada przykładowe wywołanie np. ZwTerminateProcess.
Widzimy wiec ze nie jest to trudne i wydaje sie bardzo wygodne w roznych shellcodach itp ale jak zawsze jest jakies
ale no wiec w tym przypadku oczywiscie tez jest i jest nim to ze numer funkcji jest różny w kazdej wersji systemu.
Mamy 2 opcje albo probujemy dynamicznie pobrac z ZwTerminateProcess który jest w ntdll ale tu musimy znalesc jej
adres. Metoda ta jest dobra jesli potrzebujemy kompatybilnosci z KAZDYM systemem. jesli potrzebujemy
kompatybilnosci tylko z wybranymi to jest inna metoda na pobranie wersji systemu i dopasowanie odpowiedniego numeru
syscalla bez uzywania jakiegokolwiek wywolania API.
przykladowo dla XP wersja to 5.1 wiec major = 5 a minor = 1 wiec ebx = 5 a ecx = 1
numery innych systemow znajdziemy w MSDN
Teraz mozemy juz dopasowac numer zaleznie od wersji jaka chcemy.
Jakie sa inne zalety?
-Omijamy w ten sposob wszystkie hooki zalozone w user-mode.
-Nie musimy szukac adresu potrzebnej nam funkcji.
-Kod dzieki temu jest mniejszy
Teraz mała uwaga dla piszacych sterowniki.
Dodam na koniec ze numer funkcji jest indexem danej funkcji w tabeli SSDT (numery 1-1000) i ShadowSSDT(1000+).
Obie te tablice znajdują się w przestrzeni adresowej jądra więc nie mamy do niej dostepu z User-mode.
W tablicy SSDT znajduja sie funkcji eksportowane przez ntoskrnl.exe(jądro) a w ShadowSSDT funkcje eksportowane
przez win32k.sys gdzie znajduja sie funkcje zwiazane z okienkami,wejsciem,wyjsciem. SSDT jest eksportowane przez
jadro i nie ma wiekszych klopotow z jego znalezieniem za to ShadowSSDT nie jest eksporotwane i metode na jej
znalezienie wymyslil Alexander Volynkin(http://www.volynkin.com/sdts.htm)
Tablice syscalli dla poszczególnych systemów:
http://j00ru.vexillium.org/win32k_syscalls/
http://www.metasploit.com/users/opcode/syscalls.html
Artykuł pochodzi ze strony http://grzonu.pl
//Do innych modów: nie przenoscie do tutoriali narazie
jądra do którego program usera który jest w ring3(sterowniki i jądro sa w ring0) nie ma dostepu. Mechanizm ten nosi
nazwe syscall. Przedstawie jak wyglada przykładowe wywołanie np. ZwTerminateProcess.
Kod:
PUSH 0
PUSH -1 ;rzucamy na stos parametry funkcji
CALL TERM ;wywolujemy ZwTerminateProcess
RET
TERM:
MOV EAX,101h ;do eax kopiujemy numer funkcji (tutaj jest to numer ZwTerminateProcess)
CALL SYS ;wywolujemy syscall (tak samo wyglada funkcja KiFastSystemCall)
SYS:
MOV EDX,ESP
SYSENTER ;tu nastepuje przejscie do trybu jądra
RET
Widzimy wiec ze nie jest to trudne i wydaje sie bardzo wygodne w roznych shellcodach itp ale jak zawsze jest jakies
ale no wiec w tym przypadku oczywiscie tez jest i jest nim to ze numer funkcji jest różny w kazdej wersji systemu.
Mamy 2 opcje albo probujemy dynamicznie pobrac z ZwTerminateProcess który jest w ntdll ale tu musimy znalesc jej
adres. Metoda ta jest dobra jesli potrzebujemy kompatybilnosci z KAZDYM systemem. jesli potrzebujemy
kompatybilnosci tylko z wybranymi to jest inna metoda na pobranie wersji systemu i dopasowanie odpowiedniego numeru
syscalla bez uzywania jakiegokolwiek wywolania API.
Kod:
MOV EAX,DWORD PTR FS:[18h] ;do eax kopiujemy adres TEB
MOV EDI,DWORD PTR DS:[EAX+30h] ;do edi kopiujemy adres PEB
MOV EBX,DWORD PTR DS:[EDI+A4h] ;do ebx kopiujemy major version number
MOV ECX,DWORD PTR DS:[EDI+A8h] ;do ecx kopiujemy minor version number
przykladowo dla XP wersja to 5.1 wiec major = 5 a minor = 1 wiec ebx = 5 a ecx = 1
numery innych systemow znajdziemy w MSDN
Teraz mozemy juz dopasowac numer zaleznie od wersji jaka chcemy.
Jakie sa inne zalety?
-Omijamy w ten sposob wszystkie hooki zalozone w user-mode.
-Nie musimy szukac adresu potrzebnej nam funkcji.
-Kod dzieki temu jest mniejszy
Teraz mała uwaga dla piszacych sterowniki.
Dodam na koniec ze numer funkcji jest indexem danej funkcji w tabeli SSDT (numery 1-1000) i ShadowSSDT(1000+).
Obie te tablice znajdują się w przestrzeni adresowej jądra więc nie mamy do niej dostepu z User-mode.
W tablicy SSDT znajduja sie funkcji eksportowane przez ntoskrnl.exe(jądro) a w ShadowSSDT funkcje eksportowane
przez win32k.sys gdzie znajduja sie funkcje zwiazane z okienkami,wejsciem,wyjsciem. SSDT jest eksportowane przez
jadro i nie ma wiekszych klopotow z jego znalezieniem za to ShadowSSDT nie jest eksporotwane i metode na jej
znalezienie wymyslil Alexander Volynkin(http://www.volynkin.com/sdts.htm)
Tablice syscalli dla poszczególnych systemów:
http://j00ru.vexillium.org/win32k_syscalls/
http://www.metasploit.com/users/opcode/syscalls.html
Artykuł pochodzi ze strony http://grzonu.pl
//Do innych modów: nie przenoscie do tutoriali narazie