====== 5. Lucrul cu șiruri ======
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 =====
* buffere și șiruri
* șiruri în C
* șiruri în C++
* probleme cu șiruri
===== Resurse =====
* [[http://koala.cs.pub.ro/training/res/secure-low-level-programming/slides/05-siruri.pdf|Slide-uri]]
* [[http://koala.cs.pub.ro/training/res/secure-low-level-programming/arc/05-siruri-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/05-siruri-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/05-siruri-skel.zip
unzip 05-siruri-skel.zip
cd 05-siruri-skel
==== Dimensiunea unui șir ====
Accesăm directorul ''charsize/'' din arhiva de suport.
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.
==== End of File (EOF) ====
Accesăm directorul ''eof/'' din arhiva de suport.
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.
Ca să vedeți conținutul efectiv (binar) al fișierului ''data'' rulați comanda
xxd data
00000000: 616e 61ff 6172 65ff 6d65 7265 0a ana.are.mere.
==== Leak de informație ====
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?
Pentru a observa un leak binar (neprintabil) folosiți o comandă de forma
./vuln | xxd
==== 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.
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-''):
student@pr706-pc:~$ objdump -d -M intel vuln
Ca să afișați un șir mai complex folosiți Python ca mai jos:
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...
==== 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:
./exploit | ./vuln
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.