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

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

Stack Vezérlés szerkezet Adat 2.

PE/COFF fájl formátum

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

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

Assembly. Iványi Péter

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

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

A 32 bites x86-os architektúra regiszterei

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

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

Operációs rendszerek III.

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

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

Operációs rendszerek. Az NT folyamatok kezelése

Paraméter átadás regisztereken keresztül

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

Intel x86 utasításkészlet + disassembler működése

8. gyakorlat Pointerek, dinamikus memóriakezelés

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

Programozás C++ -ban 2007/7

Programozási nyelvek Java

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

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

Máté: Assembly programozás

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

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

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

Intel x86 utasításkészlet

Fordító részei. Fordító részei. Kód visszafejtés. Izsó Tamás szeptember 29. Izsó Tamás Fordító részei / 1

Programok működése dióhéjban

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

Alprogramok fordítása. Kódgenerálás II. (alprogramok, memóriakezelés) Függvény, eljárás. Alprogramok írása assemblyben

Programozas 1. Strukturak, mutatok

Irvine eljárások. ClrScr - Törli a képernyő tartalmát és a kurzort a képernyő bal felső sarkába helyezi (Clear Screen).

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

C++ programozási nyelv Konstruktorok-destruktorok

Rootkitek. Előadó: Barta Csaba

A Számítógépek felépítése, mőködési módjai

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.

Assembly utasítások listája

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.

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

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

3. Osztályok II. Programozás II

1. Alapok. Programozás II

assume CS:Code, DS:Data, SS:Stack Start mov dl, 100 mov dh, 100 push dx Rajz

1. Bevezetés szeptember 9. BME Fizika Intézet. Szám. szim. labor ea. Tőke Csaba. Tudnivalók. feladat. Tematika. Moodle Házi feladatok

Pelda öröklődésre: import java.io.*; import java.text.*; import java.util.*; import extra.*;

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.

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

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

Programozás I gyakorlat. 10. Stringek, mutatók

1. Template (sablon) 1.1. Függvénysablon Függvénysablon példányosítás Osztálysablon

Fábián Zoltán Hálózatok elmélet

1. Mi a fejállományok szerepe C és C++ nyelvben és hogyan használjuk őket? 2. Milyen alapvető változókat használhatunk a C és C++ nyelvben?

Programozás II. 3. gyakorlat Objektum Orientáltság C++-ban

Utolsó módosítás:

Vizuális, eseményvezérelt programozás XI.

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

Számítógép Architektúrák

Máté: Assembly programozás

A programozás alapjai

A függvények névvel rendelkező utasításcsoportok, melyeknek információkat adhatunk át, és van egy visszatérési értékük.

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

1. Öröklés Rétegelés Nyilvános öröklés - isa reláció Korlátozó öröklődés - has-a reláció

Aritmetikai utasítások I.

Adatszerkezetek 1. Dr. Iványi Péter

Bevezetés a programozásba Előadás: Tagfüggvények, osztály, objektum

Vezérlésfolyam gráf és X86 utasításkészlet

Osztályok. 4. gyakorlat

Assembly Utasítások, programok. Iványi Péter

Pénzügyi algoritmusok

Bevezetés Alapfogalmak Jog

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

Processzorok Utasításszintű Kezelése tavasz

Programozás II gyakorlat. 6. Polimorfizmus

Java és web programozás

Programozási nyelvek Java

Programozási nyelvek a közoktatásban alapfogalmak II. előadás

Programozási Nyelvek: C++

Bevezetés a C++ programozási nyelvbe

SZÁMÍTÓGÉPEK BELSŐ FELÉPÍTÉSE - 1

Virtuális memóriakezelés Védelem. Memória védelem. Intel x68. Izsó Tamás október 18. Izsó Tamás Memória védelem/ 1

SZÁMÍTÓGÉP ARCHITEKTÚRÁK

Programozás alapjai Bevezetés

OOP #14 (referencia-elv)

Architektúra, megszakítási rendszerek

PHP-MySQL. Adatbázisok gyakorlat

