← Tutti i video

Tools hacking in C(VE): strings

Guarda su YouTube → 1:38:15 5 novembre 2021
ProgrammazioneC

Descrizione

In questo video faccio vedere come implementare una versione semplificata del binario strings, presente nei sistemi operativi unix-based. ------------------------- TIMESTAMP 00:00:00 C è difficile e pericoloso 00:01:46 a cosa serve strings? # ----- INIZIO CODICE ----- 00:06:00 inizio 00:08:30 standard streams: stdin, stdout e stderr 00:13:55 prendere path al file dagli argomenti 00:15:00 controllo proprietà file 00:20:00 aprire e leggere file # ----- BREAK n. 1: TEORIA/DESIGN ----- 00:22:15 che cos'è una stringa? 00:28:50 direttive pre-processore (PRINTABLE(c), DEBUG_PRINT) 00:35:00 approccio utilizzato per estrarre le stringhe # ----- CONTINUO CODICE ----- 00:39:15 variabili globali 00:44:00 inizio funzione principale (print_strings()) 00:45:11 memset() e fread() 00:54:00 gestione lettura finale tramite ferror() e feof() 00:56:40 iterazione finestra corrente 01:03:04 scrittura print_sequence() 01:04:45 scrittura get_file_length() # ----- BREAK n. 2: REVISIONE/TEST ----- 01:07:00 revisione parziale 01:11:26 testing parziale # ----- CONTINUO CODICE ----- 01:14:40 gestione sequenze interrotte # ----- BREAK n. 3: REVISIONE/TEST ----- 01:25:00 testing finale 01:32:00 revisione finale ------------------------- RIFERIMENTI - https://github.com/LeonardoE95/yt-it/blob/main/src/2021-11-05-programmazione-C-strings - https://github.com/redox-os/binutils-gdb/blob/master/binutils/strings.c ------------------------- CONTATTI - Technical blog: https://blog.leonardotamiano.xyz/ - Github: https://github.com/LeonardoE95?tab=repositories - Support my work: https://www.paypal.com/donate/?hosted_button_id=T49GUPRXALYTQ

Commenti 15

