Differences

This shows you the differences between two versions of the page.

Link to this comparison view

so:cursuri:curs-12 [2013/05/20 15:05]
razvan.deaconescu [Demo-uri]
so:cursuri:curs-12 [2019/05/11 15:36] (current)
razvan.deaconescu
Line 1: Line 1:
-====== Curs 12 - Securitatea ​sistemelor de operare ​======+====== Curs 12 - Implementarea ​sistemelor de fișiere ​======
  
-<​html>​ +  * [[http://​prezi.com/​i7gfiypqqpje/?utm_campaign=share&utm_medium=copy&rc=ex0share|Curs 12 - Implementarea sistemelor de fișiere (Vizualizare Prezi)]] 
-<iframe src="http://​prezi.com/​embed/​0oxmg6hvis3u/?bgcolor=ffffff&amp;​lock_to_path=0&amp;​autoplay=0&​amp;​autohide_ctrls=0&​amp;​features=undefined&​amp;​disabled_features=undefined"​ width="​550"​ height="​400"​ frameBorder="​0"></​iframe>​ +  * [[http://​elf.cs.pub.ro/​so/​res/​cursuri/​SO_Curs-12.pdf|Curs 12 - Implementarea sistemelor de fișiere (PDF)]]
-</html>+
  
-  * [[http://prezi.com/0oxmg6hvis3u/so-curs-12/?kw=view-0oxmg6hvis3u&​rc=ref-31844697 ​Curs 12 - Securitatea sistemelor ​de operare (Vizualizare Prezi)]] +  * [[https://docs.google.com/document/d/1yQIKPYfAiUehhdSf1D10f3lIH3hnd5xXVyL2ftBH3iQ/​edit?usp=sharing|Notițe ​de curs]]
-  * [[http://​elf.cs.pub.ro/​so/​res/​cursuri/​SO_Curs-12.pdf | Curs 12 - Securitatea sistemelor de operare (PDF)]]+
  
   * Suport curs   * Suport curs
-    * Operating System Concepts +    * Operating System Concepts ​Essentials 
-      * Capitolul ​14 -- Protection +      * Capitolul ​10: File-System Implementation 
-      * Capitolul 15 -- Security +        * Secțiunile ​10.1 -- 10.8
-        * Secțiunile ​15.1, 15.2, 15.5+
     * Modern Operating Systems     * Modern Operating Systems
-      * Capitolul ​9 -- Security +      * Capitolul ​6: File Systems 
-        * Secțiunile ​9.49.6+        * Secțiunile ​6.3, 6.4 
 + 
 +<​html>​ 
 +  <​center>​ 
 +    <iframe src="​https://​prezi.com/​embed/​i7gfiypqqpje/?​bgcolor=ffffff&​amp;​lock_to_path=0&​amp;​autoplay=0&​amp;​autohide_ctrls=0&​amp;​features=undefined&​amp;​disabled_features=undefined"​ width="​550"​ height="​400"​ frameBorder="​0"></​iframe>​ 
 +  </​center>​ 
 +</​html>​
  
 ===== Demo-uri ===== ===== Demo-uri =====
  
-Pentru parcurgerea demo-urilor,​ folosiți [[http://​elf.cs.pub.ro/​so/​res/​cursuri/​curs-12.zip|arhiva aferentă]].+Pentru parcurgerea demo-urilor,​ folosiți [[http://​elf.cs.pub.ro/​so/​res/​cursuri/​curs-12-demo.zip|arhiva aferentă]].
  
-  - Bitul de set-user-ID-on-execution +  - Folosiți comanda ''​stat''​ pentru a afișa informații despre ​inode-ul corespunzător unui fișier, director, link simbolic, char device, block device:<code bash> 
-    * Intrați în directorul ''​1-setuid/''​. +stat /etc/​passwd 
-    * Consultați fișierul ''​setuid-test.c''​. +stat /usr/lib/ 
-    * Compilați fișierul folosind ​comanda ''​make''​+stat /​usr/​bin/​cc 
-      * Trebuie să aveți drept de sudo pentru a reuși întreg procesul. +stat /dev/null 
-    * Folosiți ''​ls -l''​ pentru ​obține ​informații ​complete ​despre ​executabilul ''​setuid-test''​. +stat /dev/loop0
-      * Observați că executabiul este deținut de ''​root'' ​și că are bitul de set-user-ID activat. +
-    * Ca utilizator neprevilegiat rulați executabilul:<code bash> +
-./setuid-test+
 </​code>​ </​code>​
-    * Observați cele trei tipuri de identificatori de utilizatori: //user id//, //effective user ID//, //saved set-user-ID//. +    * Afișați informații despre un socket Unix, după ce îl căutați în ierarhia ''/​var/​run/''​:<code bash> 
-      * Detalii în [[http://man7.org/linux/man-pages/man7/credentials.7.html|pagina ​de manual credentials]]+sudo find /var/run -type s 
-    * Observați că se poate reveni ​la utilizator privilegiat,​ dacă cel puțin unul dintre identificatorii ​de utilizatori ​este (''​root''​(//temporary privilege drop//). +sudo stat /​var/​run/​udev/​control 
-      În momentul în care nici unul dintre identificatorii ​de utilizatori ​nu mai este 0, nu se poate reveni ​la utilizator privilegiat (//permanent privilege drop//). +</​code>​ 
-  - Exemplu de [[http://www.shell-storm.org/shellcode/|shellcode]] +    * Aflați dimensiunea fișierului ''/​sbin/​init''​ folosind ''​stat'':<​code bash> 
-    * Intrați în directorul ​''​2-shellcode/''​. +stat -c %s /​sbin/​init 
-    * Consultați fișierul ''​shellcode-samples.c''​. +</​code>​ 
-      * Urmăriți cele trei variabile ​de tip shellcode+    * Urmăriți modificările timpilor de acces pe fișier (//access time//, //modify time//,  //change time//) folosind comenzile de mai jos:<​code bash> 
-    * Acele variabile se găsesc în forma binară și în fișierul ​''​binary-shellcodes''​. +cd /tmp 
-      Folosiți ''​objdump'' ​pentru a dezasambla ​fișierul:<​code bash> +touch a.txt 
-objdump -D -b binary -mi386 binary-shellcodes+stat a.txt 
 +cat a.txt 
 +stat a.txt 
 +chmod a+rw a.txt 
 +stat a.txt 
 +echo "​abc"​ > stat.txt 
 +stat a.txt 
 +</​code>​ 
 +      * //access time// este timpul de acces al fișierului,​ deschis pentru citire. 
 +      * //modify time// este timpul de modificare a datelor fișierului. 
 +      * //change time// este timpul de modificare a metadatelor fișierului (informații din inode). 
 +  - Creați un fișier simplu și urmăriți numărul ​de link-uri ale acestuia:<​code bash> 
 +cd /tmp 
 +touch first.txt 
 +ls -i first.txt 
 +ls -l first.txt 
 +</​code>​ 
 +    * A doua coloana de la rularea ''​ls -l''​ este numărul de link-uri, inițial 1. 
 +    * Creați un fișier ca hard link la primul:<​code bash> 
 +ln first.txt second.txt 
 +</​code>​ 
 +    * Observați că inode-ul este același iar numărul de link-uri este egal cu doi:<​code bash> 
 +ls -i first.txt second.txt 
 +ls -l first.txt second.txt 
 +</​code>​ 
 +    * Creați un al treilea link și observați numărul de link-uri egal cu 3:<code bash> 
 +ln second.txt third.txt 
 +ls -i first.txt second.txt third.txt 
 +ls -l first.txt second.txt third.txt 
 +</​code>​ 
 +    * Ștergeți primele două link-uri/​nume și obsevați păstrarea inode-ului și reducerea numărului de link-uri ​la 1 pentru ultimul nume:<​code bash> 
 +unlink first.txt 
 +rm second.txt 
 +ls -i third.txt 
 +ls -l third.txt 
 +</​code>​ 
 +      * ''​unlink''​ și ''​rm''​ pot fi folosite interschimbabil. 
 +  - Urmăriți numărul ​de link-uri/​nume aferente unui director gol. Numărul ​este 2: un link este numele efectiv al directorului,​ iar altul este referința '​.' ​(punct, //dot//) către director însuși:<​code bash> 
 +cd /tmp 
 +mkdir /​tmp/​test-d 
 +ls -ld /​tmp/​test-d 
 +</​code>​ 
 +    * Creați un subdirector al directorului ​''​/​tmp/​test-d/​''​. Numărul de link-uri va crește la 3, cu ajutorul referinței '​..' ​(punct punct, ​//dot dot//) de la subdirector:<​code bash> 
 +mkdir /​tmp/​test-d/​test-subd 
 +ls -ld /​tmp/​test-d 
 +</​code>​ 
 +    ​Creați un subfișier al directorul ''/​tmp/​test-d/''​. Numărul ​de link-uri ​nu se va modificaîntrucât fișierul ​nu are o referință ​la directorul părinte:<​code bash> 
 +touch /tmp/test-d/test-f 
 +ls -ld /tmp/​test-d 
 +</​code>​ 
 +  - Creați un director simplu și vedeți ce spațiu ocupă pe disc, folosind comanda ''​stat''​:<code bash> 
 +cd /tmp 
 +mkdir /tmp/fill-
 +stat -c %s /tmp/fill-d 
 +</​code>​ 
 +    * Copiați scriptul ​''​create-long-filenames'' ​din arhivă și rulați-l în directorul proaspăt creat:<​code bash> 
 +cd /​tmp/​fill-d 
 +# TODO: copy script 
 +./​create-long-filenames 
 +</​code>​ 
 +    * Observați conținutul directorului ​și noua dimensiune a acestuia:<​code bash> 
 +ls -l /​tmp/​fill-d 
 +stat -c %s /​tmp/​fill-d 
 +</​code>​ 
 +      * Dimensiunea directorului a crescut datorită numărului de intrări în director. 
 +      * Dimensiunea directorului este multiplu ​de dimensiunea blocului sistemului. 
 +  - Citirea intrărilor dintr-un director; simularea comenzii ''​ls''​ 
 +    * Intrați în directorul ​''​5-dirent/''​. 
 +    Consultați fișierul ​''​dirent.c''​
 +    * Compilați ​fișierul ​folosind comanda ''​make''​. 
 +    * Rulați executabilul obținut dându-i ca argument un director:<code bash> 
 +./dirent tmp 
 +./dirent /usr 
 +./dirent /var/run 
 +./dirent /usr/lib
 </​code>​ </​code>​
-      * Se afișează instrucțiunile dezasamblate;​ au fost plasate niște instrucțiuni de tip ''​nop'' ​între cele trei shellcode-uri. +      * Observați ​afișarea intrărilor și a tipului acestora. 
-      * Observați ​apelul ''​int $0x80'', ​reprezentând trap pentru ​acces în kernel space (//apel de sistem//).+      * Structura ​''​struct dirent'' ​reține informațiile legate de o intrare dintr-un director. 
 +    * Un director este, pe disc, un inode ale cărui bloc-uri conține un vector de intrări asemănătoare cu ''​struct dirent''​
 +      * Intrările sunt citite de pe disc folosind ​apelul ''​readdir'', ​similar folosirii apelului ''​read'' ​pentru ​fișiere. 
 +      * La fel ca fișierele obișnuite ​(//regular files//) și directoarele folosesc intern un cursor de fișier care este actualizat după fiecare apel ''​readdir''​.
so/cursuri/curs-12.1369051513.txt.gz · Last modified: 2013/05/20 15:05 by razvan.deaconescu
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0