====== 2. Spații de adrese ====== Ne interesează modul în care este structurat spațiul de adrese al unui proces pentru a înțelege vulnerabilitățile legate de memoria sa. Vom vorbi despre zonele din spațiul de adrese al unui proces, rolul fiecăreia și perspective de cum pot fi atacate. ===== Subiecte abordate ===== * procese * spațiul (virtual) de adrese al unui proces * zone din spațiul virtual de adrese * alocarea și accesarea memoriei ===== Resurse ===== * [[http://koala.cs.pub.ro/training/res/secure-low-level-programming/slides/02-spatii-de-adrese.pdf|Slide-uri]] * [[http://koala.cs.pub.ro/training/res/secure-low-level-programming/arc/02-spatii-de-adrese-skel.zip|Arhiva de suport]] ===== Exerciții ===== Arhiva de suport pentru exerciții se găsește [[http://koala.cs.pub.ro/training/res/secure-low-level-programming/arc/02-spatii-de-adrese-skel.zip|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/02-spatii-de-adrese-skel.zip unzip 02-spatii-de-adrese-skel.zip ==== Spațiul de adrese ==== Accesăm directorul ''address-space/'' din arhiva de suport. Urmăriți conținutul fișierului ''prog.c'' și rulați executabilul ''prog''. Într-o altă consolă rulați comanda pmap -p $(pidof prog) Comanda afișează spațiul virtual de adrese al procesului. Dacă doriți să urmăriți continuu (automat) spațiul virtual de adrese al procesului, rulați comanda watch -d -n 1 pmap -p $(pidof prog) Treceți prin fiecare pas în program și rulați comanda de mai sus la fiecare pas pentru a vedea cum se modifică (sau nu) zonele din spațiul virtual de adrese al procesului. Faceți o modificare ca să alocați (într-o buclă, cel mai simplu) de 10 ori memorie de fiecare fel. ==== Acces read-write ==== Accesăm directorul ''read-write-areas/'' din arhiva de suport. Urmăriți conținutul fișierului ''prog.c'' și rulați executabilul ''prog''. Generați accesarea de fiecare tip (//read// sau //write//) a fiecărei zone de mari de memorie a unui proces. De ce la unele primiți //segmentation fault//? ==== Acces peste limite ==== Accesăm directorul ''over-the-edge/'' din arhiva de suport. Urmăriți conținutul fișierului ''vuln.c'' și rulați executabilul ''vuln''. Observați cum accesarea dincolo de limitele buffer-ului nu generează //segmentation fault//. Modificați programul pentru a vedea la ce index din cadrul fiecărei zone (''data'', ''stack'', ''heap'') obțineți //segmentation fault//.