CLASSICISTRANIERI HOME PAGE - YOUTUBE CHANNEL
SITEMAP
Audiobooks by Valerio Di Stefano: Single Download - Complete Download [TAR] [WIM] [ZIP] [RAR] - Alphabetical Download  [TAR] [WIM] [ZIP] [RAR] - Download Instructions

Make a donation: IBAN: IT36M0708677020000000008016 - BIC/SWIFT:  ICRAITRRU60 - VALERIO DI STEFANO or
Privacy Policy Cookie Policy Terms and Conditions
Bufferoverloop - Wikipedia

Bufferoverloop

Een bufferoverloop (Engels: buffer overflow) is een foutief gedrag van een computerprogramma dat probeert data te schrijven in een tijdelijke gegevensruimte maar buiten de grenzen van deze buffer schrijft. Dit veroorzaakt in de meeste gevallen een stopzetting van het programma.

Fouten in zulke programma's, maar nog meer in het geval van besturingssystemen, worden soms misbruikt door wormen, virussen en hackers om ongeoorloofde toegang te krijgen tot computersystemen.

Inhoud

[bewerk] Geschiedenis van de bufferoverloop

Een van de eerste teksten over de bufferoverloop, "Smashing the stack for fun and profit", werd geschreven door Aleph One, in het E-zine Phrack. Hierin wordt uitgelegd hoe men in een slecht geschreven C-programma de buffer kan laten overlopen en de controle over het programma kan overnemen.

[bewerk] Implicaties van een bufferoverloop

Een bufferoverloop zorgt ervoor dat er gegevens worden overschreven die niet overschreven mogen worden, voornamelijk het return-adres. In het beste geval leidt dit tot een programmacrash, in het slechtste geval tot een overname door het programma door iets dat gegevens levert aan het programma. Het is daarom belangrijk programma's te maken die geen bufferoverloop veroorzaken.

[bewerk] Oorzaken van een bufferoverloop

De oorzaak van een bufferoverloop kan het best weergegeven worden met een stukje voorbeeldcode in C:

#include <stdio.h>

int main (int argc, char *argv[])
{
    char grote_buffer [1024]; // buffer van 1024 bytes
    gets(grote_buffer);       // verkrijg string van toetsenbord
    overloop(grote_buffer);   // roep kwetsbare functie aan
    return 0;
}

int overloop(char *groot)
{
    char kwetsbaar[100];      // overlopende buffer [100 bytes]
    strcpy(kwetsbaar,groot);  // kopieer grote_buffer naar kwetsbaar
    return 0;                 // verlaat functie
}


Dit stukje code doet dit:

  1. Lees toetsenbordinvoer in grote_buffer
  2. Roep functie overloop
  3. Kopieer invoer naar kwetsbaar (100 bytes)
  4. Verlaat functie
  5. Verlaat programma

De fout ligt bij stap 3. Omdat grote_buffer groter is dan kwetsbaar, zal bij het kopiëren het stuk van grote_buffer dat niet in kwetsbaar past achter kwetsbaar geschreven worden. Dit valt alleen te merken als de toetsenbordinvoer groter dan 100 bytes is.

Omdat kwetsbaar geen globale variabele is wordt deze op de stack opgeslagen. En achter kwetsbaar staat daar het terugkeeradres van functie overloop. Dit is een getal dat aangeeft waarnaar moet worden teruggekeerd als de functie is afgelopen.

Door het terugkeeradres te overschrijven kan dus het programmaverloop aangepast worden.

Als men bijvoorbeeld 200 a's invoert zal geprobeerd worden terug te springen naar adres 0x61616161 (61 is de hexidecimale weergave van "a").

[bewerk] Exploitatie van een bufferoverloop

Voor een succesvolle exploitatie van een bufferoverloop moet er eigen code worden uitgevoerd, soms het egg (ei) genoemd. Deze code kan bijvoorbeeld in de toetsenbordinvoer zitten. Het is echter moeilijk de locatie van de invoer op de stack te bepalen. Hiervoor is echter een oplossing: na de terugkeer van de functie bevat de stack pointer (esp) het adres na waar het terugkeeradres stond. Als je dus de code na het terugkeeradres plaatst, en het terugkeeradres naar een jmp esp/call esp laat wijzen, zal de code uitgevoerd worden.

[bewerk] De puntjes op de i

Het terugkeeradres moet natuurlijk wel op de juiste plek staan. Het makkelijkste is om een rij opvolgende tekens te gebruiken (abcdefg...) en dan te kijken waarnaartoe wordt teruggekeerd.

Ook moet de code natuurlijk wel iets zinnigs uitvoeren; het gebruikelijkste is een zogenaamde shellcode die de exploiteur een commandline-interface biedt om het systeem te besturen.

Het terugkeeradres en de shellcode mogen beide niet de getallen 0x00, 0x0A, 0x0C en 0x1A bevatten, omdat het kopiëren van tekenreeksen hier stopt.

[bewerk] Hoe een bufferoverloop te voorkomen

Een bufferoverloop is te voorkomen door de maximum lengte van de te kopiëren tekenreeksen te controleren alvorens dit te doen.

 
Static Wikipedia 2008 (no images)

aa - ab - af - ak - als - am - an - ang - ar - arc - as - ast - av - ay - az - ba - bar - bat_smg - bcl - be - be_x_old - bg - bh - bi - bm - bn - bo - bpy - br - bs - bug - bxr - ca - cbk_zam - cdo - ce - ceb - ch - cho - chr - chy - co - cr - crh - cs - csb - cu - cv - cy - da - de - diq - dsb - dv - dz - ee - el - eml - en - eo - es - et - eu - ext - fa - ff - fi - fiu_vro - fj - fo - fr - frp - fur - fy - ga - gan - gd - gl - glk - gn - got - gu - gv - ha - hak - haw - he - hi - hif - ho - hr - hsb - ht - hu - hy - hz - ia - id - ie - ig - ii - ik - ilo - io - is - it - iu - ja - jbo - jv - ka - kaa - kab - kg - ki - kj - kk - kl - km - kn - ko - kr - ks - ksh - ku - kv - kw - ky - la - lad - lb - lbe - lg - li - lij - lmo - ln - lo - lt - lv - map_bms - mdf - mg - mh - mi - mk - ml - mn - mo - mr - mt - mus - my - myv - mzn - na - nah - nap - nds - nds_nl - ne - new - ng - nl - nn - no - nov - nrm - nv - ny - oc - om - or - os - pa - pag - pam - pap - pdc - pi - pih - pl - pms - ps - pt - qu - quality - rm - rmy - rn - ro - roa_rup - roa_tara - ru - rw - sa - sah - sc - scn - sco - sd - se - sg - sh - si - simple - sk - sl - sm - sn - so - sr - srn - ss - st - stq - su - sv - sw - szl - ta - te - tet - tg - th - ti - tk - tl - tlh - tn - to - tpi - tr - ts - tt - tum - tw - ty - udm - ug - uk - ur - uz - ve - vec - vi - vls - vo - wa - war - wo - wuu - xal - xh - yi - yo - za - zea - zh - zh_classical - zh_min_nan - zh_yue - zu -

Static Wikipedia 2007 (no images)

