Software Reverse Engineering Jacco Krijnen
Opbouw
Inleiding en definitie Techniek
Toepassingen
Assemblers/Disassemblers Compilers/Decompilers 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
Columbia Data Products, 1982
Populaire pc’s Nog weinig standaarden op het gebied van hardware
Maakte eerste IBM “compatible” IBM’s BIOS reverse engineered
Clean room design
Clean room design
Team 1
Team 2
bestudeert originele software (RE) stelt specificaties op 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
High level (hoge mate van abstractie)
C#/Python/Haskell … C, Fortran, COBOL … Assembly Machinecode 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(); …
ebx
0x00314159 0x00123123
edx
0x00141421 ⋮ 0x0000002A ⋮
0x00404404 0x00123456
… jmp 0x0000002A …
… mov eax, opaqueExpr jmp [ebx + eax] …
Tot slot
Reversing: Secrets of Reverse Engineering