Kääntäjätekniikka
Luento 21 (1.6.2017)
Viimeinen luento!
Muutoksia kurssiaikatauluun
- Ohjauksia kesäkuussa maanantaisin ja perjantaisin aina 19.6. asti
- Ohjauksia jatketaan elokuussa maanantaisin klo 12
- pääsääntöisesti tilassa AgC418.1 (TIE-neukkari)
- viimeinen tilaisuus 28.8. (harjoitustöiden esittely) salissa AgC233.
- Harjoitustyön viimeinen palautuspäivä siirretty 29.8.2017 klo 9:00
- Inkrementtideadlineja siirretty:
- Kohdekielen generointi (naivi rekisteriallokaatio) valmis [tai muita ominaisuuksia 1 op:n arvosta lisää] (19.6.2017)
- Fiksu rekisteriallokaatio valmis [tai muita ominaisuuksia 1 op:n arvosta lisää] (14.8.2017)
- Koko työ viimeistelty ja valmis tarkastettavaksi (28.8.2017)
Tentti
Ks. tenttiohje
Ville alkaa
Piirretään taululle. Tässä avainsanalistaa
Avainsanalista:
- Nykyskenario:
- Monet uudet kielet ovat DSL:iä, skriptikieliä
- Ajetaan usein sandboxissa (Selain?)
- Kääntäjäsi käyttäjä onkin hyökkääjä
- (Ja muutenkaan et voi luottaa koodariin..)
- Mitä hyökkääjä haluaa:
- Hallita EIP rekisteriä
- Syöttää ohjelmaan ajettavaa koodia (ilman rajoituksia)
- Muistiturvallisuus & Ylivuodot
- Muistiturvallisuus on pakollinen ohjelmointikielen ominaisuus.
- Old-Skool stack smashing (Vs. DEP)
- Stack canary
- Non-executable stack
- Kirjoita ⇒ ¬suorita
- Return-to-libc
- ROP + Gadgetit
- Interlude: Miksi ei voi luottaa siihen, että EIP on turvassa? Koska C.
- Vastaisku: Address-space-layout-randomization
- Linux + 1 offset
- Vastaiskunvastaisku 1: Muistinpaljastus (Memory disclosure)
- 1 offsetin ASLR, jos löydät yhden tunnetun osoittimen, "kaik mänt"
- Linuxin fork ei satunnaista uudestaan:
- Hypitään ja hypitään, kunnes löydetään sopivat gadgetit / järjestelmäkutsut
- Riittää löytää Pop+Ret + sleep/pause/tjsp. Näillä voi etsiä kaikki tarvittavat gadgetit
- Voisitko vaan laittaa jokaisen basic blockin uuteen osoitteeseen kun ajetaan?
- Ns. Fine-grained ASLR
- Ts. Jos koodi on tarpeeksi sekaisin, on tosi vaikea tietää minne hypätä, erityisesti kun pinoon ei saa.
- Myös: Aina pitää onnistua hyppäämään shellcoden ekaan käskyyn, että se tekee mitä haluttiin.
- HEAP-Spray: Hypätään kekoon?
- Muistinhallinta toimii ennakoitavasti (Ekana varataan alusta, isot palat menee loppuun, varaukset ovat sopivasti jaollisia jne.)
- Apuna NOP-sled (Tyhjiä käskyjä muutama mega ja sitten koodi)
- HEAP-Spray - täytetään keko nop-sled+shellcode yhdistelmillä ja "hypätään tuntemattomaan"
- Heap Feng Shui!
- Varaamalla riittävän isoja muistialueita, voi olla melko varma, että ne päätyvät osoitteisiin > 0x80000000. Täällä ei ole usein mitään mikä fragmentoisi muistia niin hakkeri saa varattua yhtenäistä muistia osoitteen 0xDEADBEEF liepeille
ASLR:n kiertäminen
- Hyökkääjä haluaa selvittää keko-objektien sijainteja ohjelman ollessa käynnissä.
- Koska sellaisessa voi olla shellcodea, jonne olisi kiva osoittaa EIP:llä
- Lyhyt esimerkki siitä, miten esim. ActionScript (aka. Flash) auttaa tässä.
ASLR + DEP
- Vaikea yhdistelmä sekä hakkerille että Just-In-Time kääntäjän tekijälle
- Jos käännät koodia lennosta, joudut sekä kirjoittamaan muistialueelle, että hyppäämään sinne
- Ts. Shellcode onnistuu taas.
- Idea: Huijataan JIT kääntämään kiltin ohjelman mukana shellcode
JIT-SPRAY
Tehdään Javascriptissä / Actionscriptissä näin:
var y = ( 0x3c54d0d9 ^ 0x3c909058 ^ 0x3c59f46a ^ 0x3c90c801 ^ 0x3c9030d9 ^ 0x3c53535b ^ ...
JIT tuottaa tälläisen:
03470069 B8 D9D0543C MOV EAX,3C54D0D9
0347006E 35 5890903C XOR EAX,3C909058
03470073 35 6AF4593C XOR EAX,3C59F46A
03470078 35 01C8903C XOR EAX,3C90C801
0347007D 35 D930903C XOR EAX,3C9030D9
03470082 35 5B53533C XOR EAX,3C53535B
...
Kyssäri Mitä on osoitteessa 0347006A?
Kamala totuus: X86 ja ARM voivat hypätä keskelle käskyä
0347006A D9D0 FNOP
0347006C 54 PUSH ESP
0347006D 3C 35 CMP AL,35
0347006F 58 POP EAX
03470070 90 NOP
03470071 90 NOP
03470072 3C 35 CMP AL,35
03470074 6A F4 PUSH -0C
03470076 59 POP ECX
03470077 3C 35 CMP AL,35
03470079 01C8 ADD EAX,ECX
0347007B 90 NOP
0347007C 3C 35 CMP AL,35
0347007E D930 FSTENV DS:[EAX]
... Tässä luetaan EIP:n arvo
Yhteenvetona
- Tee muistiturvallinen kieli, mutta älä usko, että onnistut
- Satunnaistus + DEP on hyvä.
- Kääntäjän luomista rakenteista (Pino, muistinhallinta yms.) ei saa vuotaa tietoa ohjelman ulkopuolelle
- Yksityiskohdat purevat
Ville päättyy
Materiaalilinkkejä
Muistinsiivous / garbage collection
- Villen luento viime kurssilta (luentotaltiointi)
- AJK:n luentokalvot vuodelta 2009
- AJK:n kandityö vuodelta 2001
- Mikko Niemisen pro gradu vuodelta 2004
- Richard Jones & Rafael Lins: Garbage Collection: Algorithms for Dynamic Memory Management. Chichester: Wiley, 1996. JYKDOK
- Richard Jones, Antony Hosking & Eliot Moss: The Garbage Collection Handbook: The Art of Automatic Memory Management. Boca Raton: CRC, 2012. JYKDOK
Optimointi
- kalvot vuoden 2009 kurssilta
- oppikirjoissa tarkemmin
Lähteitä tutkimuksen seuraamiseen
These are the current permissions for this document; please modify if needed. You can always modify these permissions from the manage page.