Próbuję znaleźć skuteczny sposób wykonania poziomu 5 Wyzwanie bandytów OverTheWire .
W każdym razie mam kilka plików, a jest tylko jeden, który spełnia następujące kryteria:
- Czytelny dla człowieka
- Rozmiar 1033 bajtów
- Niemożliwe do wykonania
W tej chwili używam polecenia find
i jestem w stanie znaleźć pliki spełniające 2 ostatnie kryteria:
find . -size 1033c ! -executable
Jednak nie wiem, jak wyłączyć pliki nieczytelne dla człowieka . Rozwiązania, które znalazłem dla tego wyzwania, używają parametru testowego -readable
, ale nie sądzę, żeby to działało. -readable
patrzy tylko na uprawnienia do plików, a nie na ich zawartość, podczas gdy opis wyzwania prosi o plik ASCII lub coś w tym rodzaju.
Komentarze
- Jak zdefiniujesz czytelny dla człowieka? Nie binarny?
- polecenie pliku jest twoim przyjacielem 🙂
- Może być duplikatem: stackoverflow.com/questions/14505218/…
- Ludzie są jednym z najbardziej inteligentnych znanych gatunków na ziemi. ' są także jedynymi znanymi z komputerów. Potrafią odczytać większość plików, pod warunkiem, że mogą znaleźć typ i zdobyć klucze szyfrowania dla jednego zaszyfrowanego.
- SPOILER ALERT !!
Odpowiedź
Tak, możesz użyć find
w celu wyszukania niewykonywalnych plików o odpowiednim rozmiarze, a następnie użyj file
, aby sprawdzić ASCII. Coś w rodzaju:
find . -type f -size 1033c ! -executable -exec file {} + | grep ASCII
Questi jednak nie jest tak proste, jak się wydaje. „Czytelny dla człowieka” to strasznie niejasny termin. Przypuszczalnie masz na myśli tekst. OK, ale jakiego rodzaju tekst? Tylko łacińskie znaki ASCII? Pełny Unicode? Weźmy na przykład te trzy pliki:
$ cat file1 abcde $ cat file2 αβγδε $ cat file3 abcde αβγδε $ cat file4 #!/bin/sh echo foo
Wszystkie są tekstowe i czytelne dla człowieka. Teraz zobaczmy, co robi z nich file
:
$ file * file1: ASCII text file2: UTF-8 Unicode text file3: UTF-8 Unicode text file4: POSIX shell script, ASCII text executable
A więc znajdzie tylko file1
(na potrzeby tego przykładu wyobraźmy sobie, że te pliki mają 1033 znaki). Możesz rozwinąć find
, aby wyszukać ciąg text
:
find . -type f -size 1033c ! -executable -exec file {} + | grep -w text
W przypadku -w
grep
wydrukuje tylko wiersze, w których text
zostanie znalezione jako samodzielne słowo. To powinno być bardzo zbliżone do tego, co chcesz, ale nie mogę zagwarantować, że nie ma innego typu pliku, którego opis mógłby również zawierać ciąg text
.
Odpowiedź
Podczas gdy -exec
jest najczęściej używany do zrobienia czegoś z plikami, które jeśli zostanie znaleziony, może również działać jako test. Dlatego możemy dodać go do innych kryteriów:
find . \ -size 1033c \ -not -executable \ -exec sh -c "file {} | grep "text$"" \;
Pamiętaj, grep
zwraca wartość różną od zera, gdy wzorzec nie został znaleziony, a sh -c "COMMAND"
zwróci wynik oceny (o ile jest prawidłowy). drukuj tylko te pliki, w których file <filename>
wypluwa coś, co kończy się na text
, np. „Tekst UTF-8 Unicode” lub „Tekst ASCII”, ale a nie „Tekst rozszerzonego ASCII w formacie innym niż ISO, z sekwencjami ucieczki”.
W jednym wierszu kończy się to nawet krócej niż przejście przez xargs
:
find . -size 1033c -not -executable -exec sh -c "file {} | grep "text$"" \;
Zachowaj i Pamiętaj, że możesz zastąpić sh -c "file {} | grep "text$""
dowolnym niestandardowym poleceniem. Jeśli chcesz sprawdzić coś bardzo złożonego, lepszym pomysłem może być dostarczenie skryptu powłoki i użycie go zamiast tego:
find . -size 1033c -not -executable -exec is_human_readable.sh {} \;
co w przypadku długiego run, jest łatwiejsze w utrzymaniu niż historia Twojej powłoki:
#!/bin/sh file "$@" | grep "text$" > /dev/null
Komentarze
- Świetnie! Zwróć jednak uwagę, że dopasowanie
text$
spowoduje wykluczenie rzeczy rozpoznawanych jako skrypty powłoki. Wszystko, co ma znak shebang, jest identyfikowane jako skrypt, a te są całkowicie czytelne dla człowieka. - @terdon to prawda, ale skrypty są zazwyczaj wykonywalne: D. W związku z tym właściwy skrypt powinien również rozpoznawać pliki PDF. Z drugiej strony, czy plik PDF zawierający obraz jest czytelny ? Czy plik PNG jakiegoś tekstu czytelnego ? Prawdopodobnie. Kompletny test będzie… trudny.
Odpowiedź
Wystarczy użyć:
find inhere -size 1033c
Otrzymasz jedyny plik zawierający hasło.
Komentarze
- dlaczego + 1033c zwraca więcej plików? czy to jest jak znak większy lub równy?
Odpowiedź
find . -size 1033c ! -executable -exec file {} +
Odpowiedź
Po prostu uruchom następujące polecenie na zawartości katalogu:
$ file -- * -file00: data -file01: data -file02: data -file03: data -file04: data -file05: data -file06: data -file07: ASCII text -file08: data -file09: data $ cat -- \-file07 <output>
Odpowiedź
Jest tylko 1 plik o rozmiarze 1033
bajtów.
bandit5@bandit:~$ find -size 1033c ./inhere/maybehere07/.file2 bandit5@bandit:~$
Dlaczego 1033c
, a nie 1033
? Sprawdź stronę man
-size n[cwbkMG] File uses n units of space, rounding up. The following suffixes can be used: `b" for 512-byte blocks (this is the default if no suffix is used) `c" for bytes `w" for two-byte words `k" for Kilobytes (units of 1024 bytes) `M" for Megabytes (units of 1048576 bytes) `G" for Gigabytes (units of 1073741824 bytes)
Sprawdź to za pomocą polecenia ls -l
i file
, a otrzymasz odpowiedź.
bandit5@bandit:~$ ls -l ./inhere/maybehere07/.file2 -rw-r----- 1 root bandit5 1033 May 7 20:15 ./inhere/maybehere07/.file2 bandit5@bandit:~$ bandit5@bandit:~$ file ./inhere/maybehere07/.file2 ./inhere/maybehere07/.file2: ASCII text, with very long lines bandit5@bandit:~$
- czytelny dla człowieka (
ASCII text
) - Rozmiar 1033 bajtów (również w
ls -l
wyjście) - niewykonywalny (
-rw-r-----
)
Odpowiedź
find . -size 1033c ! -executable|xargs file|grep "ASCII text" |awk -F: "{print $1}"
Wypróbuj te połączone polecenia. działa na mojej stacji.
Odpowiedź
Możesz spróbować tego
find . -size 1033c ! -executable -exec file {} +
Twoje wyzwanie nie pozwala na grep
. plik hasła zostanie zgłoszony jako „tekst ASCII z bardzo długimi liniami”
Odpowiedź
Aby odfiltrować czytelne dla człowieka nazwy plików, możesz użyć [:print:]
( printable ) klasy znaków name. Więcej informacji na temat takich klas znajdziesz w podręczniku grep
.
find . -type f -size 1033c -name "[[:print:]]*" ! -executable
Po chwili namysłu , wymaganie „czytelny dla człowieka” może odnosić się do zawartości pliku, a nie jego nazwy. Innymi słowy, szukałbyś plików tekstowych . To jest trochę trudniejsze. Ponieważ @ D_Bye zasugerował w komentarzu, należy następnie użyć polecenia file
, aby określić typ zawartości pliku. Jednak uruchomienie file
po potoku, ponieważ skomplikowałoby to zadanie wyświetlania nazwy pliku. Oto, co proponuję:
find . -type f -size 1033c ! -executable -exec sh -c "file -b $0 | grep -q text" {} \; -print
Tak w skrócie działa file
-część:
-
-exec
predykat wykonujesh -c "file -b $0 | grep -q text" FILENAME
dla każdegoFILENAME
, który spełnia wszystkie poprzednie warunki (typ, rozmiar, plik niewykonywalny). - Dla każdego z tych plików , powłoka (
sh
) uruchamia ten krótki skrypt :file -b $0 | grep -q text
, zastępując$0
nazwą pliku. -
file
określa typ zawartości każdego pliku i wyświetla te informacje. Opcja-b
zapobiega drukowaniu nazwa każdego testowanego pliku. -
grep
filtry wyjście pochodzące z
program wyszukujący wiersze zawierające „tekst” . (Przekonaj się sam, jak wygląda typowe wyjście poleceniafile
.)
grep
nie wyświetla filtrowany tekst, ponieważ ma podaną opcję -q
(cicha) . Po prostu zmienia swój stan wyjścia na 0
(co oznacza „prawda” – znaleziono filtrowany tekst) lub 1 (co oznacza „błąd „- tekst ” tekst „ nie pojawił się w wynikach z file
). grep
jest przekazywany dalej przez sh
do find
i działa jako końcowy wynik całości Test „-exec sh -c "file $0 | grep -q text" {} \;
„. -print
polecenie jest wykonywane (tzn. drukowana jest nazwa testowanego pliku). Odpowiedź
bandit4@bandit:~$ ls inhere bandit4@bandit:~$ file inhere/* inhere/-file00: data inhere/-file01: data inhere/-file02: data inhere/-file03: data inhere/-file04: data inhere/-file05: data inhere/-file06: data inhere/-file07: ASCII text inhere/-file08: data inhere/-file09: data bandit4@bandit:~$ pwd /home/bandit4 bandit4@bandit:~$ cat /home/bandit4/inhere/-file07 koReBOKuIDDepwhWk7jZC0RTdopnAYKh bandit4@bandit:~$
Komentarze
- Po prostu użyj file inhere / * i cat / home / bandit4 / inhere / -file07
Odpowiedź
find -type f ! -executable -size 1033c
dostanie plik z ćwiczenia
Odpowiedź
find . -type f -size 1033c ! -executable | xargs file | grep text
Fan jednej wkładki
Odpowiedź
Myślę, że dłuższy sposób znalezienia hasła dla tego poziomu bandytów, o którym wspomina większość powyżej, za pomocą polecenia find i grep, jest najbardziej opisowym poleceniem.
find . -type f -size 1033c ! -executable -exec file {} + | grep ASCII
Ale po użyciu polecenia „file” more zdałem sobie sprawę, że dość łatwo jest zlokalizować pliki czytelne dla człowieka (aka ASCII na tym poziomie) w ten sposób, sprawdzając typy plików całych katalogów.Katalog inhere zawiera pliki o nazwie „-filexx” lub szybko sprawdź cały katalog inhere za pomocą file ./*
Oto moje podejście.
bandit4@bandit:~/inhere$ file ./* ./-file00: data ./-file01: data ./-file02: data ./-file03: data ./-file04: data ./-file05: data ./-file06: data ./-file07: ASCII text ./-file08: data ./-file09: data bandit4@bandit:~/inhere$ cat ./-file07 koReBOKuIDDepwhWk7jZC0RTdopnAYKh