- OSTRZEŻENIE NIE PRÓBUJ URUCHOMIĆ TEGO NA MASZYNIE PRODUKCYJNEJ
Czytając stronę Wikipedii na ten temat , ogólnie śledzę, co się dzieje z następującym kodem:
:(){ :|:& };:
fragment opisu
Następująca bomba widelca została zaprezentowana jako sztuka w 2002 roku;56 jego dokładne pochodzenie nie jest znane, ale istniało na Usenecie przed 2002 rokiem. Bomba jest wykonywana przez wklejenie następujących 13 znaków w powłoce UNIX, takiej jak bash lub zsh . Działa poprzez zdefiniowanie funkcji o nazwie „:”, która wywołuje się dwukrotnie, raz na pierwszym planie i raz w tle.
Jednak ostatni fragment nie jest dla mnie całkowicie jasny. Widzę definicję funkcji:
:(){ ... }
Ale co jeszcze się dzieje? Czy inne powłoki, takie jak ksh
, csh
i tcsh
cierpią z powodu tego samego losu, że są w stanie zbudować coś podobnego?
bash
shell-script
zsh
fork
slm
źródło
źródło
Odpowiedzi:
Ta bomba rozwidlona zawsze przypomina mi coś, co powiedział nauczyciel programowania AI na jednej z pierwszych lekcji, w których uczestniczyłem: „Aby zrozumieć rekurencję, najpierw musisz zrozumieć rekurencję”.
U podstaw tej bomby jest funkcja rekurencyjna . Zasadniczo tworzysz funkcję, która wywołuje siebie, która wywołuje siebie, która wywołuje siebie .... aż do wyczerpania zasobów systemowych. W tym konkretnym przypadku rekurencja jest wzmacniana przez użycie potokowania funkcji do siebie ORAZ jej tła.
Widziałem tę odpowiedź na StackOverflow i myślę, że podany tam przykład najlepiej to ilustruje, tylko dlatego, że łatwiej jest zobaczyć, co robi na pierwszy rzut oka (skradziony z linku powyżej ...)
Zdefiniuj funkcję błędu
☃() { ... }
, której ciało wywołuje się (funkcja błędu), przesyłając dane wyjściowe do siebie (funkcja błędu)☃|☃
, i określ wynik w tle&
. Następnie, po funkcja jest zdefiniowana, rzeczywiście wywołać funkcję błędu,; ☃
.Zauważam, że przynajmniej na mojej Arch VM, potrzeba podłożenia procesu do tła nie jest wymagana do uzyskania tego samego rezultatu końcowego, do zużycia całej dostępnej przestrzeni procesu i renderowania hosta. Właściwie teraz powiedziałem, że wydaje się, że czasami kończy proces ucieczki i po jego przeskanowaniu
-bash: fork: Resource temporarily unavailable
zakończy się naTerminated
(ijournalctl
pokazuje zrzut rdzenia bash).Aby odpowiedzieć na twoje pytanie dotyczące csh / tcsh, żadna z tych powłok nie obsługuje funkcji, możesz tylko alias. W przypadku tych powłok należy napisać skrypt powłoki, który wywołuje się rekurencyjnie.
Wygląda na to, że zsh cierpi z powodu tego samego losu (z tym samym kodem), nie zrzuca zrzutu pamięci i powoduje, że Arch daje
Out of memory: Kill process 216 (zsh) score 0 or sacrifice child.
, ale nadal się rozwija. Po chwili stwierdzaKilled process 162 (systemd-logind) ...
(i nadal ma rozwidlenie zsh).Arch nie wydaje się mieć
pacman
wersji ksh, więc zamiast tego musiałem wypróbować ją na Debianie. ksh sprzeciwia się:
jako nazwa funkcji, ale używając czegoś - powiedzmy, żeb()
wydaje się mieć pożądany wynik.źródło
Ctrl+Shift+u+<hex>
gdzie hex to kod szesnastkowy znaku Unicode, który chcesz wyświetlić. Listę widocznych kodów Unicode można znaleźć na stronie: fileformat.info/info/unicode/utf8test.htm (większość nieparzystych znajduje się w sekcji „Różne”). System Windows powinien pobrać kasę superuser.com/questions/47420/... , a ja osobiście korzystam z narzędzia wymienionego w łączuunicodeinput.exe
lub wycinam i wklejam za pomocą przeglądarki. Zawsze możesz użyć sekwencji HTML zgodnie z sugestią samblera.