Lecture 10 – Return-oriented programming
Stephen Checkoway University of Illinois at Chicago Based on slides by Bailey, Brumley, and Miller
Lecture 10 Return-oriented programming Stephen Checkoway - - PowerPoint PPT Presentation
Lecture 10 Return-oriented programming Stephen Checkoway University of Illinois at Chicago Based on slides by Bailey, Brumley, and Miller ROP Overview Idea: We forge shellcode out of existing application logic gadgets Requirements:
Stephen Checkoway University of Illinois at Chicago Based on slides by Bailey, Brumley, and Miller
vulnerability + gadgets + some unrandomized code
2
3
Image by Dino Dai Zovi
* Forming gadgets is mostly useful when constructing complicated return-oriented shellcode by hand
4
6
... v2 ... v1 a1: mov eax, [esp] a2: mov ebx, [esp+8] a3: mov [ebx], eax Implementation 1
7
Desired Logic Stack
Mem[v2] = v1
esp
8
Desired Logic a5 v2 a3 v1 Stack
Mem[v2] = v1
a1: pop eax; a2: ret a3: pop ebx; a4: ret a5: mov [ebx], eax
Implementation 2
Suppose a5 and a3 on stack
esp
eax ebx eip v1 a1
9
Desired Logic a5 v2 a3 v1 Stack
Mem[v2] = v1
a1: pop eax; a2: ret a3: pop ebx; a4: ret a5: mov [ebx], eax
Implementation 2
esp
eax ebx eip v1 a1 a3
10
Desired Logic a5 v2 a3 v1 Stack
Mem[v2] = v1
a1: pop eax; a2: ret a3: pop ebx; a4: ret a5: mov [ebx], eax
Implementation 2
esp
eax ebx eip v1 a3 v2
11
Desired Logic a5 v2 a3 v1 Stack
Mem[v2] = v1
a1: pop eax; a2: ret a3: pop ebx; a4: ret a5: mov [ebx], eax
Implementation 2
esp
eax ebx eip v1 a4 a5 v2
12
Desired Logic a5 v2 a3 v1 Stack
Mem[v2] = v1
a1: pop eax; a2: ret a3: pop ebx; a4: ret a5: mov [ebx], eax
Implementation 2
esp
eax ebx eip v1 a5 v2
13
Desired Logic a3 v2 a2 v1 Stack
Mem[v2] = v1
a1: mov eax, [esp] a2: mov ebx, [esp+8] a3: mov [ebx], eax Implementation 1 a1: pop eax; ret a2: pop ebx; ret a3: mov [ebx], eax Implementation 2
semantically equivalent
esp
gadgets at addresses a1, a2, and a3 in existing code
a2, and then a3
14
Desired Shellcode
Mem[v2] = v1
… argv argc return addr caller’s ebp buf (64 bytes) argv[1] buf %ebp %esp
15
Desired Shellcode
Mem[v2] = v1
… argv argc return addr caller’s ebp buf (64 bytes) argv[1] buf %ebp %esp a3 v2 a2 v1 a1
a1: pop eax; ret a2: pop ebx; ret a3: mov [ebx], eax
Desired store executed!
Normal programming ROP Instruction pointer eip esp No-op nop ret Unconditional jump jmp address set esp to address of gadget Conditional jump jnz address set esp to address of gadget if some condition is met Variables memory and registers mostly memory Inter-instruction (inter-gadget) register and memory interaction minimal, mostly explicit; e.g., adding two registers only affects the destination register can be complex; e.g., adding two registers may involve modifying many registers which impacts other gadgets
stack pointer (with some exceptions)
ret
ret
ret
ret
esp ... &next gadget addr
ret
ret
esp ... &next gadget addr
ret
ret
esp ... &next gadget addr eax
ret
ret
esp ... &next gadget addr eax
ret
ret
... &next gadget addr eax, esp
ret
ret
... &next gadget addr eax esp
ret
ret
cmpl %ebx, %eax set carry flag cf according to eax - ebx sbbl %ecx, %ecx ecx ← ecx - ecx - cf; or ecx ← -cf ret
... &next gadget 37 addr 42
cmpl %ebx, %eax ret sbbl %ecx, %ecx ret popl %eax ret andl %ecx, %eax ret addl %eax, %esp ret popl %edx ret movl %eax, %esp ret
Conditional jump gadget Load constant in edx gadget Unconditional jump gadget
Useful instruction sequences
... &next gadget 37 addr 42
cmpl %ebx, %eax ret sbbl %ecx, %ecx ret popl %eax ret andl %ecx, %eax ret addl %eax, %esp ret popl %edx ret movl %eax, %esp ret Register Value eax 10 ebx 20 ecx 108 edx 17 esp
... &next gadget 37 addr 42
cmpl %ebx, %eax ret sbbl %ecx, %ecx ret popl %eax ret andl %ecx, %eax ret addl %eax, %esp ret popl %edx ret movl %eax, %esp ret Register Value eax 10 ebx 20 ecx 108 edx 17 esp
... &next gadget 37 addr 42
cmpl %ebx, %eax ret sbbl %ecx, %ecx ret popl %eax ret andl %ecx, %eax ret addl %eax, %esp ret popl %edx ret movl %eax, %esp ret Register Value eax 10 ebx 20 ecx 108 edx 17 esp cf = 1
... &next gadget 37 addr 42
cmpl %ebx, %eax ret sbbl %ecx, %ecx ret popl %eax ret andl %ecx, %eax ret addl %eax, %esp ret popl %edx ret movl %eax, %esp ret Register Value eax 10 ebx 20 ecx 108 edx 17 esp cf = 1
... &next gadget 37 addr 42
cmpl %ebx, %eax ret sbbl %ecx, %ecx ret popl %eax ret andl %ecx, %eax ret addl %eax, %esp ret popl %edx ret movl %eax, %esp ret Register Value eax 10 ebx 20 ecx 0xffffffff edx 17 esp cf = 1
... &next gadget 37 addr 42
cmpl %ebx, %eax ret sbbl %ecx, %ecx ret popl %eax ret andl %ecx, %eax ret addl %eax, %esp ret popl %edx ret movl %eax, %esp ret Register Value eax 10 ebx 20 ecx 0xffffffff edx 17 esp
... &next gadget 37 addr 42
cmpl %ebx, %eax ret sbbl %ecx, %ecx ret popl %eax ret andl %ecx, %eax ret addl %eax, %esp ret popl %edx ret movl %eax, %esp ret Register Value eax 20 = offset ebx 20 ecx 0xffffffff edx 17 esp
... &next gadget 37 addr 42
cmpl %ebx, %eax ret sbbl %ecx, %ecx ret popl %eax ret andl %ecx, %eax ret addl %eax, %esp ret popl %edx ret movl %eax, %esp ret Register Value eax 20 = offset ebx 20 ecx 0xffffffff edx 17 esp
... &next gadget 37 addr 42
cmpl %ebx, %eax ret sbbl %ecx, %ecx ret popl %eax ret andl %ecx, %eax ret addl %eax, %esp ret popl %edx ret movl %eax, %esp ret Register Value eax 20 = offset ebx 20 ecx 0xffffffff edx 17 esp
... &next gadget 37 addr 42
cmpl %ebx, %eax ret sbbl %ecx, %ecx ret popl %eax ret andl %ecx, %eax ret addl %eax, %esp ret popl %edx ret movl %eax, %esp ret Register Value eax 20 = offset ebx 20 ecx 0xffffffff edx 17 esp
... &next gadget 37 addr 42
cmpl %ebx, %eax ret sbbl %ecx, %ecx ret popl %eax ret andl %ecx, %eax ret addl %eax, %esp ret popl %edx ret movl %eax, %esp ret Register Value eax 20 = offset ebx 20 ecx 0xffffffff edx 17 esp
... &next gadget 37 addr 42
cmpl %ebx, %eax ret sbbl %ecx, %ecx ret popl %eax ret andl %ecx, %eax ret addl %eax, %esp ret popl %edx ret movl %eax, %esp ret Register Value eax 20 = offset ebx 20 ecx 0xffffffff edx 17 esp
... &next gadget 37 addr 42
cmpl %ebx, %eax ret sbbl %ecx, %ecx ret popl %eax ret andl %ecx, %eax ret addl %eax, %esp ret popl %edx ret movl %eax, %esp ret Register Value eax 20 = offset ebx 20 ecx 0xffffffff edx 37 esp
... &next gadget 37 addr 42
cmpl %ebx, %eax ret sbbl %ecx, %ecx ret popl %eax ret andl %ecx, %eax ret addl %eax, %esp ret popl %edx ret movl %eax, %esp ret Register Value eax 20 = offset ebx 20 ecx 0xffffffff edx 37 esp
... &next gadget 37 addr 42
cmpl %ebx, %eax ret sbbl %ecx, %ecx ret popl %eax ret andl %ecx, %eax ret addl %eax, %esp ret popl %edx ret movl %eax, %esp ret Register Value eax 500 ebx 20 ecx 108 edx 17 esp
... &next gadget 37 addr 42
cmpl %ebx, %eax ret sbbl %ecx, %ecx ret popl %eax ret andl %ecx, %eax ret addl %eax, %esp ret popl %edx ret movl %eax, %esp ret Register Value eax 500 ebx 20 ecx 108 edx 17 esp
... &next gadget 37 addr 42
cmpl %ebx, %eax ret sbbl %ecx, %ecx ret popl %eax ret andl %ecx, %eax ret addl %eax, %esp ret popl %edx ret movl %eax, %esp ret Register Value eax 500 ebx 20 ecx 108 edx 17 esp cf = 0
... &next gadget 37 addr 42
cmpl %ebx, %eax ret sbbl %ecx, %ecx ret popl %eax ret andl %ecx, %eax ret addl %eax, %esp ret popl %edx ret movl %eax, %esp ret Register Value eax 500 ebx 20 ecx 108 edx 17 esp cf = 0
... &next gadget 37 addr 42
cmpl %ebx, %eax ret sbbl %ecx, %ecx ret popl %eax ret andl %ecx, %eax ret addl %eax, %esp ret popl %edx ret movl %eax, %esp ret Register Value eax 500 ebx 20 ecx edx 17 esp
... &next gadget 37 addr 42
cmpl %ebx, %eax ret sbbl %ecx, %ecx ret popl %eax ret andl %ecx, %eax ret addl %eax, %esp ret popl %edx ret movl %eax, %esp ret Register Value eax 500 ebx 20 ecx edx 17 esp
... &next gadget 37 addr 42
cmpl %ebx, %eax ret sbbl %ecx, %ecx ret popl %eax ret andl %ecx, %eax ret addl %eax, %esp ret popl %edx ret movl %eax, %esp ret Register Value eax 20 = offset ebx 20 ecx edx 17 esp
... &next gadget 37 addr 42
cmpl %ebx, %eax ret sbbl %ecx, %ecx ret popl %eax ret andl %ecx, %eax ret addl %eax, %esp ret popl %edx ret movl %eax, %esp ret Register Value eax 20 = offset ebx 20 ecx edx 17 esp
... &next gadget 37 addr 42
cmpl %ebx, %eax ret sbbl %ecx, %ecx ret popl %eax ret andl %ecx, %eax ret addl %eax, %esp ret popl %edx ret movl %eax, %esp ret Register Value eax ebx 20 ecx edx 17 esp
... &next gadget 37 addr 42
cmpl %ebx, %eax ret sbbl %ecx, %ecx ret popl %eax ret andl %ecx, %eax ret addl %eax, %esp ret popl %edx ret movl %eax, %esp ret Register Value eax ebx 20 ecx edx 17 esp
... &next gadget 37 addr 42
cmpl %ebx, %eax ret sbbl %ecx, %ecx ret popl %eax ret andl %ecx, %eax ret addl %eax, %esp ret popl %edx ret movl %eax, %esp ret Register Value eax ebx 20 ecx edx 17 esp
... &next gadget 37 addr 42
cmpl %ebx, %eax ret sbbl %ecx, %ecx ret popl %eax ret andl %ecx, %eax ret addl %eax, %esp ret popl %edx ret movl %eax, %esp ret Register Value eax ebx 20 ecx edx 17 esp
... &next gadget 37 addr 42
cmpl %ebx, %eax ret sbbl %ecx, %ecx ret popl %eax ret andl %ecx, %eax ret addl %eax, %esp ret popl %edx ret movl %eax, %esp ret Register Value eax ebx 20 ecx edx 42 esp
... &next gadget 37 addr 42
cmpl %ebx, %eax ret sbbl %ecx, %ecx ret popl %eax ret andl %ecx, %eax ret addl %eax, %esp ret popl %edx ret movl %eax, %esp ret Register Value eax ebx 20 ecx edx 42 esp
... &next gadget 37 addr 42
cmpl %ebx, %eax ret sbbl %ecx, %ecx ret popl %eax ret andl %ecx, %eax ret addl %eax, %esp ret popl %edx ret movl %eax, %esp ret Register Value eax addr ebx 20 ecx edx 42 esp
... &next gadget 37 addr 42
cmpl %ebx, %eax ret sbbl %ecx, %ecx ret popl %eax ret andl %ecx, %eax ret addl %eax, %esp ret popl %edx ret movl %eax, %esp ret Register Value eax addr ebx 20 ecx edx 42 esp
... &next gadget 37 addr 42
cmpl %ebx, %eax ret sbbl %ecx, %ecx ret popl %eax ret andl %ecx, %eax ret addl %eax, %esp ret popl %edx ret movl %eax, %esp ret Register Value eax addr ebx 20 ecx edx 42 esp
... &next gadget 37 addr 42
cmpl %ebx, %eax ret sbbl %ecx, %ecx ret popl %eax ret andl %ecx, %eax ret addl %eax, %esp ret popl %edx ret movl %eax, %esp ret Register Value eax addr ebx 20 ecx edx 42 esp
Register Value eax 10 ebx 20 ecx 108 edx 17 Register Value eax addr ebx 20 ecx edx 42 Register Value eax 500 ebx 20 ecx 108 edx 17 Register Value eax 20 ebx 20 ecx 0xffffffff edx 37 if (eax < ebx) edx = 37; else edx = 42;