Szoftverek obfuszkációja Kócsó Balázs Budapesti M szaki és Gazdaságtudományi Egyetem 2014. november 24.
Tartalom Bevezetés: alapfogalmak Anti-reversing Obfuszkáció Deobfuszkáció Obfuszkációs technikák Példák Felületes obfuszkáció (Surface obfuscation) Mély obfuszkáció (Deep obfuscation) Deobfuszkáció kitekintés Összefoglalás Kócsó Balázs (BME) Obfuszkáció 2014. november 24. 2 / 28
Anti-reversing technológiák Céljuk, hogy megnehezítsék a programot vizsgálót abban, hogy megértse annak pontos bels m ködését, illetve hogy automatikus eszközökkel vissza tudja fejteni annak forráskódját. Anti-debug techinikák: Debuggerek detektálása Töréspontok detektálása Operációs rendszer függ m ködés Disassemblerek összezavarása Packerek vagy wrapperek használata Obfuszkáció Virtualizáció Ezen technológiák között nehéz az éles határokat meghúzni, ugyanis legtöbbször együtt, egymást támogatva jelennek meg. Kócsó Balázs (BME) Obfuszkáció 2014. november 24. 3 / 28
Obfuszkáció Anti-reversing Fogalma: A kommunikáció szándékos elrejtése azért, hogy a kívülállók számára zavaros, kétértelm vagy nehezen érthet legyen. Szoftverek esetében ezt a kiadott binárisra tudjuk értelmezni, azaz minél nehezebben lehessen megérteni annak pontos m ködését úgy, hogy a program helyesen m ködik. Felhasználása: Illegális szoftvermásolás megakadályozása Értékes algoritmusok védelme Megnehezíteni a támadók számára a kód megértését és visszafejtését Kártékony kódok elrejtése, polimorzmusa "Célja": A deobfuszkáció megakadályozása. Kócsó Balázs (BME) Obfuszkáció 2014. november 24. 4 / 28
Deobfuszkáció Anti-anti-reversing Fogalma: Az obfuszkált kommunikáció visszafejtése olyan formába, mely mindenki számára érthet és egyértelm. Szoftverek esetében ezt az obfuszkált kód vagy bináris visszaállítására tudjuk értelmezni, hogy az az eredetihez hasonló érthet formában elérhet legyen, mint az obfuszkáció el tt. Felhasználása: Obfuszkált kódok visszaállítása, megértése Kártékony kódok analizálása és felismerése "Célja": Az obfuszkációs technológiák kijátszása. Kócsó Balázs (BME) Obfuszkáció 2014. november 24. 5 / 28
Felületes és mély obfuszkáció összehasonlítása Felületes (surfer): szintaktika alapú nem szükséges érteni hozzá a program funkcióit egyszer bizonyos esetekben nagyon jó megoldást nyújt könnyen általánosítható és automatizálható Mély (deep): szemantika alapú a program funkcióinak átalakítása komplex vannak lehet ségek, amikre már a felületes obfuszkáció nem nyújt megoldást nehezen általánosítható, specikus megoldások Kócsó Balázs (BME) Obfuszkáció 2014. november 24. 6 / 28
Obfuszkációs technikák áttekintése Egyszer Adat- és konstansobfuszkáció Ugrási láncok használata Felesleges kód beillesztés Utasítási sorok felcserélése, szétszórt számítások Gyenge Komplex Átlátszatlan feltételek (Opaque predicates) Kód párhuzamosítás Vezérlési-gráf lapítása (Control-ow attening) Önmódosító kódok Virtuális gépek... Hatásos Kócsó Balázs (BME) Obfuszkáció 2014. november 24. 7 / 28
Adatobfuszkáció A programban lév adatok (szövegek vagy számok) sok információt nyújtanak a kódrészek beazonosításához, ezért próbáljuk meg ket elrejteni valahogy. Többféle módszer létezik: El zetesen letárolt értékek védelme, hogy ne lehessen rájuk könnyen keresni egyszer rejtjelezések XOR-olás Szövegtároló tömbök átszervezése Szövegtömbök összevonása és szétszedése Szövegtároló konténerek számának növelése Elemek permutációja Kócsó Balázs (BME) Obfuszkáció 2014. november 24. 8 / 28
Adatobfuszkáció, példa Boolean típusú adatok obfuszkációja Egy adatobfuszkációs technika a változók hasítása (variable splitting). A V boolean változót széthasítjuk p és q integer változóvá a jobb oldalon látható táblázat alapján. Az f() függvény segítségével elkészítjük a beépített boolean típusnak egy másik reprezentációját. g(v ) f(p, q) p q V 2p + q 0 0 Hamis 0 0 1 Igaz 1 1 0 Igaz 2 1 1 Hamis 3 Kócsó Balázs (BME) Obfuszkáció 2014. november 24. 9 / 28
Konstans obfuszkáció A konstansok védelme egyszer bb, ugyanis azok nem módosítják értéküket a program futása során. Ha a konstansok pontos értékére nincs szükségünk, tehát ha csak egyenl illetve nem egyenl vizsgálatokat végzünk rajtuk, akkor a hashelés nagyon hatásos módszer. Például: if (x == 42) {...} helyett használjuk if ( hash (x) == 0 x50a2fabfdd276f573ff97ace8b11c5f4 ) {...} A helyes m ködés egyetlen feltétele csak az ütközésmentesség. A hash függvények egyirányúsága miatt az eredeti érték kitalálása legfeljebb csak a program további analízisével lehetséges. Kócsó Balázs (BME) Obfuszkáció 2014. november 24. 10 / 28
Kódobfuszkáció A kódobfuszkáció hatásos módszer a bels m ködés megfejtésének megnehezítésére. Nagyon sokféle lehet ség ennek megvalósítására, de vajon hol érdemes ezt csinálni? 1 Magasabb szint nyelvek forráskódjában? 2 Hardver közeli nyelvek forráskódjában? Kócsó Balázs (BME) Obfuszkáció 2014. november 24. 11 / 28
Kódobfuszkáció A kódobfuszkáció hatásos módszer a bels m ködés megfejtésének megnehezítésére. Nagyon sokféle lehet ség ennek megvalósítására, de vajon hol érdemes ezt csinálni? 1 Magasabb szint nyelvek forráskódjában? 2 Hardver közeli nyelvek forráskódjában? A magasabb szint nyelvek fordítói nagyon sok alkalmazott trükköt kioptimalizálnának, ezért a kódobfuszkációt az alacsony szint (assemblyhez hasonló) nyelven szokták elvégezni. Kócsó Balázs (BME) Obfuszkáció 2014. november 24. 11 / 28
Kódobfuszkáció, példa Egy utasítás helyettesítése több utasítással: Eredeti kód mov esi, 0x0 mov edx, 0x12340000 Obfuszkált kód mov esi, 0x1 dec esi mov edx, 0x12347891 xor dx, dx Kócsó Balázs (BME) Obfuszkáció 2014. november 24. 12 / 28
Kódobfuszkáció, példa Felesleges kódrészek beszúrása: Eredeti kód... mov edx, 0x5555 Obfuszkált kód mov edx, 0x30... mov edx, 0x5555 Kócsó Balázs (BME) Obfuszkáció 2014. november 24. 13 / 28
Kódobfuszkáció, példa NOP-szer kódok beszúrása Eredeti kód mov edx, 0x2014 Obfuszkált kód mov edi, edi mov edx, 0x2014 xchg cx, cx Kócsó Balázs (BME) Obfuszkáció 2014. november 24. 14 / 28
Kódobfuszkáció, példa Elérhetetlen kód beszúrása Eredeti kód mov esi, 0x0 and eax, ebx Obfuszkált kód mov esi, 0x0 jmp _label elérhetetlen kód... _label and eax, ebx Kócsó Balázs (BME) Obfuszkáció 2014. november 24. 15 / 28
Kódobfuszkáció, példa Elágazás beszúrása a következ utasításra Eredeti kód mov esi, 0x0 and edx, 0x012340000 Obfuszkált kód mov esi, 0x0 jmp _label _label and edx, 0x012340000 Kócsó Balázs (BME) Obfuszkáció 2014. november 24. 16 / 28
Kódobfuszkáció, példa Utasítások felcserélése Eredeti kód mov esi, 0x1 dec esi and edx, 0x012347891 Obfuszkált kód mov esi, 0x1 and edx, 0x012347891 dec esi Kócsó Balázs (BME) Obfuszkáció 2014. november 24. 17 / 28
Átlátszatlan feltételek (Opaque predicates) Olyan elágazás-feltételek, melyek mindig igazra vagy hamisra értékel dnek ki, de ezt nehéz belátni a visszafejtett programot vizsgálva. Például: if ( (x + x ^ 2) % 2 == 0) {... /* mindig igaz */ } A hatásossága nagyban függ a választott feltételek bonyolultságától és sokszín ségét l Használhatóak platformfügg specikus értékek is. (Ezekben az esetekben kérdéses lehet a kompatibilitás.) Hatásos a statikus analízissel szemben és viszonylag könny elkészíteni, ezért kedvelt technika. Ennek használatával a vezérlésfolyam bonyolítható. Kócsó Balázs (BME) Obfuszkáció 2014. november 24. 18 / 28
Vezérlési-gráf lapítása (Control-ow attening) Minden programhoz készíthet egy vezérlési gráf, hogy mi után mi következik. Általánosságban van egy f függvény (main), amely mindent vezérel és abból történnek még további függvényhívások. A párhuzamos futás megnehezíti az analízist, ugyanis nem tudhatjuk, hogy el ször milyen irányba kell indulni a vizsgálat során. A vezérlési-gráf lapításnak ez az alapötlete. M ködése: 1 a nagy blokkokat törjük szét sok kis blokkra 2 válasszunk egy ún. menetirányítót, akinek az értéke mindig az el z blokk futásától függ 3 így egy nagy blokkból készítettünk egy pontra mindig visszatér sok kis blokkot, melynek megfejtése sokkal több id t vesz igénybe, mint ha szekvenciálisan tudnánk azt olvasni Természetesen az összetartozó blokkokat érdemes mind helyileg, mind a menetirányító logikája szerint elszeparálni. Kócsó Balázs (BME) Obfuszkáció 2014. november 24. 19 / 28
Vezérlési-gráf lapítása (Control-ow attening) A példakód és a vezérélési gráfja: int f( int i, int j) { int a = 1; if (i < j) { a = j; } else do { a *= i - -; } while (i > 0); return a; } Kócsó Balázs (BME) Obfuszkáció 2014. november 24. 20 / 28
Vezérlési-gráf lapítása (Control-ow attening) Az obfuszkált vezérlési gráf: Kócsó Balázs (BME) Obfuszkáció 2014. november 24. 21 / 28
Vezérlési-gráf lapítása (Control-ow attening) Példa menetirányító logikai szeparációjára: Kócsó Balázs (BME) Obfuszkáció 2014. november 24. 22 / 28
Obfuszkációs technikák És ezek tetsz leges kombinációja! Kócsó Balázs (BME) Obfuszkáció 2014. november 24. 23 / 28
Kitekintés: deobfuszkáció típusai Statikus: szintaxis-alapú egyszer bb és gyorsabb nem szükséges a kód futtatása bizonyos esetekben nagyon jó megoldást nyújt különösen hasznos lehet kártékony kódok esetében, ha m ködik Dinamikus: szemantika alapú komplexebb és id igényesebb szükséges lehet a kód futtatása a funkciók megértéséhez (kátékony kódok?) többre képest, mint a statikus obfuszkáció nagyon sok esetben csak ezzel lehet sikereket elérni Kócsó Balázs (BME) Obfuszkáció 2014. november 24. 24 / 28
Összefoglalás: Obfuszkáció vs. Deobfuszkáció Folyamatos versengés Újabb technikák az egyik oldalon újabb technikák a másik oldalon is A szemantikus módszerek egyre nagyobb teret nyernek Kártékony kódoknál fontos lehet, hogy csak statikus eszközökkel ne lehessen felismerni azokat Kócsó Balázs (BME) Obfuszkáció 2014. november 24. 25 / 28
Összefoglalás: Obfuszkáció Nincs tökéletes megoldás Aktív kutatási terület, de kevés az általános megoldás, inkább csak speciális házi megoldások a jellemz ek Kutatások folynak a kriptográai alapokkal megtámogatott obfuszkáció irányába: jelenleg az obfuszkáció csak nehezítés, a visszafejtés id igényét és költségét növelhetjük szükség lenne valamilyen matematikai bizonyosságra adott obfuszkációs technológiához tartozó deobfuszkáció visszavezetése valamilyen ismerten nehéz matematikai problémára mindezt úgy, hogy a program mérete és futásideje ne n jön jelent s mértékben Kócsó Balázs (BME) Obfuszkáció 2014. november 24. 26 / 28
Köszönöm a gyelmet! Kérdések? Kócsó Balázs (BME) Obfuszkáció 2014. november 24. 27 / 28
Felhasznált források Sharath K. Udupa Saumya K. Debray, Matias Madou (2005) Deobfuscation Christian S. Collberg,Member, IEEE Computer Society, Clark Thomborson (2002) Watermarking, Tamper-Proong, and Obfuscation Nguyen Anh Quynh (2013) Machine Code Deobfuscation for Malware Analysis Sebastian Porst, Christian Ketterer (2009) Automated static deobfuscation in the context of Reverse Engineering Bene Máté (2014) Anti-debug technikák kártékony kódokban Kurucsai István (2013) Deobfuscation of obfuscated software Kócsó Balázs (BME) Obfuszkáció 2014. november 24. 28 / 28