Adresa kernel32.dll při startu programu

HackForum

Adresa kernel32.dll při startu programu#
Chci se zeptat místních guru, jestli na začátku windowsího programu ukazuje návratová adresa na zásobníku do kernel32.dll (třeba dovnitř CreateProcessA). Na 98SE a XPSP2 mám ověřené, že jo, ale chci, aby mi to fungovalo všude.

Pak totiž jde najít bázi kernel32.dll v 10 bajtech (pokud dám vstupní adresu programu na začátek DOS signatury, která tam stejně být musí).

dec ebp
pop edx ; 'MZ' signatura: edx=návratová adresa
push edx
L:dec edx
cwd
cmp word[edx],5A4Dh ; 'MZ'
jne L

Hledací cyklus je převzatý ze SEH metody (viz níže). To "cwd" je jen kratší "xor dx,dx" - eax obsahuje na Win9x EntryPoint a na NT/2k/XP/2k3 nulu, takže horní bit ax je vždy nula.


Metody používané v shellkódu jsou moc dlouhé:

Ve Windows ukazuje fs na strukturu Thread Environment Block (TEB), což je ale dokumentované jen na NT systémech (NT,2k,XP,2k3...). Pro Win9x to funguje taky, ale struktura vypadá trochu jinak. To je základ PEB metody:

Pod NT je na fs:30 ukazatel na Process Environment Block (PEB), kde jsou informace o knihovnách a tak. Druhá nahraná knihovna je právě kernel32.dll (první je myslím ntdll.dll). PEB je na adrese 7FFDF000h (horní bit=0).

Pod 9x ukazuje fs:30 na RunningProcessDatabase, která leží někde v systému - proto má horní bit 1. Co obsahuje, jsem nenašel, ale funguje to :-)

TEB i PEB může Microsoft měnit, jak chce, takže nic moc...

push 3Ch
pop eax
cdq
xchg eax,edx ; eax=0, edx=3Ch
add eax,[fs:eax+30h] ; add nastaví flagy
js w9x
mov eax,[eax+0Ch]
mov esi,[eax+01Ch]
lodsd
mov eax,[eax+8h]
jmp done
w9x:
mov eax,[eax+34h]
mov eax,[eax+edx+7Ch]
done:
mov eax,[eax+edx] ; PE hlavička
...


SEH metoda: fs:0 ukazuje na strukturu ošetřování výjimek, což je spoják končící v UnhandledExceptionFilter - funkce v kernel32.dll. Ukazatel na další prvek má šikovně offset 0, takže...

xor esi, esi
fs:
loop3:
lodsd ; napoprvé fs:lodsd ;-)
cmp dword[eax],byte -1
xchg eax,esi
jne loop3
lodsd
lodsd ; adresa UnhandledExceptionFilter
loop2:
dec eax
xor ax,ax
cmp word[eax],5A4Dh ; 'MZ'
jne loop2
mov eax,[eax+3Ch] ; PE hlavička
...

Cyklus na konci využívá toho, že DLL se nahrávají na násobky 1000h a nemají v sobě díry. Stačí tedy najít signaturu DOS hlavičky a je to.

SEH metoda má tu výhodu, že mechanismus výjimek Microsoft ve vlastním zájmu udržuje kompatibilní. ;-)


Topstack nefunguje na XP64, takže mě nezajímá.


Předem díky!
(odpovědět)
Řrřola | 213.220.234.*23.10.2007 15:40
re: Adresa kernel32.dll při startu programu#
zaciatok -> v casti zavazdania programu,alebo EIP = OEP? obecne kernel32.dll ma Base 7C800000 a tam ju aj najdes.
(odpovědět)
alf0nz | 91.127.29.*23.10.2007 18:20
re: Adresa kernel32.dll při startu programu#
eip = EntryPoint v PE hlavičce. Base se bohužel liší podle verze Windows, třeba na mých Win98SE to je 0xBFF70000.
(odpovědět)
Řrřola | 213.220.234.*23.10.2007 19:32
re: Adresa kernel32.dll při startu programu#
oprava... eip = EntyPoint+ImageBase
(odpovědět)
Řrřola | 213.220.234.*23.10.2007 19:33
re: Adresa kernel32.dll při startu programu#
ano Base sa lisi to je pochopitelne a takisto musis pocitat aj s relokaciou,aj ked standartne dll ako kernel32 user32 ... maju base taku,aby si nezavazdali v adresnom priestore a nemuseli sa relokovat.
(odpovědět)
alf0nz | 78.98.49.*24.10.2007 15:52
re: Adresa kernel32.dll při startu programu#
Jestli to máš ověřeno na 98 a XP, tak pak už asi všude (zbývá snad otestovat to na Vistě).
Otázka je, jestli může kdy v praxi nastat teoretická situace, kdy je kernel32 odswapovaný na disk a tudíž vlastně v RAMěti není...
(odpovědět)
gugumaa | 195.113.79.10/10.0.10.*24.10.2007 18:06
re: Adresa kernel32.dll při startu programu#
Diky :). Podle všeho jsou kernel32 a ntdll na svých adresách vždycky k dispozici (pokud jsou zrovna odswapované, tak přístup do jejich prostoru vyvolá page fault a Windows je nahrajou).
(odpovědět)
Řrřola | 213.220.234.*25.10.2007 0:31
re: Adresa kernel32.dll při startu programu#
btw ano je to tak,na zaciatku bude na stacku adresa ukazujuca niekde do kernel32
(odpovědět)
alf0nz | 91.127.204.*26.10.2007 18:25

Zpět
 
 
 

 
BBCode