I commenti vengono da YouTube e sono aggiornati periodicamente.

  1. @massimovaccari1817 21 aprile 2022 1
    Complimenti! Sei un mostro!!!
  2. @mirkodistefano4964 17 ottobre 2022 1
    Cavoli che super video
  3. @angelonunziolombardi 17 luglio 2022 1
    trascritto anche quest'altro video :)
    1 risposta
    1. @esadecimale Autore 17 luglio 2022 1
      Sei un grande bro!
  4. @LucaCanali 5 novembre 2021 1
    Ottimo, esaustivo e completo come al solito, e' sempre un piacere seguire i tuoi video, proprio questa mattina rispondevo ad un sondaggio su che linguaggio sarebbe utile imparare nel 2021, quei sondaggini che lasciano il tempo che trovano, e io gli ho risposto c/c++ perche' e' vero che si possono avere piu' problemi ma sapendo questo portano, o almeno dovrebbero, portare il programmatore a fare una scelta piu' oculata nell'uso di variabili ecc e nello scrivere codice sicuro e pulito. Ancora grazie per le tue condivisioni.
    2 risposte
    1. @esadecimale Autore 5 novembre 2021 1
      Per non parlare poi del fatto che molte tecnologie moderne sono ancora scritte in C/C++, quindi è utile provare a scrivere qualcosa in questi linguaggi anche solo per essere più bravi a leggere il codice scritto da altri. Detto questo, ci sono tanti altri linguaggi di programmazione che meritano tanto, e col passare del tempo coprirò anche quelli più particolari, di cui elisp è già un caso particolare che sto già coprendo. Purtroppo le persone si attaccano troppo ai singoli linguaggi di programmazione, e li difendono (o li attaccano), come se fossero persone in carne ed ossa, dimenticandosi nel frattempo che un linguaggio è solo uno strumento, e che la sua utilità è riducibile all’utilità degli artefatti prodotti tramite l’utilizzo di suddetto strumento. La domanda “che linguaggio di programmazione dovrei imparare”, è quindi facilmente classificabile come mal posta. La vera domanda è un’altra. Anzi, sono tante altre, tra cui: Che cosa vuoi creare/costruire? In che contesto tecnologico ti vuoi muovere? Che tipo di performance necessiti? Ok la smetto, che queste discussioni sono troppo interessanti e necessitano un altro mezzo tecnologico.
    2. @LucaCanali 5 novembre 2021
      @esadecimale già ... aspettiamo discord 🤪 ... la penso esattamente come te, l'importante è avere le capacità di risolvere i problemi ed il mezzo ti da la possibilità di raggiungere lo scopo più o meno facilmente !!! Ma nonostante questo provo una repulsione enorme per java 🥶🤪
  5. @esadecimale Autore 5 novembre 2021
    Osservazione #1: il programma riesce a catturare stringhe di al massimo WINDOW_SIZE * 2 - 1 bytes. Osservazione #2: Inoltre, ho appena notato che c’è un bug nel programma tramite il quale è possibile assegnare alla variabile “byte_read” un valore negativo. Per adesso non ho notato vulnerabilità nè exploit derivanti da questo bug. L'idea del bug nel codice mostrato nel video è la seguente: nella funzione get_file_length(ptr) calcolo la lunghezza del file utilizzando la chiamata a ftell(). Questa funzione però potrebbe anche ritornare 0 o -1, a seconda del particolare file. Se ad esempio chiamiamo tale funzione sul file /proc/self/fd/0 otteniamo -1. Ora, dato che non c'è nessun controllo sul size calcolato, ovvero non controlliamo che sia > 0, è possibile ritornare 0 o -1 dalla funzione get_file_length(ptr). Dopo l'ultima fread, dentro l'if della condizione feof() (ovvero quando incotriamo l'ultimo carattere del file, noto come EOF), calcoliamo i byte rimanenti da leggere facendo la sottrazione di file_length con offset. Se però file_length è stato calcolato male, questo potrebbe portare ad inserire in byte_read un valore negativo. Ora, di per sé inserire in byte_read un valore negativo non porta a problemi di sicurezza, in quanto non entriamo mai nell'if successivo che scandice l'ultima finestra di bytes (in quanto 0 è sempre maggiore di ogni numero negativo, e quindi la condizione per entrare nel loop 0 < byte_read fallisce). A questo punto ci si potrebbe chiedere: possiamo forse modificare il valore di offset in modo tale da rendere offset negativo, e quindi byte_read positivo (dato che byte_read è ottenuto sottrando offset, se offset è negativo allora meno per meno fa più e quindi byte_read sarebbe positivo). Se infatti riuscissimo a rendere byte_read positivo allora potremmo creare dei problemi di accessi alla memoria nell'istruzione che accede all'i-esimo elemento del buffer (char c = buffer[i]). Per poter ottenere questo però, dato che offset è un long, e viene incrementata di uno per ogni byte letto, dovremmo leggere una quantità veramente ma veramente grande di bytes per avere un overflow della variabile offset in modo tale da renderla negativa. Se offset fosse stato un semplice intero un attacco del genere sarebbe stato più possibile, ma per adesso non penso possa essere sfruttato per far crashare il programma. In ultima analisi: il codice mostrato nel video ha un bug di logica quando si cerca di leggere particolari file, come il file /proc/self/maps, ma il bug, per quanto porti ad un mal-funzionamento del programma, non porta a particolari problematiche di sicurezza, almeno non secondo l'analisi appena fatta. Ovviamente se qualcuno vuole aggiungere qualcosa, sono assolutamente disponibile ad ascoltare eventuali altre problematiche. Questo per dire: non tutti i bug portano necessariamente a delle vulnerabilità. Un bug potrebbe potenzialmente portare ad una vulnerabilità del software. Le vulnerabilità, a loro volta, potrebbero portare alla creazione di exploit, che sono gli attacchi veri e propri. Il codice può essere fixato in vari modi, tra cui (ne menziono pochi rispetto a tutti i possibili approcci) 1. Cambiare il modo in cui calcoliamo la lunghezza del file. 2. Controllare che byte_read sia sempre nel range appropriato, che è tra >= 0 e < WINDOW_SIZE Il codice presente sul mio sito è stato cambiato implementando questi aggiuntivi controlli di sicurezza, in modo da eliminare il bug. Spero sia stata una analisi abbastanza chiara, e per chi ha capito poco o niente di queste cose, nei video futuri tratterò la teoria dietro a quanto descritto, in modo da averne una visione migliore del tutto. L.T.
  6. @silvestro771 29 ottobre 2025
    ottimo materiale! (Auale editor stai usando?)
    1 risposta
    1. @esadecimale Autore 29 ottobre 2025
      Emacs
  7. @000Renegade000 5 novembre 2021 1
    Ciao ottimi video, una informazione che OS usi ?
    1 risposta
    1. @esadecimale Autore 5 novembre 2021 1
      Grazie mille! Utilizzo arch linux con i3 come windows tiling manager.
  8. @piersilviolucchese4572 7 novembre 2021
    Ciao avrei una proposta da farti, dove posso contattarti??
    2 risposte
    1. @esadecimale Autore 7 novembre 2021
      Hey ciao ho visto che youtube ha cancellato vari commenti che avevi scritto e non ho potuto leggerli, comunque puoi contattarmi per email, la trovi nelle descrizioni dei video :D
    2. @piersilviolucchese4572 8 novembre 2021
      @esadecimale Ti ho invitato una mail, spero tu possa accettare la mia proposta.