User Tools

Site Tools


laboratoare:laborator-09

Differences

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

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
laboratoare:laborator-09 [2015/12/11 18:51]
razvan.deaconescu
laboratoare:laborator-09 [2016/01/09 13:38] (current)
razvan.deaconescu [[2p] Bonus: Buffer overflow pentru binar]
Line 76: Line 76:
  
 Pe baza experienței de mai sus, realizați modificări pentru ca valoarea variabilei să fie ''​0xDEADBEEF''​ (în loc de ''​0xCAFEBABE''​ cum este la început) fără a modifica însă explicit valoarea variabilei. Folosiți-vă de modificarea buffer-ului și de registrul ''​ebx''​ în care am stocat adresa de început a buffer-ului. Pe baza experienței de mai sus, realizați modificări pentru ca valoarea variabilei să fie ''​0xDEADBEEF''​ (în loc de ''​0xCAFEBABE''​ cum este la început) fără a modifica însă explicit valoarea variabilei. Folosiți-vă de modificarea buffer-ului și de registrul ''​ebx''​ în care am stocat adresa de început a buffer-ului.
 +
 +<note tip>
 +Din nou, nu este ceva complicat. Trebuie să vă folosiți de valoarea ''​ebx''​ și un offset ca să scrieți valoarea ''​0xDEADBEEF''​ la acea adresă.
 +
 +Realizați acest lucru după secvența de inițializare a buffer-ului din jurul label-ului ''​fill_byte''​.
 +</​note>​
  
 La o rezolvare corectă a acestui exercițiu, programul va afișa valoarea ''​0xDEADBEEF''​ pentru variabila locală. La o rezolvare corectă a acestui exercițiu, programul va afișa valoarea ''​0xDEADBEEF''​ pentru variabila locală.
Line 98: Line 104:
  
 <note tip> <note tip>
-Ca să transmiteți șirul de intrare, e recomandat să-l scrieți într-un fișier și apoi să redirectați acel fișier către comanda aferentă programului. Puteți folosi un editor precum ''​Notapad++''​ pentru ​edtirarea ​fișierului.+Ca să transmiteți șirul de intrare, e recomandat să-l scrieți într-un fișier și apoi să redirectați acel fișier către comanda aferentă programului. Puteți folosi un editor precum ''​Notapad++''​ pentru ​editarea ​fișierului. Avantajul ''​Notepad++''​ este că vă afișează și coloana pe care vă aflați și puteți să știți câte caractere ați scris în fișier.
  
 E recomandat să numiți fișierul ''​payload''​. Redirectarea fișierului ''​payload''​ către program se face folosind o comandă precum<​code>​ E recomandat să numiți fișierul ''​payload''​. Redirectarea fișierului ''​payload''​ către program se face folosind o comandă precum<​code>​
Line 107: Line 113:
 ===== [1.5p] 7. Buffer overflow cu date de la intrarea standard și fgets() ===== ===== [1.5p] 7. Buffer overflow cu date de la intrarea standard și fgets() =====
  
