Gwiazdka w nazwach plików i folderów ?

Czy to w ogóle możliwe ? Okazuje się, że tak.
Na możliwość tworzenia nazw plików czy folderów zawierających gwiazdkę wpadłem przez przypadek, czytając wybrane fragmenty driver’a NTFS robiąc research odnośnie długich ścieżek pod Windows’em.

[ Gdzie kryje się sekret? ]
Sekretna flaga umożliwiająca użycia gwiazdki(wildcard’u) jest używa jako drugi argument następującej funkcji:

PAGE:00038359 ; int __stdcall NtfsIsFileNameValid(PUNICODE_STRING, bool)
PAGE:00038359
PAGE:00038359 var_2           = byte ptr -2
PAGE:00038359 var_1           = byte ptr -1
PAGE:00038359 fileName        = dword ptr  8
PAGE:00038359 wildCardFlag    = dword ptr  0Ch
PAGE:00038359
PAGE:00038359                 mov     edi, edi
PAGE:0003835B                 push    ebp
PAGE:0003835C                 mov     ebp, esp
PAGE:0003835E                 push    ecx
PAGE:0003835F                 mov     edx, [ebp+fileName]
PAGE:00038362                 mov     cx, [edx]
PAGE:00038365                 test    cx, cx
PAGE:00038368                 push    edi
PAGE:00038369                 mov     [ebp+var_2], 1
PAGE:0003836D                 mov     [ebp+var_1], 1
PAGE:00038371                 jz      loc_5FE42
PAGE:00038377                 test    cl, 1
PAGE:0003837A                 jnz     loc_5FE42
PAGE:00038380                 movzx   ecx, cx
PAGE:00038383                 shr     ecx, 1
PAGE:00038385                 push    0
PAGE:00038387                 pop     edi
PAGE:00038388                 jz      loc_5FE3D
PAGE:0003838E                 push    ebx
PAGE:0003838F                 push    esi
PAGE:00038390                 mov     esi, [edx+4]
PAGE:00038393
PAGE:00038393 loc_38393:                              
PAGE:00038393                 mov     bx, [esi]
PAGE:00038396                 cmp     bx, 0FFh
PAGE:0003839B                 ja      short loc_383C8
PAGE:0003839D                 test    bl, bl
PAGE:0003839F                 jl      short loc_383C8
PAGE:000383A1                 mov     edx, ds:_FsRtlLegalAnsiCharacterArray
PAGE:000383A7                 mov     edx, [edx]
PAGE:000383A9                 movzx   eax, bx
PAGE:000383AC                 movzx   eax, byte ptr [eax+edx]
PAGE:000383B0                 mov     dl, byte ptr [ebp+wildCardFlag]
PAGE:000383B3                 neg     dl
PAGE:000383B5                 sbb     edx, edx
PAGE:000383B7                 and     edx, 8
PAGE:000383BA                 or      edx, 4
PAGE:000383BD                 and     eax, edx
PAGE:000383BF                 mov     [ebp+fileName], eax
PAGE:000383C2                 jz      loc_5FE34
PAGE:000383C8
PAGE:000383C8 loc_383C8:                              
PAGE:000383C8                                         
PAGE:000383C8                 cmp     bx, ':'
PAGE:000383CC                 jz      loc_5FE34
PAGE:000383D2                 cmp     bx, '\'
PAGE:000383D6                 jz      loc_5FE34
PAGE:000383DC                 cmp     bx, '.'
PAGE:000383E0                 jz      short loc_383E6
PAGE:000383E2                 mov     [ebp+var_2], 0
PAGE:000383E6
PAGE:000383E6 loc_383E6:                              
PAGE:000383E6                 inc     edi
PAGE:000383E7                 inc     esi
PAGE:000383E8                 inc     esi
PAGE:000383E9                 cmp     edi, ecx
PAGE:000383EB                 jb      short loc_38393
PAGE:000383ED
PAGE:000383ED loc_383ED:                             
PAGE:000383ED                 cmp     [ebp+var_2], 0
PAGE:000383F1                 pop     esi
PAGE:000383F2                 pop     ebx
PAGE:000383F3                 jnz     loc_5FE3D
PAGE:000383F9
PAGE:000383F9 loc_383F9:                              
PAGE:000383F9                                         
PAGE:000383F9                 mov     al, [ebp+var_1]
PAGE:000383FC                 pop     edi
PAGE:000383FD                 leave
PAGE:000383FE                 retn    8
PAGE:000383FE _NtfsIsFileNameValid@8 endp

Jako, że we wszystkich znaczących miejscach wywołania tej funkcji ma ona ustawiony drugi parametr na False, to tak jak przywykliśmy, utworzenie pliku czy folder’u z gwiazdką w nazwie jest nie możliwe.

[ Mały patch ]
Oczywiście, żeby zmodyfikować tą ustawioną na sztywno flagę z false na true potrzebujemy dostępu do driver’a ntfs z r0 jeżeli chcemy go zmodyfikować run-time i nie bawić się w obchodzenie WFP.
Jako, że wstępne badania nie przyniosły nic szczególnego to nie fatygowałem się nawet, żeby pisać driver, patch’a wykonałem w prost z windbg:

Patch:

PAGE:000383B0                 mov     dl, 1
PAGE:000383B2                 nop

A oto efekty:

Ku mojemu zaskoczeniu jak widać na powyższym screenie wszystko działa poprawnie.

[ (Nie)pożądane działanie: ]
Jedyny wpływ na niepoprawne działanie systemu jaki udało mi się zaobserwować po paru prostych testach to np. brak możliwości skopiowania czegokolwiek do folderu którego nazwa zawiera asterisk.
Oczywiście kompletny fail spotyka nas kiedy w dowolnym miejscu naszej partycji pozostanie plik lub folder zawierający wildcard, a my przestawimy flagę w
NtfsIsFileNameValid na false (domyślne ustawienie). W takiej sytuacji cała partycja staje się dla nas nie dostępna ;).
Jeżeli kogoś zainspirował temat i ma chęć prowadzić dalsze badania to z chęcią usłyszę czy udało się wycisnąć z tego coś więcej;)

Ten wpis został opublikowany w kategorii Analiza, RE i oznaczony tagami , , , . Dodaj zakładkę do bezpośredniego odnośnika.

Możliwość komentowania jest wyłączona.