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) |