Încerc să găsesc o modalitate eficientă de a face nivelul 5 al Provocarea banditului OverTheWire .
Oricum, am o grămadă de fișiere și există doar unul care respectă următoarele criterii:
- Citibil de către om
- 1033 octeți în dimensiune
- Neexecutabil
În acest moment, folosesc comanda find
și pot găsi fișierele care corespund ultimelor 2 criterii:
find . -size 1033c ! -executable
Cu toate acestea, nu știu cum să exclud fișierele care nu pot fi citite de om Soluțiile pe care le-am găsit pentru această provocare folosesc parametrul de testare -readable
, dar nu cred că funcționează. -readable
privește doar permisiunile fișierelor și nu conținutul acestuia, în timp ce descrierea provocării solicită un fișier ASCII sau ceva de genul acesta.
Comentarii
- Cum definiți textul care poate fi citit de om? Nu este binar?
- comanda fișierului este prietenul dvs. 🙂
- Poate duplicat de: stackoverflow.com/questions/14505218/…
- Oamenii sunt una dintre cele mai inteligente specii cunoscute pe pământ. Ei ‘ sunt, de asemenea, singurii cunoscuți cu experiență în calculatoare. Pot citi majoritatea fișierelor cu condiția să afle tipul și să dețină cheile de criptare pentru una criptată.
- ALERTĂ SPOILER !!
Răspuns
Da, puteți utiliza find
pentru a căuta fișiere neexecutabile de dimensiunea potrivită și apoi utilizați file
pentru a verifica ASCII. Ceva de genul:
find . -type f -size 1033c ! -executable -exec file {} + | grep ASCII
The questi totuși, nu este atât de simplu pe cât pare. „Citit de om” este un termen oribil de vag. Probabil că te referi la text. OK, dar ce fel de text? Numai caracter ASCII latin? Unicode complet? De exemplu, luați în considerare aceste trei fișiere:
$ cat file1 abcde $ cat file2 αβγδε $ cat file3 abcde αβγδε $ cat file4 #!/bin/sh echo foo
Acestea sunt toate text și pot fi citite de oameni. Acum, să vedem ce face file
dintre ele:
$ file * file1: ASCII text file2: UTF-8 Unicode text file3: UTF-8 Unicode text file4: POSIX shell script, ASCII text executable
Deci, de mai sus va găsi doar file1
(pentru acest exemplu, să ne imaginăm că acele fișiere aveau 1033 caractere). Puteți extinde find
pentru a căuta șirul text
:
find . -type f -size 1033c ! -executable -exec file {} + | grep -w text
Cu -w
, grep
va imprima numai liniile în care text
se găsește ca un cuvânt de sine stătător. Acest ar trebui să fie aproape de ceea ce doriți, dar nu pot garanta că nu există niciun alt tip de fișier a cărui descriere ar putea include și șirul text
.
Răspuns
În timp ce -exec
este folosit mai ales pentru a face ceva cu fișierele care acolo unde este găsit, poate acționa și ca test. Prin urmare, îl putem adăuga la celelalte criterii:
find . \ -size 1033c \ -not -executable \ -exec sh -c "file {} | grep "text$"" \;
Rețineți, grep
returnează diferit de zero atunci când modelul nu a fost găsit, și sh -c "COMMAND"
va returna rezultatul evaluării (atâta timp cât este valabil). imprimați numai fișiere în care file <filename>
scuipă ceva care se termină cu text
, de ex. nu „Text ASCII extins non-ISO, cu secvențe de scăpare”.
Într-o singură linie, se termină chiar mai scurt decât trecerea peste xargs
:
find . -size 1033c -not -executable -exec sh -c "file {} | grep "text$"" \;
Păstrează i nu uitați că puteți înlocui sh -c "file {} | grep "text$""
cu orice comandă personalizată. Dacă doriți să verificați ceva foarte complex, ar putea fi o idee mai bună să furnizați un script shell și să îl utilizați în schimb:
find . -size 1033c -not -executable -exec is_human_readable.sh {} \;
care, pe termen lung rulați, este mai ușor de întreținut decât istoricul shell-ului dvs.:
#!/bin/sh file "$@" | grep "text$" > /dev/null
Comentarii
- Frumos! Rețineți, totuși, că potrivirea
text$
va exclude lucrurile recunoscute ca scripturi shell. Orice lucru cu un shebang este identificat ca un script, iar acestea sunt perfect citibile de către oameni. - @terdon adevărat, dar scripturile tind să fie executabile: D. Acestea fiind spuse, un script adecvat ar trebui să recunoască și PDF-urile. Dar, pe de altă parte, este un PDF care conține o imagine umană lizibilă ? Este un PNG a unui text lizibil ? Probabil. Cred că un test complet va fi … provocator.
Răspuns
Trebuie doar să utilizați:
find inhere -size 1033c
Vă va oferi singurul fișier care conține parola.
Comentarii
- de ce + 1033c returnează mai multe fișiere? este ca un semn mai mare sau egal?
Răspuns
find . -size 1033c ! -executable -exec file {} +
Răspuns
Executați următoarele opțiuni împotriva conținutului directorului:
$ 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>
Răspuns
Există doar 1 fișier cu 1033
octeți de dimensiune.
bandit5@bandit:~$ find -size 1033c ./inhere/maybehere07/.file2 bandit5@bandit:~$
De ce 1033c
și nu 1033
? Verificați pagina 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)
Verificați-l cu comanda ls -l
și file
și veți obține tot răspunsul.
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:~$
- lizibil de către om (
ASCII text
) - 1033 octeți în dimensiune (De asemenea, în
ls -l
ieșire) - nu este executabil (
-rw-r-----
)
Răspuns
find . -size 1033c ! -executable|xargs file|grep "ASCII text" |awk -F: "{print $1}"
Vă rugăm să încercați aceste comenzi combinate. funcționează pe stația mea.
Răspuns
Puteți încerca acest lucru
find . -size 1033c ! -executable -exec file {} +
Provocarea dvs. nu permite grep
. fișierul de parolă va fi raportat ca „text ASCII, cu linii foarte lungi”
Răspuns
Pentru a filtra nume de fișiere care pot fi citite de om, puteți folosi [:print:]
( tipărit ) clasa de caractere nume. Veți găsi mai multe despre astfel de clase în manualul pentru grep
.
find . -type f -size 1033c -name "[[:print:]]*" ! -executable
La un alt gând , cerința de „citire umană” s-ar putea referi la conținutul fișierului, în loc de numele acestuia. Cu alte cuvinte, ați fi în căutarea fișierelor text . Este puțin mai dificil. Ca @ D_Bye sugerat într-un comentariu, ar trebui să utilizați apoi comanda file
pentru a determina tipul de conținut al fișierului. Dar nu ar fi o idee bună să rulați file
după o conductă, deoarece ar complica sarcina de afișare a numelui fișierului. Iată ce sugerez:
find . -type f -size 1033c ! -executable -exec sh -c "file -b $0 | grep -q text" {} \; -print
Acesta este pe scurt modul în care funcționează partea file
:
-
-exec
executăsh -c "file -b $0 | grep -q text" FILENAME
pentru fiecareFILENAME
care îndeplinește toate condițiile anterioare (tip, dimensiune, neexecutabil). - Pentru fiecare dintre aceste fișiere , un shell (
sh
) rulează acest scurt script :file -b $0 | grep -q text
, înlocuind$0
cu numele fișierului. -
file
determină tipul de conținut al fiecărui fișier și transmite aceste informații. Opțiunea-b
împiedică imprimarea numele fiecărui fișier testat. -
grep
filtre ieșirea provenind de la
, căutând linii care conțin „text” . (Vedeți singur, cum arată o ieșire tipică a comenziifile
.)
grep
nu scoate textul filtrat, deoarece are opțiunea -q
(silențioasă) . Ceea ce face, este doar să-și schimbe starea de ieșire în 0
(care reprezintă „adevărat” – a fost găsit textul filtrat) sau 1 (care înseamnă „eroare” „- textul ” text „ nu a apărut în ieșirea din file
). grep
este trecut mai departe de sh
la find
și acționează ca rezultatul final al întregului Testul „-exec sh -c "file $0 | grep -q text" {} \;
„. -print
comanda este executată (adică se imprimă numele fișierului testat). Răspuns
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:~$
Comentarii
- Pur și simplu folosiți fișier inhere / * și cat / home / bandit4 / inhere / -file07
Răspuns
find -type f ! -executable -size 1033c
vă va primi fișierul din exercițiu
Răspuns
find . -type f -size 1033c ! -executable | xargs file | grep text
Ventilator cu o linie
Răspuns
Cred că modul mai lung de a găsi parola pentru acest nivel de bandit menționat de cei mai mulți utilizând find și grep este cea mai descriptivă comandă.
find . -type f -size 1033c ! -executable -exec file {} + | grep ASCII
Dar, după ce am folosit comanda „fișier” mai mult, mi-am dat seama că este destul de ușor de localizat fișierele care pot fi citite de om (alias ASCII în acest nivel) în acest fel, verificând tipurile de fișiere de directoare întregi.Directorul inhere conține fișiere cu numele „-filexx” sau verifică rapid întregul director inhere cu file ./*
Iată abordarea mea.
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