User Tools

Site Tools


secure-low-level-programming:capitole:05-siruri

Differences

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

Link to this comparison view

Next revision
Previous revision
secure-low-level-programming:capitole:05-siruri [2018/12/16 13:29]
127.0.0.1 external edit
secure-low-level-programming:capitole:05-siruri [2018/12/19 11:07] (current)
razvan [Suprascriere (overflow)]
Line 1: Line 1:
 ====== 5. Lucrul cu șiruri ====== ====== 5. Lucrul cu șiruri ======
  
-TODO: Descriere scurtă+Una dintre cele mai importante structuri în limbajele de programare (și printre cele mai cauzatoare de dureri de cap) o reprezintă șirurile. Discutăm despre reprezentarea șirurilor, despre particularități ale lucrurilor cu șiruri, probleme frecvente și moduri de exploatare.
  
 ===== Subiecte abordate ===== ===== Subiecte abordate =====
  
-  * TODO +  * buffere și șiruri 
-  * TODO+  * șiruri în C 
 +  * șiruri în C++ 
 +  * probleme cu șiruri
  
 ===== Resurse ===== ===== Resurse =====
Line 13: Line 15:
   * [[http://​koala.cs.pub.ro/​training/​res/​secure-low-level-programming/​arc/​05-siruri-skel.zip|Arhiva de suport]]   * [[http://​koala.cs.pub.ro/​training/​res/​secure-low-level-programming/​arc/​05-siruri-skel.zip|Arhiva de suport]]
  
-===== Alte resurse ===== 
  
-  * TODO link 
-  * TODO link 
-  * TODO link 
  
 ===== Exerciții ===== ===== Exerciții =====
Line 24: Line 22:
 wget http://​koala.cs.pub.ro/​training/​res/​secure-low-level-programming/​arc/​05-siruri-skel.zip wget http://​koala.cs.pub.ro/​training/​res/​secure-low-level-programming/​arc/​05-siruri-skel.zip
 unzip 05-siruri-skel.zip unzip 05-siruri-skel.zip
 +cd 05-siruri-skel
 </​code>​ </​code>​
  
-==== Exercițiu 1 ====+==== Dimensiunea unui șir ====
  
-Accesăm directorul ''​lalala/''​ din arhiva de suport.+Accesăm directorul ''​charsize/''​ din arhiva de suport.
  
-TODO+Urmăriți conținutul fișierului ''​prog.c''​ și rulați executabilele ''​prog''​ și ''​prog32''​. Urmăriți dimensiunea tipurilor de date corespunzătoare unui caracter.
  
-==== Exercițiu 2 ====+==== End of File (EOF) ====
  
-Accesăm directorul ''​lalala/''​ din arhiva de suport.+Accesăm directorul ''​eof/''​ din arhiva de suport.
  
-TODO+Urmăriți conținutul fișierului ''​vuln.c''​ și rulați executabilul ''​vuln''​. Programul nu funcționează corespunzător,​ se oprește la citirea primelor 3 caractere din fișierul ''​data''​. Rezolvați problema.
  
-==== Exercițiu 3 ====+<note tip> 
 +Ca să vedeți conținutul efectiv (binar) al fișierului ''​data''​ rulați comanda 
 +<​code>​ 
 +xxd data 
 +00000000: 616e 61ff 6172 65ff 6d65 7265 0a         ​ana.are.mere. 
 +</​code>​ 
 +</​note>​
  
-Accesăm directorul ''​lalala/''​ din arhiva ​de suport.+==== Leak de informație ====
  
-TODO+Accesăm directorul ''​leak/''​ din arhiva de suport.
  
 +Urmăriți conținutul fișierului ''​vuln.c''​ și rulați executabilul ''​vuln''​. Ambele funcții din fișierul sursă (''​do_nasty1()''​ ''​do_nasty2()''​) generează leak de informație. De ce se întâmplă asta? Ce informație este leaked în fiecare caz?
 +
 +<note tip>
 +Pentru a observa un leak binar (neprintabil) folosiți o comandă de forma
 +<​code>​
 +./vuln | xxd
 +</​code>​
 +</​note>​
 +
 +==== Suprascriere (overflow) ====
 +
 +Accesăm directorul ''​overflow/''​ din arhiva de suport.
 +
 +Urmăriți conținutul fișierului ''​vuln.c''​ și rulați executabilul ''​vuln''​. Folosiți-vă de buffer overflow-ul existent în program ca să afișați mesajul //​You'​ve got it. Congratulations!//​. Trebuie să suprascrieți șirul/​buffer-ul ''​msg''​ cu mesajul corespunzător.
 +
 +<note tip>
 +Ca să vedeți unde sunt plasate variabilele locale și bufferele și să aflați diferența între ele (//​offset//​-ul),​ dezasamblați executabilul și aflați adresa bufferului și a variabilei (sunt de forma ''​rbp-<​numar>''​):​
 +<​code>​
 +student@pr706-pc:​~$ objdump -d -M intel vuln
 +</​code>​
 +</​note>​
 +
 +Ca să afișați un șir mai complex folosiți Python ca mai jos:
 +<​code>​
 +student@pr706-pc:​~$ python -c 'print "​A"​*16'​
 +AAAAAAAAAAAAAAAA
 +
 +student@pr706-pc:​~$$ python -c 'print "​A"​*16 + "​B"​*4'​
 +AAAAAAAAAAAAAAAABBBB
 +
 +student@pr706-pc:​~$$ python -c 'print "​A"​*16 + "​B"​*4 + "​\xaa\xbb"'​
 +AAAAAAAAAAAAAAAABBBB
 +
 +student@pr706-pc:​~$$ python -c 'print "​A"​*16 + "​B"​*4 + "​\xaa\xbb"'​ | xxd
 +00000000: 4141 4141 4141 4141 4141 4141 4141 4141  AAAAAAAAAAAAAAAA
 +00000010: 4242 4242 aabb 0a                        BBBB...
 +</​code>​
 +
 +==== Caracteristici printf ====
 +
 +Accesăm directorul ''​printf-features/''​ din arhiva de suport.
 +
 +Urmăriți conținutul fișierului ''​printf_features.c'',​ folosiți comanda ''​make''​ pentru a compila și apoi rulați executabilul ''​print_features''​. Vedeți pentru fiecare mesaj ce se întâmplă și de ce se întâmplă.
 +
 +==== Atacuri de șir de formatare ====
 +
 +Accesăm directorul ''​format-string-attack/''​ din arhiva de suport.
 +
 +Urmăriți conținutul fișierului ''​vuln.c''​ și rulați executabilul ''​vuln''​. Folosiți scriptul ''​exploit''​ pentru a exploata programul ''​vuln''​ în forma:
 +<​code>​
 +./exploit | ./vuln
 +</​code>​
  
 +<note important>​
 +Este posibil ca pe o configurație a sistemului să nu funcționeze scriptul ''​exploit''​ adică să nu suprascrie variabila ''​v''​ cu valoarea ''​100''​ ci cu altă valoare. Actualizați scriptul pentru a funcționa corespunzător.
 +</​note>​
secure-low-level-programming/capitole/05-siruri.1544959797.txt.gz · Last modified: 2018/12/16 13:29 by 127.0.0.1