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