This shows you the differences between two versions of the page.
Next revision | Previous revision | ||
secure-low-level-programming:capitole:04-memorie-stiva [2018/12/16 13:29] 127.0.0.1 external edit |
secure-low-level-programming:capitole:04-memorie-stiva [2019/05/15 11:04] (current) razvan [Afișarea stivei cu un buffer] |
||
---|---|---|---|
Line 1: | Line 1: | ||
====== 4. Zone de memorie. Stiva ====== | ====== 4. Zone de memorie. Stiva ====== | ||
- | TODO: Descriere scurtă | + | Discutăm despre zonele de memorie, cu accent pe stivă, zona folosită în cadrul apelurilor de funcții. Stiva este interesantă pentru că aici se găsesc variabilele locale și adresa de retur, ce pot fi folosite pentru a genera atacuri. |
===== Subiecte abordate ===== | ===== Subiecte abordate ===== | ||
- | * TODO | + | * zone de memorie |
- | * TODO | + | * alocare dinamică |
+ | * stiva | ||
===== Resurse ===== | ===== Resurse ===== | ||
Line 12: | Line 13: | ||
* [[http://koala.cs.pub.ro/training/res/secure-low-level-programming/slides/04-memorie-stiva.pdf|Slide-uri]] | * [[http://koala.cs.pub.ro/training/res/secure-low-level-programming/slides/04-memorie-stiva.pdf|Slide-uri]] | ||
* [[http://koala.cs.pub.ro/training/res/secure-low-level-programming/arc/04-memorie-stiva-skel.zip|Arhiva de suport]] | * [[http://koala.cs.pub.ro/training/res/secure-low-level-programming/arc/04-memorie-stiva-skel.zip|Arhiva de suport]] | ||
- | |||
- | ===== Alte resurse ===== | ||
- | |||
- | * TODO link | ||
- | * TODO link | ||
- | * TODO link | ||
===== Exerciții ===== | ===== Exerciții ===== | ||
Line 24: | Line 19: | ||
wget http://koala.cs.pub.ro/training/res/secure-low-level-programming/arc/04-memorie-stiva-skel.zip | wget http://koala.cs.pub.ro/training/res/secure-low-level-programming/arc/04-memorie-stiva-skel.zip | ||
unzip 04-memorie-stiva-skel.zip | unzip 04-memorie-stiva-skel.zip | ||
+ | cd 04-memorie-stiva-skel/ | ||
</code> | </code> | ||
- | ==== Exercițiu 1 ==== | + | ==== Afișarea stivei ==== |
- | Accesăm directorul ''lalala/'' din arhiva de suport. | + | Accesăm directorul ''stack-print/'' din arhiva de suport. |
- | TODO | + | Urmăriți conținutul fișierului ''vuln.c'' și rulați executabilul ''vuln''. Observați valorile afișate în formatul ''address: value''. Identificați variabile locale, adresa de retur, frame pointer-ul. |
- | ==== Exercițiu 2 ==== | + | Transmiteți două argumente funcției ''g()'', recompilați executabilul și rulați-l din nou pentru a observa stiva. |
- | Accesăm directorul ''lalala/'' din arhiva de suport. | + | ==== Afișarea stivei cu un buffer ==== |
- | TODO | + | Accesăm directorul ''buffer-stack-print/'' din arhiva de suport. |
- | ==== Exercițiu 3 ==== | + | Urmăriți conținutul fișierului ''vuln.c'' și rulați executabilul ''vuln''. Afișăm stiva folosind indexarea buffer-ului în afara limitelor (//array index out of bounds//). Identificați variabile locale, adresa de retur, frame pointer-ul. |
- | Accesăm directorul ''lalala/'' din arhiva de suport. | + | ==== Suprascrierea valorilor de pe stivă ==== |
- | TODO | + | Accesăm directorul ''stack-overwrite/'' din arhiva de suport. |
+ | Urmăriți conținutul fișierului ''vuln.c'' și rulați executabilul ''vuln''. Obiectivul este să suprascrieți pointer-ul de funcție ''fn'' cu adresa funcției ''g()'' astfel încât apelul ''fn()'' să conducă la apelul funcție ''g()'' (**nu** al funcției ''idle()''). | ||
+ | |||
+ | <note tip> | ||
+ | Pentru a afla adresa funcției ''g()'' folosiți utilitarul ''nm'' cu argument numele executabilului, adică rulând comanda | ||
+ | <code> | ||
+ | nm vuln | ||
+ | </code> | ||
+ | </note> | ||
+ | |||
+ | <note tip> | ||
+ | Pentru a converti o valoarea din zecimal în hexazecimal și invers puteți folosi consola Python, prin rularea comenzii ''python'', ca mai jos: | ||
+ | <code> | ||
+ | student@pr706-pc:~$ python | ||
+ | [...] | ||
+ | Type "help", "copyright", "credits" or "license" for more information. | ||
+ | >>> hex(18282) | ||
+ | '0x476a' | ||
+ | >>> 0xabcdef | ||
+ | 11259375 | ||
+ | </code> | ||
+ | </note> | ||
+ | **Bonus**: Suprascrieți **și** adresa de retur cu adresa funcției ''g()'' ca să o apelați de două ori. |