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.
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/05-siruri-skel.zip unzip 05-siruri-skel.zip cd 05-siruri-skel
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.
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.
data
rulați comanda
xxd data 00000000: 616e 61ff 6172 65ff 6d65 7265 0a ana.are.mere.
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?
./vuln | xxd
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.
rbp-<numar>
):
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...
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ă.
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
exploit
adică să nu suprascrie variabila v
cu valoarea 100
ci cu altă valoare. Actualizați scriptul pentru a funcționa corespunzător.