Знайдіть файли, прочитані людиною


15

Я намагаюся знайти ефективний спосіб зробити рівень 5 виклику бандитів OverTheWire .

У будь-якому випадку у мене є маса файлів, і є лише один, який відповідає таким критеріям:

  • Людина, що читається
  • Розмір 1033 байт
  • Невиконаний

Зараз я використовую findкоманду, і я можу знайти файли, що відповідають двом останнім критеріям:

find . -size 1033c ! -executable

Однак я не знаю, як вилучити файли, не прочитані людиною. Я знайшов рішення для цього завдання для використання -readableтестового параметра, але я не думаю, що це працює. -readableдивиться лише на дозволи файлів, а не на їх вміст, тоді як в описі виклику запитується файл ASCII або щось подібне.


1
Як ви визначаєте читабельність людини? Не бінарний?
terdon

2
команда файлу - ваш друг :)
Ромео Нінов

Може бути , дублікат: stackoverflow.com/questions/14505218 / ...
Zuazo

3
Люди - один з найрозумніших відомих видів на землі. Вони також єдині, кого відомо з комп'ютерами. Вони можуть читати більшість файлів за умови, що вони можуть дізнатися тип та отримати ключі шифрування для шифрованого.
Стефан Шазелас

1
СПОЙЛЕР ПОПЕРЕДЖЕННЯ!!
Дан Болсер

Відповіді:


17

Так, ви можете findшукати невиконані файли потрібного розміру, а потім використовувати fileдля перевірки наявності ASCII. Щось на зразок:

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

Питання, однак, не таке просте, як це звучить. «Людська читабельність» - жахливо розпливчастий термін. Імовірно, ви маєте на увазі текст. Гаразд, але який текст? Лише латинський символ ASCII? Повний Unicode? Наприклад, розгляньте ці три файли:

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

Це всі текстові та людські для читання. Тепер давайте розберемося, що fileз них складається:

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

Отже, findкоманда вище знайде лише file1(заради цього прикладу, давайте уявимо, що у цих файлах було 1033 символи). Ви можете розширити, findщоб шукати рядок text:

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

З -w, grepбуде друкувати лише рядки, де textвони знаходяться як окреме слово. Це має бути близько до того, що ви хочете, але я не можу гарантувати, що немає іншого типу файлів, опис якого також може містити рядок text.


4

Хоча -execв основному використовується для того, щоб щось робити з файлами, які там знайдені, вони також можуть бути тестом. Тому ми можемо додати його до інших ваших критеріїв:

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

Пам'ятайте, що grepповертається ненульовим, коли шаблон не знайдено, і sh -c "COMMAND"поверне результат оцінки (доки він дійсний). Таким чином, це буде друкувати файли лише там, де file <filename>випирається щось, що закінчується text, наприклад, "UTF-8 Unicode text` або" ASCII text ", але не" Текст без розширеного ISO-ASCII, з послідовностями ".

У одному рядку він навіть закінчується коротше, ніж перехід xargs:

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

Майте на увазі, що ви можете замінити sh -c 'file {} | grep "text$"'будь-яку власну команду. Якщо ви хочете перевірити щось дуже складне, може бути кращою ідеєю надати скрипт оболонки і скористатися цим:

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

який, з часом, простіше в обслуговуванні, ніж історія вашої оболонки:

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

Приємно! Однак зауважте, що відповідність text$виключатиме речі, розпізнані як сценарії оболонки. Все, що стосується шебангу, ідентифікується як сценарій, і це цілком зрозуміло для людини.
тердон

@terdon правда, але сценарії, як правило, виконують: D. При цьому, належний сценарій також повинен розпізнавати PDF-файли. Але з іншого боку, чи PDF-файл, що містить людину, читабельний ? Чи читається PNG деякого тексту ? Ймовірно. Я думаю, завершений тест буде ... складним.
Зета


1

Вам потрібно використовувати лише:

find inhere -size 1033c

Це дасть вам єдиний файл, який містить пароль.


чому + 1033c повертає більше файлів? це як знак більшої або рівності-?
szeitlin

1

Просто запустіть наступне проти вмісту каталогу:

$ 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}'

Спробуйте скористатися комбінованими командами. працює на моїй станції.


0

Ви можете спробувати це

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

Ваше завдання не дозволяє grep. файл пароля буде повідомлено як "текст ASCII з дуже довгими рядками"


0

Для фільтрації імен файлів, читаних людиною, ви можете скористатись [:print:]( ім'я класу для друку ) класу символів . Більше про такі заняття ви знайдете в посібнику для grep.

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

По-друге, вимога "читабельна людиною" вимога може стосуватися вмісту файлу, а не його імені. Іншими словами, ви б шукали текстові файли. Це трохи складніше. Як @D_Bye запропонував у коментарі, ви повинні використовувати fileкоманду для визначення типу вмісту файлу. Але запустити fileза трубою було б недобре , бо це ускладнить завдання відображення імені файлу. Ось що я пропоную:

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

Це коротко, як fileпрацює -part:

  • У -execпредикатні виконує sh -c 'file -b $0 | grep -q text' FILENAMEдля кожного , FILENAMEякий задовольняє всі попередні умови (типу, розмір, не виконує, той).
  • Для кожного з цих файлів оболонка ( sh) запускає цей короткий сценарій : file -b $0 | grep -q textзамінюючи $0ім'я файлу.
  • fileПрограма визначає тип вмісту кожного файлу і виводить цю інформацію. Ця -bопція запобігає друку імені кожного перевіреного файлу.
  • grepфільтрує вихід, що надходить з fileпрограми, шукаючи рядки, що містять "текст" . (Побачте самі, як fileвиглядає типовий вихід команди.)
  • Але grepне виводить відфільтрований текст, тому що в ньому є -q(тиха) опція. Що це робить, це просто змінити свій статус виходу на або 0(що являє собою "справжнє" - відфільтрований текст знайдено), або 1 (що означає "помилка" - текст "текст" не відображався у висновку з file).
  • Справжній / хибний статус виходу, що надходить grep, передається далі shдо findта виступає кінцевим результатом всього -exec sh -c 'file $0 | grep -q text' {} \;тесту " " тесту.
  • У випадку, якщо вищевказаний тест повернеться істинним , -printкоманда виконується (тобто друкується ім'я тестованого файла).

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

Просто використовуйте файл inhere / * та cat / home / bandit4 / inhere / -file07



0

Я думаю, що довший спосіб пошуку пароля для цього рівня бандитів, згаданий більшістю вище, використовуючи команду find and grep, є найбільш описовою командою.

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

Але, скориставшись командою «файл», я зрозумів, що досить легко знайти файли, прочитані людиною (він же ASCII на цьому рівні), перевіривши цілі типи файлів каталогів. Каталог inhere містить файли з назвою '-filexx' або швидко перевіряє весь каталог, де немаєfile ./*

Тут був мій підхід.

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.