x64 IsDebuggerPresent

2012-07-26 11:46

Pisząc ostatnio artykuł na temat rozpakowywania plików w formacie PE32+ (nazwa jest myląca i w praktyce dotyczy 64 bitowych plików PE) zastanawiałem się jaka funkcją Windows API obrazuje najlepiej zmiany jakie zaszły pomiędzy wersjami 32 i 64 bitowymi systemu Windows. Z pomocą przyszła mała i dobrze wszystkim znana funkcja IsDebuggerPresent. W wersji 32 wygląda ona tak:

64a118000000    mov     eax,dword ptr fs:[00000018h]

8b4030          mov     eax,dword ptr [eax+30h]

0fb64002        movzx   eax,byte ptr [eax+2]

c3              ret

Wersja 64 bitowa pokazuje różnice w odwołaniu się to TEB (TIB) i PEB, choć oczywiście algorytm działania jest dokładnie ten sam:

65488b042530000000  mov   rax,qword ptr gs:[30h]

488b4860                    mov     rcx,qword ptr [rax+60h]

0fb64102                    movzx   eax,byte ptr [rcx+2]

c3                          ret

Dokładnej inspekcji zmian w strukturach TEB i PEB możemy dokonać za pomocą poleceń WinDbg:

!dt _TEB @$teb

!dt _PEB @$peb

Przy okazji możemy prześledzić jak działa warstwa WOW64 w przypadku uruchomienia 32 bitowego procesu na systemie x64:

image00000000_00400000+0x1000:

00401000 ff1568204000    call    dword ptr [image00000000_00400000+0x2068         (00402068)] ds:002b:00402068={kernel32!IsDebuggerPresentStub (758f4a2d)}

0:000:x86> t

kernel32!IsDebuggerPresentStub:

758f4a2d eb05            jmp     kernel32!IsDebuggerPresent (758f4a34)

0:000:x86> t

kernel32!IsDebuggerPresent:

758f4a34 ff25940d8f75    jmp     dword ptr [kernel32!_imp__IsDebuggerPresent (758f0d94)] ds:002b:758f0d94={KERNELBASE!IsDebuggerPresent (767c2d6f)}

0:000:x86> t

KERNELBASE!IsDebuggerPresent:

767c2d6f 64a118000000    mov     eax,dword ptr fs:[00000018h] fs:0053:00000018=00000000

0:000:x86> u

KERNELBASE!IsDebuggerPresent:

767c2d6f 64a118000000    mov     eax,dword ptr fs:[00000018h]

767c2d75 8b4030          mov     eax,dword ptr [eax+30h]

767c2d78 0fb64002        movzx   eax,byte ptr [eax+2]

767c2d7c c3              ret

767c2d7d cc              int     3

767c2d7e cc              int     3

767c2d7f cc              int     3

767c2d80 cc              int     3

Analizując różnice pomiędzy wersjami 32 i 64 bitowymi warto zwrócić uwagę inne wykorzystanie rejestrów FS i GS.

Struktury TEB i PEB są jednymi z najważniejszych z perspektywy tworzenia stabilnych shellcode’ów dlatego zmiany pomiędzy wersjami 32 i 64 bitowymi są tak ważne.

Blog

MS SQL Server 2005 Extended Support kończy się 12 kwietnia

Rozszerzone wsparcie dla serwera Microsoft SQL Server 2005 kończy się 12 kwietnia. To ostatni moment aby dokonać migracji do wyższej wersji.

Jeśli tego nie zrobiłeś to AVET INS może wesprzeć ...

2016-03-01 09:00, Czytaj więcej Więcej
Kiedy Flash wyginie?

Flash to jedna z tych technologii, która ma bardzo złą – i w tym wypadku całkowicie zasłużenie – reputację w obszarze bezpieczeństwa. Ta reputacja jest tak zła, że od jakiegoś czasu część ...

2016-02-11 16:45, Czytaj więcej Więcej
Krytyczna podatność w kliencie OpenSSH (CVE-2016-0777, CVE-2016-0778)

Wersje oprogramowania klienckiego OpenSSH w wersjach od 5.4 do 7.1 podatne są na atak umożliwiający wyciek pamięci oraz kradzież kluczy prywatnych. W przypadku, gdy połączenie SSH zostanie przerwane ...

2016-02-01 09:30, Czytaj więcej Więcej
Microsoft ogranicza wsparcie IE tylko do wersji 11

Microsoft przestaje wspierać starsze wersje przeglądarki Internet Explorer. Jedyną wspieraną wersją od dzisiaj jest IE 11 i wyższe. Dla wielu systemów (np. Windows 7) może to oznaczać potrzebę aktualizacji lub ...

2016-01-13 09:00, Czytaj więcej Więcej
SafeNet Day: Szyfrowanie w chmurze - prezentacja

Prezentacja Aleksandra Czarnowskiego z konferencji SafeNet Day na temat Szyfrowanie w chmurze jest już dostępna do pobrania. Zapraszamy do pobrania poniżej:

http://www.avet.com.pl/media/pdf/2015-11-02_Szyfrowanie_w_chmurze.pdf

2015-10-31 10:00, Czytaj więcej Więcej