Î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:~$ 
  1. lizibil de către om (ASCII text)
  2. 1033 octeți în dimensiune (De asemenea, în ls -l ieșire)
  3. 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 fiecare FILENAME 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.)

  • Dar 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).
  • Starea de ieșire adevărat / fals provenind de la 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" {} \;„.
  • În cazul în care testul de mai sus a returnat true , -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 

    Lasă un răspuns

    Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *