This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision | ||
laboratoare:laborator-09 [2015/12/11 19:00] razvan.deaconescu [[1p] 4. Scrierea de date dincolo de dimensiunea buffer-ului] |
laboratoare:laborator-09 [2016/01/09 13:38] (current) razvan.deaconescu [[2p] Bonus: Buffer overflow pentru binar] |
||
---|---|---|---|
Line 113: | 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 119: | 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 125: | 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 137: | 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 170: | 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]] | ||
+ |