Casto se take v mnoha programech setkate s konstrukci tohoto typu:
...
char str[1024];
... /* naplneni stringu str z uzivatelskeho vstupu/souboru/argumentu z prikazove radky apod. */
printf(str);
...
To je nebezpecne z toho duvodu, ze uzivatel vysledneho programu muze naplnit string str zaludnou posloupnosti znaku obsahujici veci jako "%d" apod., ktere zpusobi, ze veci na zasobniku (interni lokalni promenne funkce printf(), navratova adresa) jsou dale povazovany za dalsi argumenty printf(). Funkce printf() tim padem pouzije jinou (nespravnou) adresu. Je to sloziteji zneuzitelne, ale lze to.
Bezpecne je psat volani printf() takto:
printf("%s", str);
Duvod bezpecnosti teto konstrukce je snad kazdemu c-ckari jasny. Samozrejme se to vse tyka i pribuznych funkci sprintf(), fprintf() atd.
Mozna to vse nerikam moc presne, ale blizsi/presnejsi informace najdete na Internetu, napr. na http://www.linuxsecurity.com/docs/LDP/Secure-Programs-HOWTO/control-formatting.html
No, před rokem jsem ve škole ukazoval učiteli při zkoušce program v C++. Mělo se zadávat číslo a výsledek byla nějaká funkca. Najednou přišel spolužák, ukaž já to vyzkouším. Začal tam psát nějaký znaky, a já na něj, že tam má být číslo... Nějak to tam nastrkal a program se zacykloval (asi nějak šikovně přepsal návratovou adresu).
Moje otázka zní, jak se proti tomu jednoduše bránit. Například chci číslo, 5 znaků, jak to udělat (nejjednodušeji).
Jo, taková maličkost, proč je to C++ tak děsně blbý? Vyšší programovací jazyky (Delphi, Pascal atd.) tyhle problémy vůbec nemaj... Maximálně spadne program, ale v C++ je každá prkotina přetečení zásobníku :-(
Nejsem si tak uplne jisty, ze slo zrovna o preteceni bufferu. Pokud jste pouzil klasicky 'cin' a to do nejakeho int/long, tak se neni cemu divit. Cteni selze a vsechna nasledujici take (tim padem se program vetsinou tvari, ze se zacyklil). Podobne je na tom ovsem aji scanf v C, takze si nevyberete. Ano, daji se testovat navratove hodnoty ... ale to je opruz (a nez tuto vetu nekdo napadne - daleko lepsi nez periodicke checkovani a'la errno jsou samozrejme vyjimky). Zlate vlastni funkce a nebo jine (inteligentni) jazyky :)
Asi jsem divny, ale v mych programech mi jeste zasobnik nikdy nepretekl. V C++ je mozne take programovat "bezpecne", ale je potreba vedet, na co si davat pozor. Pro zacatecnicke hrani si na programatora a vyuku programovani bych doporucoval Python. V C a C++ by asi nemeli lidi programovat, dokud se jazyk trosku nenauci. ;-)
No, me prijde, ze je nesmysl se ucit programovat v pythonu a pak prechazet na C++, kdyz maji uplne jinou syntaxi ;-).
Snad by bylo logictejsi na vyuku pouzit napr. Perl.
K te bezpecnosti, C++ je hodne zaludne, napr. ve statickem/dynamickem volani metod, nebo pretezovani operatoru. Je potreba vedet jak je implementovane to, co pouzivam a to je nejvetsi potiz. Kdyz programator pise neco vetsiho, problemum se stejne nevyhne.
Protoze me osobne bezpecnost velmi trapi, presunul jsem se k jave.
1. Perl bych pro vyuku programovani nedoporucil, protoze mi jako jazyk pripadne dost spatne navrzeny.
2. Pokud se pracuje v tymu, mela by se urcit jasna pravidla ohledne psani kodu, jeho dokumentace apod.
3. Je jasne, ze C/C++ psani bezpecneho kodu moc nenapomaha, ale at se nam to libi nebo ne, ma porad jeste sve opodstatneni a navic se v mnoha dalsich pripadech pouziva "ze zvyku". Proto si myslim, ze by bylo dobre na tento dvojclanek navazat nejakym delsim serialem. Autore, slysite, nechcete neco sepsat?
Zdravim vsechny okolo, clanek je opravdu inspirujici :-)
Natolik, ze mi to nedalo a prepsal jsem si ho. Ukazka sice nefunguje, jak uz autor predesilal, ale udelal jsem funkcni variaci, ktera ziska prava roota a navic rootovo konto odstreli :-) Zajemci o reseni se muzou ozvat ...
Jediny problem ovsem spociva v tom, ze v systemu velmi pravdepodobne nenarazite na rootvsky soubor s sbitem, co by to bylo za roota, kterej by si nechal takovouhle diru do systemu ... Nebo se pletu? Jestli nekdo o necem vi, at prispeje se svou troskou do diskuze.
Zajimalo by me, jak vyresit problem s navratovou adresou u demonu, neporadite nekdo?