-Așa cum am precizat mai sus, funcția ''​gets''​ este interzisă în programele curente. În locul acesteia se poate folosi funcția [[http://​man7.org/​linux/​man-pages/​man3/​fgets.3.html|fgets]]. Creați o copie a conținutului directorului ​''​read-stdin/''​ în ''​read-stdin-fgets/'' ​și în fișierul cod sursă ''​read_stdin.asm''​ schimbați apelul funcției ''​gets''​ cu apelul funcției ''​fgets''​.+Așa cum am precizat mai sus, funcția ''​gets''​ este interzisă în programele curente. În locul acesteia se poate folosi funcția [[http://​man7.org/​linux/​man-pages/​man3/​fgets.3.html|fgets]]. Creați o copie a fișierului cod sursă ''​read_stdin.asm''​ din subdirectorul ​''​read-stdin/​''​ într-u fișier cod sursă ''​read_stdin_fgets.asm''​ în subdirectorul ​''​read-stdin-fgets/''​. În fișierul cod sursă ''​read_stdin.asm''​ schimbați apelul funcției ''​gets''​ cu apelul funcției ''​fgets''​.
  
 Pentru apelul ''​fgets''​ citiți de la intrarea standard. Ca argument pentru al treilea parametru al ''​fgets''​ (de tipul ''​FILE *''​) veți folosi intrarea standard. Pentru a specifica intrarea standard folosiți construcția [[http://​www.nongnu.org/​avr-libc/​user-manual/​group__avr__stdio.html|__iob]]. Va trebui să o marcați externă la modul ''​%%extern __iob%%''​. Pentru apelul ''​fgets''​ citiți de la intrarea standard. Ca argument pentru al treilea parametru al ''​fgets''​ (de tipul ''​FILE *''​) veți folosi intrarea standard. Pentru a specifica intrarea standard folosiți construcția [[http://​www.nongnu.org/​avr-libc/​user-manual/​group__avr__stdio.html|__iob]]. Va trebui să o marcați externă la modul ''​%%extern __iob%%''​.
Line 113: Line 119:
 <note tip> <note tip>
 Urmăriți pagina de manual a [[http://​man7.org/​linux/​man-pages/​man3/​fgets.3.html|funcției fgets()]] pentru a afla ce parametri primește. Urmăriți pagina de manual a [[http://​man7.org/​linux/​man-pages/​man3/​fgets.3.html|funcției fgets()]] pentru a afla ce parametri primește.
 +</​note>​
 +
 +<note tip>
 +Pentru apelul funcției ''​fgets''​ folosiți construcția<​code>​
 +call _fgets
 +</​code>​
 +De asemenea, marcați simbolul ca fiind extern folosind construcția<​code>​
 +extern _fgets
 +</​code>​
 </​note>​ </​note>​
  
Line 119: Line 134:
 </​note>​ </​note>​
  
-Să păstrați posibilitatea unui buffer overflow și să demonstrați acest lucru prin afișarea valorii ''​0x574F4C46''​ pentru variabila locală.+Să păstrați posibilitatea unui buffer overflow și să demonstrați acest lucru prin afișarea valorii ''​0x574F4C46''​ pentru variabila locală. Adică să folosiți ca al doilea argument pentru ''​fgets''​ (dimensiunea) o valoare suficient de mare cât să permită realizarea unui buffer overflow.
  
 <note tip> <note tip>
Line 131: Line 146:
 De cele mai multe ori vom identifica vulnerabilități de tip buffer overflow în programe scrise în C. Acolo trebuie să vedem ce buffere sunt și care este distanța de la buffer la variabila dorită pentru a putea face suprascriere. De cele mai multe ori vom identifica vulnerabilități de tip buffer overflow în programe scrise în C. Acolo trebuie să vedem ce buffere sunt și care este distanța de la buffer la variabila dorită pentru a putea face suprascriere.
  
-Este important de avut în vedere distanța între un buffer și o altă variabilă în C poate nu corespunde cu cea %%"din teren"​%%;​ compilatorul poate face actualizări,​ reordonări etc.+<note important>​ 
 +Este important de avut în vedere ​că distanța între un buffer și o altă variabilă în C poate nu corespunde cu cea %%"din teren"​%%;​ compilatorul poate face actualizări,​ reordonări, poate lăsa spații libere între variabile ​etc. 
 +</​note>​
  
 Pentru exercițiul curent, accesați directorul ''​c-buffer-overflow/''​ din arhiva de resurse a laboratorului și observați codul sursă aferent în C. Pentru cazul în care doriți să nu mai compilați voi codul aveți în arhivă și fișierul limbaj de asamblare echivalent și fișierul în cod obiect și fișierul executabil. Pentru exercițiul curent, accesați directorul ''​c-buffer-overflow/''​ din arhiva de resurse a laboratorului și observați codul sursă aferent în C. Pentru cazul în care doriți să nu mai compilați voi codul aveți în arhivă și fișierul limbaj de asamblare echivalent și fișierul în cod obiect și fișierul executabil.
Line 164: Line 181:
 </​code>​ </​code>​
 </​note>​ </​note>​
 +
 +===== Soluții =====
 +
 +[[http://​elf.cs.pub.ro/​asm/​res/​laboratoare/​lab-09-sol.zip|Soluții de referință pentru exercițiile de laborator]]
 +
laboratoare/laborator-09.1449852671.txt.gz · Last modified: 2015/12/11 18:51 by razvan.deaconescu