Giovanni Bassetti Immagine
 Blog personale di Nanni Bassetti... di Admin
 
"
Un computer sicuro è un computer spento e gettato in fondo al mare, con l'hard disk sbriciolato

N.B.
"
 

\\ Home Page : Articolo
Grep e Strings due giganti di Linux
Di Admin (del 18/10/2008 @ 17:46:56, in Computer Forensics, linkato 4262 volte)

Il tempo libero serve anche a sperimentare e quando si ha la passione per la computer forensics, son dolori....

Tramite Nigilant32 (presente nella parte Live di Helix 2) faccio l'immaginedella Ram del mio PC, mentre è in uso, e la salvo sul file RAM.IMG.

ram.img - dump della mia ram 1.3Gb

Tramite editor esadecimale, vedo che tra le tante stringhe, contenute nel file, ne prendo una a casaccio per fare il mio test, la stringa è "awatarami".
Cerco con strings e il parametro -t d (che mi genera anche l'offset in decimale) ottenendo:

strings -t d ram.img | less
33593  Skype z awatarami

Quindi segno l'offset come: 33593

Poi cerco con grep ed i parametri
-i ignora il maiuscolo/minuscolo;
-a tratta il file binario come se fosse testuale;
-b stampa il byte offset;
-o Mostra solo la parte di linea che coincide con la stringa cercata;

grep -iabo awatarami ram.img
4923:awatarami

Segno l'offset: 4923
Ho cercato la parola "awatarami" ed ho ottenuto due offset diversi....ma qual'è quello giusto?
Passo all'uso di xxd (editor esadecimale da riga di comando) e con -s lo faccio partire dall'offset trovato:

 xxd -s 4923 ram.img | less
00133b: 0366 2e0f 011e 1203 662e a10c 0090 9090  .f......f.......
00134b: 9090 9090 9090 9090 900f 22d8 662e a1ec  ..........".f...
00135b: 0266 0bc0 7403 0f22 e066 2ef7  0604 0002   .f..t..".f......
00136b: 0000 0074 1666 b980 0000 c00f 3266 0d00  ...t.f......2f..
00137b:  0800 0066  b980 0000 c00f 3066 2e8b 2e10  ...f......0f....
00138b: 0066 2e8b 0eac 0066 2e8b 1ee8 0266 2ea1  .f.....f.....f..
00139b: e002 662e 8b3e 0800 0f22 c066 ea20 456e  ..f..>...".f. En
0013ab: 8008 0000 0000 0000 0000 0000 0000 0000  ................
0013bb: 0000 0000 0000 0000 0000 0000 0000 0000  ................
0013cb: 0000 0000 0000 0000 0000 0000 0000 0000  ................
0013db: 0000 0000 0000 0000 0000 0000 0000 0000  ................
0013eb: 0000 0000 0000 0000 0000 0000 0000 0000  ................
0013fb: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00140b: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00141b: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00142b: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00143b: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00144b: 0000 0000 0000 0000 0000 0000 0000 0000  ................

Non c'è traccia della parola "awatarami"....
Provo con l'offset ottenuto da strings:

xxd -s 33593 ram.img | less
08339: 2053 6b79 7065 207a 2061 7761 7461 7261   Skype z awatara
08349: 6d69 204b 6c6f 6e69 6573 2e3c 6272 2f3e  mi Klonies.

08359: 3c61 2068 7265 663d 2273 6b79 7065 3a3f 
08389: 5374 77c3 b372 7a20 4b6c 6f6e 6965 3c2f  Stw..rz Klonie08399: 613e 0050 6f6b 61c5 bc20 c59b 7769 6174  a>.Poka.. ..wiat
083a9: 7520 7377 c3b3 6a20 5765 654d 6565 2e3c  u sw..j WeeMee.<

quindi strings mi fornisce l'indirizzo corretto, mentre grep no! 
Errata corrige: (col grep aggiornato funziona invece)
Ne parlo con Mario Pascucci e lui mi suggerisce questa soluzione al dilemma, ossia che grep ha tutto un altro modo di ragionare con i caratteri e potrebbe interpretare erroneamente i caratteri di controllo
e soprattutto fare confusione con i caratteri multibyte, ossia interpretare sequenze di caratteri come multibyte, quando invece sono tutt'altro, e contarli come uno solo.

Un mistero è risolto!
Ma su questi due strumenti NON ho finito di lavorarci, quindi, armato di cronometro ho fatto questo esperimento:

grep -iaob mustafa /cygdrive/c/immaginidd/barbuto.dd
tempo: 52 secondi e 50 centesimi - offset corretto 113917010

$ strings -t d /cygdrive/c/immaginidd/barbuto.dd | grep -i mustafa
113917010 tuo fratello Mustafa
tempo: 29 secondi e 84 centesimi - offset corretto 113917010

Insomma strings in pipe con grep è molto più veloce (il 51% in più).

Sempre consultandomi con Mario, mi suggerisce una spiegazione, che avevo intuito anch'io e che fa capire la potenza dell'operatore "pipe" (|) e di Linux.
Le ragioni della lentezza sono molteplici, ma una su tutte:
strings ha un algoritmo infinitamente più semplice e veloce di grep, e la quantità di dati che estrae è esigua, per cui il secondo grep, il cui input è generato da strings, ha molto meno input da esaminare.

Per avere conferma di ciò, basta mandare l'output di strings su un file, e vedere che è immensamente più piccolo del file intero su cui strings ha lavorato.
inoltre ci sono altre ragioni, fra cui il fatto che grep è costruito per cercare in file di testo, suddiviso in righe, e con un set di caratteri ben definito, e passsandogli un binario, come appunto un'immagine dd, non è che lo aiuti molto.
Strings invece produce un output molto vicino a quello su cui grep offre le prestazioni migliori.

In sostanza, strings estrae le stringhe da un file binario e passa il suo output in pipe a grep, che opererà la ricerca della parola "mustafa", su un output testuale e ridotto, sfruttando al massimo la sua potenza.

La stessa sperimentazione la si può fare usando queste immagini.

Nanni Bassetti

Articolo Articolo  Storico Storico Stampa Stampa
Ci sono 27 persone collegate

< giugno 2025 >
L
M
M
G
V
S
D
      
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
           

Cerca per parola chiave
 

Titolo
Annunci (68)
CHI SONO (4)
Computer Forensics (108)
SICUREZZA INFORMATICA (7)
TuttoStorto (16)

Catalogati per mese:
Marzo 2018
Aprile 2018
Maggio 2018
Giugno 2018
Luglio 2018
Agosto 2018
Settembre 2018
Ottobre 2018
Novembre 2018
Dicembre 2018
Gennaio 2019
Febbraio 2019
Marzo 2019
Aprile 2019
Maggio 2019
Giugno 2019
Luglio 2019
Agosto 2019
Settembre 2019
Ottobre 2019
Novembre 2019
Dicembre 2019
Gennaio 2020
Febbraio 2020
Marzo 2020
Aprile 2020
Maggio 2020
Giugno 2020
Luglio 2020
Agosto 2020
Settembre 2020
Ottobre 2020
Novembre 2020
Dicembre 2020
Gennaio 2021
Febbraio 2021
Marzo 2021
Aprile 2021
Maggio 2021
Giugno 2021
Luglio 2021
Agosto 2021
Settembre 2021
Ottobre 2021
Novembre 2021
Dicembre 2021
Gennaio 2022
Febbraio 2022
Marzo 2022
Aprile 2022
Maggio 2022
Giugno 2022
Luglio 2022
Agosto 2022
Settembre 2022
Ottobre 2022
Novembre 2022
Dicembre 2022
Gennaio 2023
Febbraio 2023
Marzo 2023
Aprile 2023
Maggio 2023
Giugno 2023
Luglio 2023
Agosto 2023
Settembre 2023
Ottobre 2023
Novembre 2023
Dicembre 2023
Gennaio 2024
Febbraio 2024
Marzo 2024
Aprile 2024
Maggio 2024
Giugno 2024
Luglio 2024
Agosto 2024
Settembre 2024
Ottobre 2024
Novembre 2024
Dicembre 2024
Gennaio 2025
Febbraio 2025
Marzo 2025
Aprile 2025
Maggio 2025
Giugno 2025

Gli interventi più cliccati






21/06/2025 @ 09:24:27
script eseguito in 29 ms