Buffer Overflow und Return Oriented Programming

Matthias Hanreich - TheGreyKnight








Grundlagen Code Injection
Beispiel: Buffer Overflow
Gegenmaßnahmen Code Injection
Return Oriented Programming (ROP)
Gegenmaßnahmen ROP
Demonstration CVE-2012-4969
Hands On: ROP-Challenge
Aktueller Forschungsstand




Einschleusen von fremdem Programmcode
um Verhalten von Software zu ändern
Ausnutzen von Programmier- oder
Designfehlern (auch Hardware)
Wird zur Laufzeit ausgeführt
Manipulierte Dateien (PDFs, Webseiten, Word
Dokumente, MP3s… )

Installation von Hintertüren

System Hijacking (Metasploit Reverse Session)

Privilege Escalation (Jailbreak)

Temporäre Manipulation





schreibbarer Speicherbereich + zugreifbare
Speicheradresse
Nicht initialisierter Speicher
Buffer/Heap/Stack Overflow
Dangling Pointer (Use-After-Free)
Memory leaks

Open root-shell on linux
0x1000ffff
0xAAAAAAAA
StackFrame Main
char* input
0x1000bbaa
0x1000aaaa
Input = 100 x A
AAAAAAAAAAA
…
AAAAAAAAAAA
Return Adresse
AAAAAAAAAAA
Saved ESP
AAAAAAAAAAA
Buffer[80]
AAAAAAAA
…
Parameter von foo
Lokale Variablen
von foo
0x1000ffff
StackFrame Main
char* input
…
Parameter von foo
Return
Adresse
0x100bbaa
Saved ESP
Padding
0x1000bbaa
Buffer[80]
Exploit Code
0x1000aaaa
Input = „Exploit Code + Padding
+ Jump Address“
…
Lokale Variablen
Von foo

Buffer Overflow:
◦
◦
◦
◦
◦

Vermeidung von Programmierfehlern (haha!)
Typsichere Sprachen
Überprüfung der Buffergrenzen (fgets)
Canary
Kopie der Return Adresse
Code Injection:
◦ Control Flow Integrity (CFI)
◦ Data Execution Prevention (DEP)
0x1000ffff
StackFrame Main
char* input
…
Parameter von foo
Return Adresse
Saved ESP
Zusätzlicher Speicherbereich
mit zufällig gewählter Größe
Canary
exploit code
Buffer[80]
0x1000aaaa
…
Lokale Variablen
von foo
0x1000ffff
StackFrame Main
char* input
…
Parameter von foo
Return Address
Saved ESP
exploit code
Buffer[80]
0x1000aaaa
Kopierte Return Adr
Lokale Variablen
von foo
main()
foo()
foo2()

foo3()
foo4()
Bei Abweichung vom Control Flow: Abbruch




Synonyme: NX-Bit, XD-Bit, W+X protection
Speicherseite bekommt zusätzlichen Flag
„ausführbar“
Ziel: Code soll entweder nur
geschrieben/gelesen oder nur ausgeführt
werden
Injected Code wird nicht ausgeführt
Virtual Address Space
Page 1
0x10000000
Page 2
Page 3
…
0xffffffff
Physical Memory
32bit Architektur nur mit Physical Address Extention




Verwendung von bereits existierendem
Programmcode
Verkettung von Speicheraddressen (ROP-Chain)
Turing-complete (theoretisch jedes
Programmverhalten abbildbar)
Shacham 2008: When good instructions go bad:
Generalizing return-oriented programming to
RISC


„ge-ROP-te“ Plattformen:
Intel x86, SPARC, PowerPC, ARM, Z80
Return-to-LibC: Verkettung von Funktionen
aus LibC

Generalized ROP: Verkettung von Assembler
Instruktionen

Reverse Engineering zum finden von GadgetAddressen
LibC
ROP Chain
…
Gadget 3
Gadget 2
Gadget 1
Function 3
0x2b4ac89e
0x2b4acd62
0x2b4a334f
retn
retn
Function 2
Function 1
Random Library
ROP Chain
Gadget 3
0x66666667
Gadget 2
Gadget 1
call EBX
retn
0x2b4ac89e
retn
0x2b4acd62
0x2b4a334f
retn
pop EBX
retn
xchg EAX, ESP
retn

Code Injection + Code Reuse
Memory Page
RW
X
Exploit
ROP Chain
Exploit Code

Address Space Layout Randomization (ASLR)

Trampolining

Control Flow Integrity

Heuristiken, Forward Simulation

Überwachung kritischen Funktionen:
Register Value Checking (z.b. ESP im
Speicherbereich des aktuellen Threads)


Verschleierung der Basisaddressen von
Libraries, Heap, Stack
Fine Grained ASLR: Randomisierung von
Funktionsadressen

Libraries werden zu BlackBoxen

Nur Trampolin-Funktion nach außen sichtbar

Trampolin-Funktion leitet Funktionsaufruf innerhalb
der Library weiter
LibC
Trampolin

Microsoft EMET

ROPGuard

ROPecker

kBouncer

CFI for COTS binaries

Sicherheitslücke in Internet Explorer 6 – 9

System Hijacking möglich


Use-After-Free
Heap Spray
◦ ROP Chain
◦ Exploit Code (Metasploit Reverse Session)
CMshtmlEd
CMshtmlEd
CMshtmlEd
CMshtmlEd
CMshtmlEd
CMshtmlEd
CMshtmlEd
CMshtmlEd
CMshtmlEd
Exploit
CMshtmlEd
Code
<body onselect=„TestArray()“>
document.execCommand(“selectAll”)
document.write(“L”)
parent.ARRR[L].src = „Exploit Code“
CMshtmlEd::Exec
Heap
0x8fffffff
NOPs
Exploit Code
NOPs
Exploit Code
NOPs
Exploit Code
NOPs
Exploit Code
NOPs
0x80000000
Exploit Code
NOP-Sled
Payload
0x8fffcccc
NOPs
ROP Code
Metasploit
Reverse
Session
0x8fffaaaa
Exploit Code
RW
Memory Page of Heap
Internet Explorer
NOPs
ROP Code
Redirect
Code
CMshtmlEd
CMshtmlEd::Exec
EAX = 0x0C0C0C0C
call EAX + 8
Metasploit
Reverse
Session
X

Demonstration

defcon 2015 Quals: r0pbaby
◦ https://www.dropbox.com/sh/jl00jd4u51ek72l/AA
DP5y-atHs-6eJF2-jDzFNsa?dl=0

picoCTF 2014: Hardcore ROP
◦ https://github.com/ubuntor/picoctf-2014writeups/tree/master/hardcore_rop


ROP immer noch ein Problem – viele
vorgestellten Gegenmaßnahmen/Tools
wurden gebrochen
ASLR / CFI sind aktuelle Forschungsthemen



FuzzySecurity
http://www.fuzzysecurity.com/tutorials/expDev/7.ht
ml
Corelian
◦ https://www.corelan.be/index.php/2010/06/16/ex
ploit-writing-tutorial-part-10-chaining-dep-withrop-the-rubikstm-cube/




Shacham 2008: When good instructions go bad:
Generalizing return-oriented programming to RISC
Davi, Lehman 2014: Stitching the Gadgets: On the
Ineffectiveness of Coarse-Grained Control-Flow
Integrity Protection
Davi, Liebchen 2015: Isomeron: Code Randomization
Resilient to (Just-In-Time) Return-Oriented
Programming
Arias, Davi, Hanreich 2015: HAFIX: HardwareAssisted Flow Integrity Extension