Kilka słów na temat syscalli
Posted in assembler on Grudzień 16th, 2009 by GrzonuNo 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.
1 2 3 4 5 6 7 8 9 10 11 | 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.
1 2 3 4 | 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