aa - ab - af - ak - als - am - an - ang - ar - arc - as - ast - av - ay - az - ba - bar - bat_smg - bcl - be - be_x_old - bg - bh - bi - bm - bn - bo - bpy - br - bs - bug - bxr - ca - cbk_zam - cdo - ce - ceb - ch - cho - chr - chy - co - cr - crh - cs - csb - cu - cv - cy - da - de - diq - dsb - dv - dz - ee - el - eml - en - eo - es - et - eu - ext - fa - ff - fi - fiu_vro - fj - fo - fr - frp - fur - fy - ga - gan - gd - gl - glk - gn - got - gu - gv - ha - hak - haw - he - hi - hif - ho - hr - hsb - ht - hu - hy - hz - ia - id - ie - ig - ii - ik - ilo - io - is - it - iu - ja - jbo - jv - ka - kaa - kab - kg - ki - kj - kk - kl - km - kn - ko - kr - ks - ksh - ku - kv - kw - ky - la - lad - lb - lbe - lg - li - lij - lmo - ln - lo - lt - lv - map_bms - mdf - mg - mh - mi - mk - ml - mn - mo - mr - mt - mus - my - myv - mzn - na - nah - nap - nds - nds_nl - ne - new - ng - nl - nn - no - nov - nrm - nv - ny - oc - om - or - os - pa - pag - pam - pap - pdc - pi - pih - pl - pms - ps - pt - qu - quality - rm - rmy - rn - ro - roa_rup - roa_tara - ru - rw - sa - sah - sc - scn - sco - sd - se - sg - sh - si - simple - sk - sl - sm - sn - so - sr - srn - ss - st - stq - su - sv - sw - szl - ta - te - tet - tg - th - ti - tk - tl - tlh - tn - to - tpi - tr - ts - tt - tum - tw - ty - udm - ug - uk - ur - uz - ve - vec - vi - vls - vo - wa - war - wo - wuu - xal - xh - yi - yo - za - zea - zh - zh_classical - zh_min_nan - zh_yue - zu -

Static Wikipedia 2006 (no images)

aa - ab - af - ak - als - am - an - ang - ar - arc - as - ast - av - ay - az - ba - bar - bat_smg - bcl - be - be_x_old - bg - bh - bi - bm - bn - bo - bpy - br - bs - bug - bxr - ca - cbk_zam - cdo - ce - ceb - ch - cho - chr - chy - co - cr - crh - cs - csb - cu - cv - cy - da - de - diq - dsb - dv - dz - ee - el - eml - eo - es - et - eu - ext - fa - ff - fi - fiu_vro - fj - fo - fr - frp - fur - fy - ga - gan - gd - gl - glk - gn - got - gu - gv - ha - hak - haw - he - hi - hif - ho - hr - hsb - ht - hu - hy - hz - ia - id - ie - ig - ii - ik - ilo - io - is - it - iu - ja - jbo - jv - ka - kaa - kab - kg - ki - kj - kk - kl - km - kn - ko - kr - ks - ksh - ku - kv - kw - ky - la - lad - lb - lbe - lg - li - lij - lmo - ln - lo - lt - lv - map_bms - mdf - mg - mh - mi - mk - ml - mn - mo - mr - mt - mus - my - myv - mzn - na - nah - nap - nds - nds_nl - ne - new - ng - nl - nn - no - nov - nrm - nv - ny - oc - om - or - os - pa - pag - pam - pap - pdc - pi - pih - pl - pms - ps - pt - qu - quality - rm - rmy - rn - ro - roa_rup - roa_tara - ru - rw - sa - sah - sc - scn - sco - sd - se - sg - sh - si - simple - sk - sl - sm - sn - so - sr - srn - ss - st - stq - su - sv - sw - szl - ta - te - tet - tg - th - ti - tk - tl - tlh - tn - to - tpi - tr - ts - tt - tum - tw - ty - udm - ug - uk - ur - uz - ve - vec - vi - vls - vo - wa - war - wo - wuu - xal - xh - yi - yo - za - zea - zh - zh_classical - zh_min_nan - zh_yue - zu -

Sub-domains

CDRoms - Magnatune - Librivox - Liber Liber - Encyclopaedia Britannica - Project Gutenberg - Wikipedia 2008 - Wikipedia 2007 - Wikipedia 2006 -

Other Domains

https://www.classicistranieri.it - https://www.ebooksgratis.com - https://www.gutenbergaustralia.com - https://www.englishwikipedia.com - https://www.wikipediazim.com - https://www.wikisourcezim.com - https://www.projectgutenberg.net - https://www.projectgutenberg.es - https://www.radioascolto.com - https://www.debitoformtivo.it - https://www.wikipediaforschools.org - https://www.projectgutenbergzim.com