Software Reverse Engineering Jacco Krijnen
Opbouw Inleiding en definitie Techniek Assemblers/Disassemblers Compilers/Decompilers Toepassingen Security Overige Softwarebeveiliging Piracy Anti RE technieken
Definities Reverse Engineering is the process of extracting the knowledge or design blueprints from anything man-made. Software Reverse Engineering
Clean room design IBM, 1981 Populaire pc s Nog weinig standaarden op het gebied van hardware Columbia Data Products, 1982 Maakte eerste IBM compatible IBM s BIOS reverse engineered Clean room design
Clean room design Team 1 bestudeert originele software (RE) stelt specificaties op Team 2 Implementeert de specificatie van team 1 Het principe is gebaseerd op het feit dat team 2 geen kennis heeft van de code. Effectief tegen copyright bescherming, niet tegen patent
Clean room design BIOS Huidige software Reverse engineeren van compleet software pakket vaak niet zinvol (te veel moeite) Soms wel bepaalde onderdelen.doc formaat in openoffice/libreoffice
Techniek
Abstractieniveaus programmeertalen C#/Python/Haskell C, Fortran, COBOL Assembly Machinecode High level (hoge mate van abstractie) Low level (lage mate van abstractie)
Abstractielagen in programmeertalen Compiler High level (hoge mate van abstractie) Low level (lage mate van abstractie)
Abstractielagen in programmeertalen High level (hoge mate van abstractie) Decompiler (!?) Low level (lage mate van abstractie)
Compiler Commentaar en documentatie worden verwijderd Optimalisaties (programmatransformaties) Machinecode kent geen identifiers (variabelenamen, functienamen) en geen typesysteem Compiling is Lossy Many to many Compleet herstel van sourcecode bijna altijd onmogelijk
Machine Language Machine language instructionset: een verzameling opcodes van b bytes architectuur specifiek Intel x86 00110001 ( ) 00001111 (Pop 32 bits van de stack) http://download.intel.com/products/processor/manual/325462.pdf
Hexeditors
Assemblers/Disassemblers Assembly language Verzameling mnemoics die 1 op 1 corresponderen met een specifieke machinetaal Intel x86 xor ( ) pop (Pop 32 bits van de stack) Assembler: Assembly Machinecode Disassembler: Machinecode Assembly Wat is code, wat is data?
Decompiler Disassembler helpt, maar assembly is nog zeer low-level Een decompiler bestaat net als compiler uit aantal vaste stappen Parser/Loader Disassembler Disassembly naar Intermediate Representation Program analysis Code generation
Decompiler Programma-analyse mov eax,[ebx+0x04] add eax,[ebx+0x08] sub [ebx+0x0c],eax eax = m[ebx+0x04]; eax += m[ebx+0x08]; m[ebx+0x0c] -= eax; eax = m[ebx+0x04] + m[ebx+0x08]; m[ebx+0x0c] -= eax; m[ebx+0x0c] -= m[ebx+0x04] + m[ebx+0x08]; x.a -= x.b + x.c; Voorbeeld naar http://en.wikipedia.org/wiki/decompiler
Decompiler Control flow jmp naar functieaanroep, while of for. Type analyse Primitieve types af te leiden uit opcodes Structs af te leiden uit memory gebruik
Decompiler Aantal C decompilers bekend Java en C# (.NET) Java Bytecode/MSIL
Toepassingen
Toepassingen Malware detectie en analyse Software lekken Cryptografie (Software engineering)
Malicious software Static/dynamic analysis Bescherming Static: Code obfuscation, watermarking Dynamic: Packing, antidebugger
Malicious software en lekken Malware wil Verspreiden Infecteren Java (april 2013)
RE in Cryptografie Kerckhoffs principe Hoe te kraken? Reverse engineering! Maak een lijst met magic constants AES: segment van de S-Box Doorzoek machinecode met hexeditor, of debugger (IDA pro)
RE in Cryptografie Implementatiefouten Cisco IOS (2013) MS Windows 2000 PRNG (2007) Plaintext wordt niet verwijderd na encryptie Wachtwoord blijft in geheugen UI Gebruik bekende implementaties! http://www.moserware.com/2009/09/s tick-figure-guide-to-advanced.html
Softwarebeveiliging
Piracy Digitale content is heel makkelijk te verplaatsen dupliceren Software piracy het onbevoegd gebruik maken, kopieren of verkopen van software
Serial numbers Komen samen met de software geleverd Worden gevalideerd met geheim algoritme Problemen Keys kunnen gedeeld worden Reverse engineering keygenerators Starcraft 1 Checksum algoritme
Packing (malware) Packing is het versleutelen of comprimeren van een groot gedeelte van de machinecode. Voornamelijk bij malware Hindert statische analyse Wat te doen met de key?
Anti debugger (malware) Detecteer dat een debugger attached is IsDebuggerPresent Windows API Code checksums Sterke combinatie met packing Eventueel false positives
Code obfuscation Obfuscator past code aan zodat Transparant voor de processor Onleesbaar voor reverse engineer Resilient Potency
Code obfuscation Een opaque predicate is een boolean expressie die runtime moet worden geevalueerd, maar reduceert tot een constante waarde Bekend bij de programmeur // nuttige code if(x + 1 == x + 2 1) { // nuttige code } else { // junk code }
Jump table spoofing Een jump table is een array met pointers naar mogelijke vervolg executiepaden low level implementatie van branching (if-then-else, switch) Aanpak Neem het adres van een normale jmp (bv een functieaanroep) Stel een tabel op met spookadressen samen met het echte adres Gebruik een opaque expression die evalueert naar de juiste index van de tabel
Jump table spoofing initializeimportant(); jmp 0x0000002A edx ebx 0x00314159 0x00123123 0x00141421 mov eax, opaqueexpr jmp [ebx + eax] 0x0000002A 0x00404404 0x00123456
Tot slot Reversing: Secrets of Reverse Engineering