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:~$ 
  1. czytelny dla człowieka (ASCII text)
  2. Rozmiar 1033 bajtów (również w ls -l wyjście)
  3. 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 wykonuje sh -c "file -b $0 | grep -q text" FILENAME dla każdego FILENAME, 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.)

  • Ale 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).
  • Status wyjścia prawda / fałsz pochodzący z 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" {} \;„.
  • Jeśli powyższy test zwrócił true , -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 

    Dodaj komentarz

    Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *