Znajdź pliki czytelne dla ludzi


14

Próbuję znaleźć skuteczny sposób na wykonanie 5 poziomu wyzwania bandyty OverTheWire .

W każdym razie mam kilka plików i tylko jeden spełnia następujące kryteria:

  • Czytelny dla człowieka
  • Rozmiar 1033 bajtów
  • Niewykonalny

Obecnie używam findpolecenia i mogę znaleźć pliki spełniające 2 ostatnie kryteria:

find . -size 1033c ! -executable

Nie wiem jednak, jak usprawiedliwić pliki nieczytelne dla człowieka. Rozwiązania, które znalazłem dla tego wyzwania, wykorzystują -readableparametr testowy, ale nie sądzę, żeby to działało. -readablepatrzy tylko na uprawnienia do plików, a nie na ich zawartość, podczas gdy opis wyzwania prosi o plik ASCII lub coś w tym rodzaju.


1
Jak definiujesz czytelny dla człowieka? Nie binarny?
terdon

2
polecenie pliku jest twoim przyjacielem :)
Romeo Ninov


3
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ą dowiedzieć się o typie i uzyskać klucze szyfrujące dla jednego zaszyfrowanego.
Stéphane Chazelas

1
ALARM SPOILERA !!
Dan Bolser

Odpowiedzi:


17

Tak, możesz użyć, findaby wyszukać pliki wykonywalne o odpowiednim rozmiarze, a następnie użyć, fileaby sprawdzić ASCII. Coś jak:

find . -type f -size 1033c ! -executable -exec file {} + | grep ASCII

Pytanie nie jest jednak tak proste, jak się wydaje. „Czytelny dla człowieka” to strasznie niejasne określenie. Prawdopodobnie masz na myśli tekst. OK, ale jaki rodzaj tekstu? Tylko znak łaciński ASCII? Pełny Unicode? Weźmy na przykład następujące trzy pliki:

$ cat file1
abcde
$ cat file2
αβγδε
$ cat file3
abcde
αβγδε
$ cat file4
#!/bin/sh
echo foo

Wszystkie są czytelne dla ludzi i tekstu. Zobaczmy teraz, co fileje tworzy:

$ file *
file1: ASCII text
file2: UTF-8 Unicode text
file3: UTF-8 Unicode text
file4: POSIX shell script, ASCII text executable

Tak więc findpowyższe polecenie znajdzie tylko file1(na potrzeby tego przykładu wyobraźmy sobie, że pliki te miały 1033 znaki). Możesz rozwinąć, findaby wyszukać ciąg text:

find . -type f -size 1033c ! -executable -exec file {} + | grep -w text

Za pomocą -w, grepdrukuje tylko wiersze, w których textwystępuje jako samodzielne słowo. Który powinien być dość blisko tego, co chcesz, ale nie mogę zagwarantować, że nie ma innego typu pliku, którego opis może również zawierać ciąg text.


4

Chociaż -execjest najczęściej używany do robienia czegoś z plikami, które zostały znalezione, 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, grepzwraca wartość niezerową, gdy wzorzec nie został znaleziony, i sh -c "COMMAND"zwróci wynik oceny (o ile jest poprawny). Spowoduje to więc wydrukowanie tylko plików, w których file <filename>wypluwa się coś, co kończy się na text, np. „UTF-8 Unicode text” lub „ASCII text”, ale nie „Text non-ISO Extended-ASCII, z sekwencjami ucieczki”.

W jednym wierszu jest nawet krótszy niż przejście xargs:

find . -size 1033c -not -executable -exec sh -c 'file {} | grep "text$"' \;

Pamiętaj, że możesz zastąpić sh -c 'file {} | grep "text$"'dowolne niestandardowe polecenie. Jeśli chcesz sprawdzić coś bardzo złożonego, lepszym pomysłem może być udostępnienie skryptu powłoki i użycie go:

find . -size 1033c -not -executable -exec is_human_readable.sh {} \;

co na dłuższą metę jest łatwiejsze do utrzymania niż historia twojej powłoki:

#!/bin/sh
file "$@" | grep "text$" > /dev/null

Ładny! Pamiętaj jednak, że dopasowanie text$wyklucza rzeczy rozpoznawane jako skrypty powłoki. Wszystko z shebang jest identyfikowane jako skrypt, a te są doskonale czytelne dla ludzi.
terdon

@terdon prawda, ale skrypty mają tendencję do wykonywania: D. To powiedziawszy, odpowiedni skrypt powinien również rozpoznawać pliki PDF. Ale z drugiej strony, czy plik PDF zawierający obraz jest czytelny dla człowieka ? Czy PNG jakiegoś tekstu jest czytelny ? Prawdopodobnie. Wydaje mi się, że pełny test będzie… trudny.
Zeta


1

Musisz tylko użyć:

find inhere -size 1033c

To da ci jedyny plik zawierający hasło.


dlaczego + 1033c zwraca więcej plików? czy to jest jak znak „większy czy równy”?
szeitlin

1

Po prostu uruchom następujące polecenie w stosunku do 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>

0
find . -size 1033c ! -executable|xargs file|grep "ASCII text" |awk -F: '{print $1}'

Spróbuj tych połączonych poleceń. działa na mojej stacji.


0

Możesz tego spróbować

find . -size 1033c ! -executable -exec file {} +

Twoje wyzwanie nie pozwala grep. plik hasła zostanie zgłoszony jako „tekst ASCII, z bardzo długimi liniami”


0

Aby odfiltrować nazwy plików czytelne dla człowieka, możesz użyć [:print:]( klasy drukowalnej ) nazwy klasy znaków . Więcej informacji o takich klasach znajdziesz w instrukcji dla grep.

find . -type f -size 1033c -name "[[:print:]]*" ! -executable

Z drugiej strony wymóg „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 trochę trudniejsze. Zgodnie z sugestią @D_Bye w komentarzu, należy użyć filepolecenia, aby określić typ zawartości pliku. Ale nie byłoby dobrym pomysłem uruchamianie filepo potoku, ponieważ skomplikowałoby to zadanie wyświetlania nazwy pliku. Oto, co sugeruję:

find . -type f -size 1033c ! -executable -exec sh -c 'file -b $0 | grep -q text' {} \; -print

Oto pokrótce, jak filedziała -part:

  • W -execWykonuje predykatywnych sh -c 'file -b $0 | grep -q text' FILENAMEdla każdego FILENAME, które spełnia wszystkie poprzednie warunki (typ, rozmiar, nie wykonywany).
  • Dla każdego z tych plików, powłoki ( sh) uruchamia ten krótki scenariusz : file -b $0 | grep -q text, zastępując $0z nazwy pliku.
  • fileProgram określa typ zawartości każdego pliku i wysyła tę informację. Ta -bopcja zapobiega drukowaniu nazwy każdego testowanego pliku.
  • grepfiltruje wyjście pochodzące z fileprogramu, wyszukując wiersze zawierające „tekst” . (Przekonaj się, jak wygląda typowe wyjście filepolecenia).
  • Ale grepnie wyświetla przefiltrowanego tekstu, ponieważ ma -qpodaną opcję (cichą). To, co robi, to po prostu zmień status wyjścia na albo 0(co oznacza „prawda” - znaleziono przefiltrowany tekst) lub 1 (co oznacza „błąd” - tekst „tekst” nie pojawił się na wyjściu z file).
  • Prawdziwy / false status wyjścia pochodzące z grepprzepuszcza dalej shsię findi działa jako wynik końcowy całego „ -exec sh -c 'file $0 | grep -q text' {} \;” test.
  • W przypadku, gdy powyższy test zwrócił wartość true , -printpolecenie jest wykonywane (tzn. Wypisywana jest nazwa testowanego pliku).

0
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:~$ 

Wystarczy użyć pliku inhere / * i cat / home / bandit4 / inhere / -file07



0

Myślę, że dłuższy sposób na znalezienie hasła dla tego poziomu bandyty wspomniany przez większość powyżej przy użyciu funkcji find i grep jest najbardziej opisowym poleceniem.

find . -type f -size 1033c ! -executable -exec file {} + | grep ASCII

Ale po użyciu komendy „file” bardziej uświadomiłem sobie, że łatwo jest zlokalizować pliki czytelne dla ludzi (inaczej ASCII na tym poziomie) w ten sposób, sprawdzając całe typy plików katalogów. Katalog inhere przechowuje pliki o nazwie „-filexx” lub szybko sprawdza 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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.