Virtuális memóriakezelés Védelem. Memória védelem. Intel X86. Izsó Tamás október 1. Izsó Tamás Memória védelem/ 1

A fordítóprogramok szerkezete. Kódoptimalizálás. A kódoptimalizálás célja. A szintézis menete valójában. Kódoptimalizálási lépések osztályozása

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

Miért van szükség fordítóprogramokra? Fordítóprogramok célja és szerkezete. Miért van szükség fordítóprogramokra?

Java és web programozás

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

ELEKTRONIKUS MUNKABÉRJEGYZÉK MODUL

Dr. Schuster György október 14.

Ali and more about Sharp PC-1500 at PTA HORDOZHATÓ SZÁMITOOÉP HIRADÁSTECHNIKA SZÖVETKEZET WWW. PC-1500.

Pénzügyi algoritmusok

[cimke:] [feltétel] utasítás paraméterek [; megjegyzés]

Átírás:

Biztonságos programozás Puffer túlcsordulásos támadások Izsó Tamás 2015 október 12 Izsó Tamás Biztonságos programozás Puffer túlcsordulásos támadások/ 1

Section 1 DEP támadás Izsó Tamás Biztonságos programozás Puffer túlcsordulásos támadások/ 2

2libc A különböző DEP beállítások miatt több függvény is van, amellyel a DEP védelmet ki lehet kapcsolni 1 ULONG ExecuteFlags = MEM_EXECUTE_OPTION_ENABLE; / / 2 NtSetInformationProcess ( NtCurrentProcess ( ), / / (HANDLE) 1 ProcessExecuteFlags, / / 0x22 &ExecuteFlags, / / p t r to 0x2 sizeof ( ExecuteFlags ) ) ; / / 0x4 1 Windows 8-ban ezekkel a függvényekkel csak bekacsolni lehet, kikapcsolni nem! Izsó Tamás Biztonságos programozás Puffer túlcsordulásos támadások/ 3

Védelem kikapcsolása Terv: A visszatérési címet írjuk felül az NtSetInformationProcess függvény címével A következő stack címre tegyük a (HANDLE)-1 értéket A következő stack címre tegyünk 0x22 értéket A következő stack címre egy 32 bites 2 értéket tartalmazó adatterület címét tegyük Ezután következzen a 4-es A következő adat egy cím, amely egy DLL-ben lévő jmp esp; utasításra mutat Ha ez működik, akkor ki tudjuk kapcsolni a védelmet, és le tudjuk futtatni a programunkat Izsó Tamás Biztonságos programozás Puffer túlcsordulásos támadások/ 4

2libc programozás I A módszer lényege, hogy nem a kódot, hanem függvény címeket és a paramétereket tesszük a stack-re A puffer túlcsordulást tartalmazó függvény visszatérésénél a utasítás hatására az oda készített címre kerül a vezérlés, miközben az esp értéke eggyel csökken Ha a meghívott rutinnak paraméterekre van szüksége, akkor a puffer felülírás során gondoskodhatunk ezek megadásáról A Windows API függvények a visszatérés előtt felszabadítják a stack-et ( stdcall konvenció) Így az esp regiszter a gondosan előkészített, következő meghívandó függvényre fog mutatni A hatására a következő könyvtári függvény hívódik meg Vegyük észre, hogy sohasem fut le call utasítás, ami letenné a visszatérési címet Izsó Tamás Biztonságos programozás Puffer túlcsordulásos támadások/ 5

2libc programozás II Sok esetben nem célszerű a függvény első utasítását meghívni, hanem beleugorhatunk a függvény közepébe Nem szabad elfeledkezi arról, hogy ilyenkor is a függvény felszabadítja a stack-en használt lokális változókat Ezért a következő meghívandó függvény címét ennek megfelelően a stacken távolabb kell elhelyezni Izsó Tamás Biztonságos programozás Puffer túlcsordulásos támadások/ 6

2libc módszer korlátai Csak olyan standard C vagy operációs rendszer függvényeket lehet meghívni, amelyek: statikusan hozzá vannak linkelve a programkódhoz, vagy betöltött (használt) dll-ben lévő függvények Nem minden cím vagy paraméter érték vihető be a pufferbe, például string puffer esetén 0 értékű byte nem szerepelhet a címekben vagy paraméterek értékében 2 2 Ezen még dolgozunk! Izsó Tamás Biztonságos programozás Puffer túlcsordulásos támadások/ 7

2libc programozás (esettanulmány) I A NtSetInformationProcess függvény paraméterei 0-ás értékű byte-okat tartalmaznak Az alábbi példa Windows XP SP3 rendszeren készült A cím és a kód változhat A módszer és nem az értékek fontosak A ntdlldll-ben a LdrpCheckNXCompatibility hívja az NtSetInformationProcess rendszer függvényt 0:000 > u 7c936861 n t d l l! LdrpCheckNXCompatibility+0x4d : 7c936861 push 4 7c936863 lea eax, [ ebp 4] 7c936866 push eax 7c936867 push 22h 7c936869 push 0FFFFFFFFh 7c93686b c a l l n t d l l! ZwSetInformationProcess (7 c90dc9e ) 7c936870 jmp n t d l l! LdrpCheckNXCompatibility+0x5c (7 c91cd8d ) 7c936875 nop Izsó Tamás Biztonságos programozás Puffer túlcsordulásos támadások/ 8

2libc programozás (esettanulmány) II Tehát az [ebp 4] címen van a 2-es érték A kód, ahonnan a 0x7c936861 címre ugrottunk 7c91cd4f cmp dword ptr [ ebp 4],0 7c91cd53 jne n t d l l! LdrpCheckNXCompatibility+0x4d ( 7 c936861 ) Ha az [ebp 4] területre be tudjuk írni a 2-es értéket, akkor az ugrás meg fog történni Meg kell nézni, hogy hogyan tudunk erre a pontra jutni 7c94153e mov dword ptr [ ebp 4], esi 7c941541 jmp n t d l l! LdrpCheckNXCompatibility+0x1d ( 7 c91cd4f ) Ahhoz, hogy az [ebp 4] területen 2-es legyen, az esi regiszterbe 2-es értéket kell tölteni Izsó Tamás Biztonságos programozás Puffer túlcsordulásos támadások/ 9

2libc programozás (esettanulmány) III 0:000 > uf n t d l l! LdrpCheckNXCompatibility n t d l l! LdrpCheckNXCompatibility : 7c91cd31 mov edi, edi 7c91cd33 push ebp 7c91cd34 mov ebp, esp 7c91cd36 push ecx 7c91cd37 and dword ptr [ ebp 4],0 7c91cd3b push esi 7c91cd3c push dword ptr [ ebp+8] 7c91cd3f c a l l n t d l l! LdrpCheckSafeDiscDll (7 c91cccb ) 7c91cd44 cmp al, 1 7c91cd46 push 2 7c91cd48 pop esi 7c91cd49 j e n t d l l! LdrpCheckNXCompatibility+0x1a ( 7 c94153e ) A 7c91cd46 címen lévő utasítás push 2; pop esi pont jól állítja be a leendő paraméter értékét Azt szenénk, ha a 7c91cd49 címen lévő je ntdll! LdrpCheckNXCompatibility+0x1a ugrás teljesüljön, de Izsó Tamás Biztonságos programozás Puffer túlcsordulásos támadások/ 10

2libc programozás (esettanulmány) IV ez akkor fog megtörténni, ha az al regiszter 1-et tartalmaz Viszont azt a 7c91cd3f címen lévő call utasítás állítja be Teendők: Tegyünk 1-et az al regiszterbe A függvényt ne az elejétől, hanem a 7c91cd44 címtől hívjuk meg Követett módszer Ha a programanalízisben arra vagyunk kíváncsiak, hogy egy változó (regiszter) tartalma mely utasításoktól függ, akkor pont ezt a módszert követjük A módszer neve visszafele haladó program szeletelés (Backward Static Program Slicing) Izsó Tamás Biztonságos programozás Puffer túlcsordulásos támadások/ 11

2libc programozás (esettanulmány) V Már csak egy teendő van hátra, az al regiszterbe 0x01-et kell tenni Hogyan lehet ezt megoldani? Már kerestünk dll-ekben pop esi, pop edi, kódot Akkor ehhez hasonlóan keressünk: mov eax,1; ; vagy mov al,1; ; vagy xor eax,eax; inc eax; ; vagy ehhez hasonlóan, a célnak megfelelő kódot Izsó Tamás Biztonságos programozás Puffer túlcsordulásos támadások/ 12

2libc programozás (esettanulmány) VI A stack felépítése: visszatérési cím helye n "A" ebp kiigazítás (cím) eax beállítás (cím) stack NX letíltás kiigazítás (cím) stack shellcode hívás kiigazítás (cím) shellcode mov ebp,esp mov al,1 4 A fő függvény jmp esp Izsó Tamás Biztonságos programozás Puffer túlcsordulásos támadások/ 13

Lehetőségek a DEP kiiktatására I 1 Kapcsoljuk ki a védelmet Ígées Windows rendszer függvények (paraméterek nincsenek feltüntetve): SetProcessDEPPolicy(), NtSetInformationProcess() Ezek az Windows XP-nél működtek, újabb Windows rendszereknél már nem (csak nagyon speciális esetben) működnek Szigorították a DEP stratégia védelmét Izsó Tamás Biztonságos programozás Puffer túlcsordulásos támadások/ 14

Lehetőségek a DEP kiiktatására II 2 Hozzunk létre olyan memóriaterületet amely írható és futtatható memória védelemmel rendelkezik Másoljuk ide a shellcode-unkat és adjuk rá a vezérlést A cél eléréséhez a következő Windows rendszer függvényeket használhatjuk (paraméterek nincsenek feltüntetve): VirtualAlloc() az operációs rendszer a processz számára memóriát biztosít HeapCreate() + a HeapAlloc(), hasonló mint a VirtualAlloc csak private heap-et hoz létre WriteProcessMemory() függvéy a shellcode-ot át tudja másolni olyan helyre, ahol azt le lehet futtatni Izsó Tamás Biztonságos programozás Puffer túlcsordulásos támadások/ 15

DEP védelem kihívásai Kérdések: Hogyan hívjunk meg egymás után függvényeket? Hogyan állítsuk elő a függvények paramétereit, ha az értékük futási időben derül ki, például függenek a memóriacímektől? Hogyan írjunk SEH exploitot, ahol a jmp $+8; nop; nop a stack-en helyezkedi el, de ott nem lehet programot futtatni? Hogyan vigyünk be nem megengedett értékeket (string puffer esetén 0-át) A válasz, hogy saját kódot kell írni De hogyan, ha a stack-en lévő kód nem futtatható Megoldás ROP Return Oriented Programing Izsó Tamás Biztonságos programozás Puffer túlcsordulásos támadások/ 16

DEP támadás Védekezés a ROP (Ret2CLib) programok ellen Bigyók Szlovénia, ismelen alkotó mu ve Izsó Tamás Biztonságos programozás Puffer túlcsordulásos támadások/ 17

Return Oriented Programing Definíció Gadget olyan gépi utasítássorozat, amely utasítással végződik Keressünk a processz címterében gadget-eket Erre kész alkalmazások vannak A stack tartalmát állítsuk össze úgy, hogy a gadget címeket, és a gadget által pop-pal felvett értékeket tartalmazza Izsó Tamás Biztonságos programozás Puffer túlcsordulásos támadások/ 18

Return Oriented programozás gyakorlása I Illusztráció! Állítsuk elő a 0x00410A00 értéket (0 bytet-ot tartalmazó címet) Stack címe stack értéke stack tartalma ESP ide mutat 00201A10 1003564A cím, ahol a pop eax; utasítások vannak 00201A14 BEFFC8BF adat, amit a pop eax utasítás olvas ki 00201A18 1A56201C cím, ahol a pop edi; utasítások vannak 00201A1C 41414141 adat, amit a pop edi utasítás olvas ki 00201A20 2AE1231B cím, ahol a add eax,edi; pop edx; utasítások vannak 00201A24 DEADBEEF adat, töltelék érték Izsó Tamás Biztonságos programozás Puffer túlcsordulásos támadások/ 19

Return Oriented programozás gyakorlása II A támadó nem ijed meg, ha ROP írása közben nem talál pont megfelelő gadget-et Ha az értékes művelet és a visszatérés között van pár felesleges utasítás, ami nem csinál bajt, akkor azt is felhasználja Megjegyzés A program visszafejtésének megnehezítésére nagy számú felesleges utasításokat illesztenek a kódba A felesleges utasítások a program szemantikáját nem változtatják meg Ezek kiszűrésére fejlesztették ki a program szeletelés módszerét ROP írásnál a kód összezavarása nem cél, de felesleges utasítások bevételével hamarabb célba érhetünk Izsó Tamás Biztonságos programozás Puffer túlcsordulásos támadások/ 20

ROP kód működése 0 ESP gadget1 ptr gadget1 Cím gadget4 ptr gadget3 ptr gadget 2 ptr 8 8 gadget2 gadget3 4 gadget4 main stack ke EIP Max Izsó Tamás Biztonságos programozás Puffer túlcsordulásos támadások/ 21

ROP kód működése 0 Cím ESP gadget1 ptr gadget4 ptr gadget3 ptr gadget 2 ptr EIP 8 8 gadget1 gadget2 gadget3 4 gadget4 main stack ke Max Izsó Tamás Biztonságos programozás Puffer túlcsordulásos támadások/ 21

ROP kód működése 0 Cím ESP gadget1 ptr gadget4 ptr gadget3 ptr gadget 2 ptr EIP 8 8 gadget1 gadget2 gadget3 4 gadget4 main stack ke Max Izsó Tamás Biztonságos programozás Puffer túlcsordulásos támadások/ 21

ROP kód működése 0 Cím ESP gadget1 ptr gadget4 ptr gadget3 ptr gadget 2 ptr EIP 8 8 gadget1 gadget2 gadget3 4 gadget4 main stack ke Max Izsó Tamás Biztonságos programozás Puffer túlcsordulásos támadások/ 21

ROP kód működése 0 gadget1 ptr gadget1 Cím ESP gadget4 ptr gadget3 ptr gadget 2 ptr 8 8 gadget2 gadget3 4 gadget4 main stack ke Max Izsó Tamás Biztonságos programozás Puffer túlcsordulásos támadások/ 21

ROP kód működése 0 gadget1 ptr gadget1 Cím ESP gadget4 ptr gadget3 ptr gadget 2 ptr 8 8 gadget2 gadget3 EIP 4 gadget4 main stack ke Max Izsó Tamás Biztonságos programozás Puffer túlcsordulásos támadások/ 21

ROP kód működése 0 gadget1 ptr gadget1 Cím ESP gadget4 ptr gadget3 ptr gadget 2 ptr 8 8 gadget2 gadget3 main stack ke EIP 4 gadget4 Max Izsó Tamás Biztonságos programozás Puffer túlcsordulásos támadások/ 21

ROP kód működése 0 gadget1 ptr gadget1 Cím ESP gadget4 ptr gadget3 ptr gadget 2 ptr EIP 8 8 gadget2 gadget3 4 gadget4 main stack ke Max Izsó Tamás Biztonságos programozás Puffer túlcsordulásos támadások/ 21

ROP kód működése 0 gadget1 ptr gadget1 Cím ESP gadget4 ptr gadget3 ptr gadget 2 ptr EIP 8 8 gadget2 gadget3 4 gadget4 main stack ke Max Izsó Tamás Biztonságos programozás Puffer túlcsordulásos támadások/ 21

ROP kód működése 0 gadget1 ptr gadget1 Cím ESP gadget4 ptr gadget3 ptr gadget 2 ptr EIP 8 8 4 gadget2 gadget3 gadget4 main stack ke Max Izsó Tamás Biztonságos programozás Puffer túlcsordulásos támadások/ 21

