*.exe to tylko konwencja

Dawno, dawno temu, jeszcze w czasach, gdy dominującym systemem był Windows 2000, prowadziłem szkolenie Hardening Windows 2000. W jego ramach pokazywałem kilka “sztuczek”, między innymi wykorzystanie Alternate Data Streams w NTFS.

Jedną ze “sztuczek”, która zrobiła wówczas szczególne wrażenie, było wykorzystanie ADS do ukrycia kodu. Na przykład zapisanie pliku wykonywalnego jako ADS katalogu i uruchomienie tego kodu. Wtedy robiło to większe wrażenie, niż dziś, bo w GUI (Task Manager) nie była pokazywana informacja o ADS. Jak to mogło działać?

Trzeba uświadomić sobie, że plik wykonywalny wcale nie musi mieć rozszerzenia exe. Rozszerzenia \*.exe, \*.com czy \*.dll to tak naprawdę przede wszystkim konwencja. Bez problemu można “uruchomić” choćby plik \*.txt: Name Pid Pri Thd Hnd Priv CPU Time Elapsed Time plik.txt 2648 8 1 17 1408 0:00:00.030 0:03:39.357 Jest to po prostu kwestia odpowiedniego wywołania funkcji CreateProcess. Przy okazji, warto przeczytać: Why does a corrupted binary sometimes result in “Program too big to fit in memory”?.

Oznacza to, że rozpoznawanie typu pliku wyłącznie po jego rozszerzeniu jest sposobem zdecydowanie niewystarczającym, zwłaszcza jeśli chodzi o pliki wykonywalne. Zamiast tego można wykorzystać narzędzia typu: TRiD oraz gt2 (patrz lista narzędzi na wiki). Dla przykładu rezultat narzędzia TRiD :trid plik.txt

TrID/32 – File Identifier v2.02 – © 2003-06 By M.Pontello Definitions found: 3640 Analyzing... Collecting data from file: plik.txt 60.8%25 (.EXE) Win32 Executable MS Visual C++ (generic) (31206/45/13) 16.6%25 (.EXE) Win32 Executable Generic (8527/13/3) 14.7%25 (.DLL) Win32 Dynamic Link Library (generic) (7583/30/2) 3.9%25 (.EXE) Generic Win/DOS Executable (2002/3) 3.8%25 (.EXE) DOS Executable Generic (2000/1)

Jeszcze więcej informacji dostarcza narzędzie gt2 :

gt2 plik.txt gt2 0.35 © 1999-2006 by PHaX (philip[at]helger.com) – plik.txt (389120 bytes) – binary Is a Win32 executable Size of header 00000040h / 64 File size in header 00000490h / 1168 Entrypoint 00000040h / 64 Overlay size 0005EB70h / 387952 No relocation entries PE EXE at offset 000000D8h / 216 Entrypoint 00004446h / 17478 Entrypoint RVA 00005046h Entrypoint section .text Calculated PE EXE size 0005F000h / 389120 Image base 4AD00000h / 1255145472 File seems to be rebased Required CPU type 80386 Required OS 5.01 – Win 98 or 2k Subsystem Windows CUI Linker version 7.10 Stack reserve 00100000h / 1048576 Stack commit 00100000h / 1048576 Heap reserve 00100000h / 1048576 Heap commit 00001000h / 4096 Flags: Relocation info stripped from file File is executable Line numbers stripped from file Local symbols stripped from file Machine based on 32-bit-word architecture Processed/created with: Seems to be linked with Microsoft linker 7.1 / .NET 2003

Oryginał tego wpisu dostępny jest pod adresem *.exe to tylko konwencja

Autor: Paweł Goleń