Pentru a preveni existența bug-urilor și a vulnerabilităților, un dezvoltator va urmări cu atenție codul scris de sine sau de alții (auditare de cod). Pentru a facilita acest proces, există utilitare specifice care să automatizeze analiza codului și să raporteze posibile probleme. Pot fi utilitare de analiză statică (pe cod) sau de analiză dinamică (ce presupun rularea unui proces). Este important integrarea acestor utilitare în procesul de dezvoltare și testare software (Software Development Lifecycle).
Arhiva de suport pentru exerciții se găsește aici. Descărcați arhiva și apoi decomprimați-o folosind comenzile:
wget http://koala.cs.pub.ro/training/res/secure-low-level-programming/arc/09-utilitare-de-analiza-cod-skel.zip unzip 09-utilitare-de-analiza-cod-skel.zip cd 09-utilitare-de-analiza-cod-skel/
Pentru a instala aplicațiile necesare pentru investigarea programelor folosiți comanda
sudo apt install clang cppcheck splint valgrind
Accesăm directorul hidden-bugs/
din arhiva de suport.
Fișierul cod sursă hidden-bugs.c
conține 8 erori de programare. Identificați-le parcurgând manual codul (code audit). Lucrați în echipe de 2-3 persoane.
După aceasta folosiți utilitarele cppcheck
, splint
și scan-build
pentru a verifica static prezența erorilor.
Moduri uzuale de rulare:
cppcheck --enable=all hidden-bugs.c splint hidden-bugs.c scan-build make
cppcheck
.
Foarte probabil veți vedea că utilitarele nu depistează multe erori. Multe erori nu pot fi depistate cu utilitare de analiză, ci mai degrabă de un observator uman.
Folosiți utilitarele cppcheck
, scan-build
și splint
pentru a verifica fișierele ce conțin buffer overflow-uri din sesiunea 06
.
Accesăm directorul picpic/
din arhiva de suport.
Verificați codul sursă din cadrul directorului folosind utilitarele cppcheck
, splint
și scan-build
.
Accesăm directorul valgrind/
din arhiva de suport.
Urmăriți codul din fișierul cod sursă vuln.c
și rulați executabilul vuln
. Executabilul primește ca argument un număr care se asociează cu o anumită funcție din program ce va fi executată. Rulați programul sub Valgrind în forma:
valgrind ./vuln 1
Vedeți rezultatul afișat de Valgrind și validați depistarea erorilor de folosire a memoriei.
Clonați repository-ul de aici folosind comanda
git clone https://github.com/ThalesIgnite/afl-training
Apoi urmăriți indicațiile de aici pentru a face fuzzing pe executabilul vulnerable
.
Urmăriți indicațiile de aici pentru instalarea Angr.
mkvirtualenv
. Folosiți următoarele două comenzi pentru a crea un mediu virtual în care să instalați și rulați angr
:
virtualenv angr cd angr source ./bin/activate
Acum puteți install angr
folosind comanda pip
așa cum e indicat în documentație.
Dacă doriți să părăsiți mediul virtualenv folosiți comanda
deactivate
Clonați repository-ul de exemple Angr de aici folosind coamnda
git clone https://github.com/angr/angr-doc
În urma comenzii de mai sus se creează directorul angr-doc/
.
Testați exemplul din angr-doc/examples/strcpy_find
din exemplu descris și aici prin rularea comenzii:
python solve.py
Scriptul Python va “exploata” executabilul strcpy_find
folosind execuție simbolică și va obține parola cerută. Parcurgeți scriptul solve.py
pentru o primă perspectivă asupra Angr. Nu e nevoie să înțelegeți, doar să știți că există.