ROP kód működése 0 gadget1 ptr gadget1 Cím ESP gadget4 ptr gadget3 ptr gadget 2 ptr 8 8 gadget2 gadget3 4 gadget4 main stack ke Max Izsó Tamás Biztonságos programozás Puffer túlcsordulásos támadások/ 21

ROP kód működése 0 gadget1 ptr gadget1 Cím ESP gadget4 ptr gadget3 ptr gadget 2 ptr EIP 8 8 4 gadget2 gadget3 gadget4 main stack ke Max Izsó Tamás Biztonságos programozás Puffer túlcsordulásos támadások/ 21

ROP kód működése 0 gadget1 ptr gadget1 Cím ESP gadget4 ptr gadget3 ptr gadget 2 ptr EIP 8 8 4 gadget2 gadget3 gadget4 main stack ke Max Izsó Tamás Biztonságos programozás Puffer túlcsordulásos támadások/ 21

Section 2 Védekezés a ROP (Ret2CLib) programok ellen Izsó Tamás Biztonságos programozás Puffer túlcsordulásos támadások/ 22

ROP program megakadályozása ROP program esetén gadget-eket (-tel végződő utasításokat) hívunk meg Ha a kikeresett gadget címe nem fix, akkor ezt nem tehetjük meg Megoldás Address Space Layout Randomization Izsó Tamás Biztonságos programozás Puffer túlcsordulásos támadások/ 23

Address Space Layout Randomization (ASLR) ASLR esetén minden rendszerindítás után változik a processzek, modulok betöltési címe (image base address), stack kezdetének a címe, heap-en lefoglalt adatok címe Visual Studio esetén a /DYNAMICBASE linker opcióval adhatjuk meg A program áthelyezhetősége miatt tudnunk kell, hogy hol vannak olyan adatok, amelyek függenek a betöltés helyétől Ezt a relokációs tábla írja le Sok program fix címre lett linkelve, így ezek áthelyezése lehetetlen Izsó Tamás Biztonságos programozás Puffer túlcsordulásos támadások/ 24

ASLR működésének korlátai 32 bites cím esetén A program betöltés során a szegmensek laphatáron 4Kbyte (2 12 ) kezdődnek Ezért az alsó 12 bit nem fog változni, ha a szegmens más lapra kerül 32 bites operációs rendszerben ASLR esetén ráadásul csak a felső 16 bit változik véletlenszerűen, az alsó nem A felső címbitekből is csak 8 vesz fel véletlen érték, ami 256 lehetséges esetet jelent Izsó Tamás Biztonságos programozás Puffer túlcsordulásos támadások/ 25

ASLR átverése I 1 Adott a 0x12345678 visszatérési cím 3 0x1234 érték a következő boot esetén változhat, de a 0x5678 nem Ne írjuk át puffer túlcímzéssel a felső cím értékeket Ez megtehetjük, mivel Little-Endian ábrázolásban a cím a memóriában 0x78, 0x56, 0x34, 0x12 alakban követik egymást String puffer esetén a felülírt adatterület a 0x56 byte címen végződjön, ahova a stringet lezáró 0 fog kerülni Felülírt terület a memóriában 0x??, 0x00, 0x34, 0x12 értékeket tartalmazza, ami az Little-Endia ábrázolás miatt a 0x123400?? címet jelenti A kérdőjel helyén akármilyen érték szerepelhet, így 256 különböző címet definiálhatunk Ha ezeken a helyeken van olyan utasítás, amivel a shellcode-unkra ugorhatunk, akkor az ASRL-t átvertük Izsó Tamás Biztonságos programozás Puffer túlcsordulásos támadások/ 26

ASLR átverése II 2 Ha létezik olyan modul (DLL) ami nem /DYNAMICBA- SE opcióval lett készítve, akkor a már megismert, a modul címterében lévő jmp esp-s trükkel meghívhatjuk a shellcode-unkat 3 ASLR és DEP kétségtelenül a legnehezebb, és jelenleg csak szerencsével törhető fel Első ASLR feltörés az animated cursor gyengeségét használta ki (ma már a biztonsági rést befoltozták) Mivel 256 slot lehet az ASLR-rel fordított ntdlldll module címe, ezért nyers erő módszerrel max 256 kurzor létlehozásával törhető volt a rendszer 3 Ez csak 32 bites címre igaz, 64 bitesre nem! Izsó Tamás Biztonságos programozás Puffer túlcsordulásos támadások/ 27

Heap spray Memóriakezelő függvények: VirtualAlloc(), VirtualAllocEx() memória lefoglalás, VirtualFree(), VirtualFreeEx() memória felszabadítás Ezekre a függvényekre épülnek a C standard könyvtári malloc, calloc, realloc, free, függvények is A lefoglalás és a lefoglalt területek egy részének a felszabadítása után a memóriában lyukak keletkeznek A következő memóriafoglalások előbb a lyukakat töltik ki, és csak azután a szűz területeket Megfelelő mennyiségű memóriafoglalás után a bepermetezett terület címe nagy valószínűséggel megmondható Izsó Tamás Biztonságos programozás Puffer túlcsordulásos támadások/ 28

Heap képe permetezés előtt és után Spray előtt Spray után Valószínűsíthető shellcode cím Töredezett memória üres használt nop csúszda + shellcode Izsó Tamás Biztonságos programozás Puffer túlcsordulásos támadások/ 29

Heap permetezésének megvalósítása Azoknál a programoknál lehetséges, ahol script programot lehet futtatni Például: Internet Explorer, FireFox, és a többi böngésző (linuxon is működik) Programozási nyelvük javascript Word for Windows, Excel, PowerPoint Programozási nyelvük Visual Basic, C Acrobat Reader Programozási nyelve javascript Adobe Flash Actionscript stb Izsó Tamás Biztonságos programozás Puffer túlcsordulásos támadások/ 30

Heap permetezésének előnye A heap permetezés a shellcode egyik bevitelének hatékony módja A kód meghívását nem oldja meg, ahhoz valamilyen biztonsági rés megléte is szükséges Előnyök: Safe SEH esetén a heap-en lévő kód futtatható A heap DEP-pel alapból nem védett Az újabb IE esetén már védett, de ROP programhoz továbbra is használható Sok esetben a stack-en nem fér el a shellcode Heap esetén ez a korlát értelemszerűen megszűnik Izsó Tamás Biztonságos programozás Puffer túlcsordulásos támadások/ 31

Érdekes cím 0x0c0c0c0c I Ez már a heap magasabb címtartományába fekszik, mégis van egy kis előnye oda helyezni a shellcode-ot Nézzük meg hogyan működik objektum orientált kódnál a virtuális függvény meghívása 1 Objektum címének a felvétele 2 Objektum elejéről a virtuális függvénytábla címének a kiolvasása 3 A virtuális függvénytáblában lévő valamelyik függvény címének a kiolvasása (Az egyszerűség kedvéért a virtuális függvénytáblát tekinthetjük egy függvényre mutató pointereket tartalmazó tömbnek) 4 Virtuális függvény meghívása Izsó Tamás Biztonságos programozás Puffer túlcsordulásos támadások/ 32

Érdekes cím 0x0c0c0c0c II Bepermetezzük a 0x0c0c0c0c címen lévő heap területet is nop csúszda 0x90 helyett is 0x0c-t írunk 0x0c0c az or al,0c utasítás kódja Felülírjuk az objektum címét 0x0c0c0c0c-vel, akkor azon a helyen keresi a virtuális függvénytáblára mutató pointert ahonnan felveszi a virtuális függvénytábla címét, ami persze 0x0c0c0c0c amely helyről kiolvassa a virtuális függvényre mutató pointert, ami szintén 0x0c0c0c0c A végén meghívja a 0x0c0c0c0c címen lévő kódot, aminek a tartalma 0x0c0c ami nop csúszdának is megfelel Mi van, ha az objektumban lévő virtuális függvénytáblára mutató pointert írjuk felül? Ugyanez történik eggyel kevesebb indirekcióval Izsó Tamás Biztonságos programozás Puffer túlcsordulásos támadások/ 33