62
1 Reverse Engineering | Class 10 | Martin Balao | martin.uy/reverse | v1.0 EN | CC BY-SA Reverse Engineering Class 10 Exploit Writing III Return Oriented Programming (ROP)

Reverse Engineering - martin.uy · 2018. 6. 19. · Reverse Engineering | Class 10 | Martin Balao | martin.uy/reverse | v1.0 EN | CC BY-SA 15 ROP Return Oriented Programming (ROP)

  • Upload
    others

  • View
    2

  • Download
    1

Embed Size (px)

Citation preview

Page 1: Reverse Engineering - martin.uy · 2018. 6. 19. · Reverse Engineering | Class 10 | Martin Balao | martin.uy/reverse | v1.0 EN | CC BY-SA 15 ROP Return Oriented Programming (ROP)

1Reverse Engineering | Class 10 | Martin Balao | martin.uy/reverse | v1.0 EN | CC BY-SA

Reverse EngineeringClass 10

Exploit Writing III Return Oriented Programming (ROP)

Page 2: Reverse Engineering - martin.uy · 2018. 6. 19. · Reverse Engineering | Class 10 | Martin Balao | martin.uy/reverse | v1.0 EN | CC BY-SA 15 ROP Return Oriented Programming (ROP)

2Reverse Engineering | Class 10 | Martin Balao | martin.uy/reverse | v1.0 EN | CC BY-SA

ROP

● ROP: Return Oriented Programming● RIP (instruction pointer) is controlled, but:● It’s not possible to jump to execute shellcode

in the stack, data or heap● Data not executable anymore (DEP →

Data Execution Prevention)● NX bit (x86)● This applies to both kernel and user space

Page 3: Reverse Engineering - martin.uy · 2018. 6. 19. · Reverse Engineering | Class 10 | Martin Balao | martin.uy/reverse | v1.0 EN | CC BY-SA 15 ROP Return Oriented Programming (ROP)

3Reverse Engineering | Class 10 | Martin Balao | martin.uy/reverse | v1.0 EN | CC BY-SA

ROP

Page 4: Reverse Engineering - martin.uy · 2018. 6. 19. · Reverse Engineering | Class 10 | Martin Balao | martin.uy/reverse | v1.0 EN | CC BY-SA 15 ROP Return Oriented Programming (ROP)

4Reverse Engineering | Class 10 | Martin Balao | martin.uy/reverse | v1.0 EN | CC BY-SA

ROP

● NX bit (kernel, x86_64)

#define _PAGE_BIT_NX 63 /* No execute: only valid after cpuid check */

#define _PAGE_NX (_AT(pteval_t, 1) << _PAGE_BIT_NX)

arch/x86/include/asm/pgtable_types.h

static inline pte_t pte_mkexec(pte_t pte){

return pte_clear_flags(pte, _PAGE_NX);}arch/x86/include/asm/pgtable.h

Page 5: Reverse Engineering - martin.uy · 2018. 6. 19. · Reverse Engineering | Class 10 | Martin Balao | martin.uy/reverse | v1.0 EN | CC BY-SA 15 ROP Return Oriented Programming (ROP)

5Reverse Engineering | Class 10 | Martin Balao | martin.uy/reverse | v1.0 EN | CC BY-SA

ROP

● NX bit (kernel, x86_64)

typedef unsigned long pteval_t;

typedef struct { pteval_t pte; } pte_t;

arch/x86/include/asm/pgtable_64_types.h

Page 6: Reverse Engineering - martin.uy · 2018. 6. 19. · Reverse Engineering | Class 10 | Martin Balao | martin.uy/reverse | v1.0 EN | CC BY-SA 15 ROP Return Oriented Programming (ROP)

6Reverse Engineering | Class 10 | Martin Balao | martin.uy/reverse | v1.0 EN | CC BY-SA

ROP

● Stack allocation (kernel, x86_64)

stack = __vmalloc_node_range(THREAD_SIZE, THREAD_SIZE, VMALLOC_START, VMALLOC_END, THREADINFO_GFP | __GFP_HIGHMEM, PAGE_KERNEL, 0, node, __builtin_return_address(0));

fork.c

#define PAGE_KERNEL __pgprot(__PAGE_KERNEL)

#define __PAGE_KERNEL (__PAGE_KERNEL_EXEC | _PAGE_NX)

stack = __vmalloc_node_range(THREAD_SIZE, THREAD_SIZE, VMALLOC_START, VMALLOC_END, THREADINFO_GFP | __GFP_HIGHMEM, PAGE_KERNEL, 0, node, __builtin_return_address(0));

arch/x86/include/asm/pgtable_types.h

Page 7: Reverse Engineering - martin.uy · 2018. 6. 19. · Reverse Engineering | Class 10 | Martin Balao | martin.uy/reverse | v1.0 EN | CC BY-SA 15 ROP Return Oriented Programming (ROP)

7Reverse Engineering | Class 10 | Martin Balao | martin.uy/reverse | v1.0 EN | CC BY-SA

ROP

● Stack allocation user main thread (kernel, x86_64)

GNU_STACK section (from “main” binary) has flags RW on

Page 8: Reverse Engineering - martin.uy · 2018. 6. 19. · Reverse Engineering | Class 10 | Martin Balao | martin.uy/reverse | v1.0 EN | CC BY-SA 15 ROP Return Oriented Programming (ROP)

8Reverse Engineering | Class 10 | Martin Balao | martin.uy/reverse | v1.0 EN | CC BY-SA

ROP

● Stack allocation user main thread (kernel, x86_64)

fs/binfmt_elf.c (Linux kernel)

Page 9: Reverse Engineering - martin.uy · 2018. 6. 19. · Reverse Engineering | Class 10 | Martin Balao | martin.uy/reverse | v1.0 EN | CC BY-SA 15 ROP Return Oriented Programming (ROP)

9Reverse Engineering | Class 10 | Martin Balao | martin.uy/reverse | v1.0 EN | CC BY-SA

ROP

● Stack allocation user main thread (kernel, x86_64)

fs/exec.c (Linux kernel)

Page 10: Reverse Engineering - martin.uy · 2018. 6. 19. · Reverse Engineering | Class 10 | Martin Balao | martin.uy/reverse | v1.0 EN | CC BY-SA 15 ROP Return Oriented Programming (ROP)

10Reverse Engineering | Class 10 | Martin Balao | martin.uy/reverse | v1.0 EN | CC BY-SA

ROP

● Stack allocation user (glibc, x86_64)

static intallocate_stack (const struct pthread_attr *attr, struct pthread **pdp,

ALLOCATE_STACK_PARMS){...const int prot = (PROT_READ | PROT_WRITE

| ((GL(dl_stack_flags) & PF_X) ? PROT_EXEC : 0));...mem = mmap (NULL, size, prot,

MAP_PRIVATE | MAP_ANONYMOUS | MAP_STACK, -1, 0);

nptl/allocatestack.c

Page 11: Reverse Engineering - martin.uy · 2018. 6. 19. · Reverse Engineering | Class 10 | Martin Balao | martin.uy/reverse | v1.0 EN | CC BY-SA 15 ROP Return Oriented Programming (ROP)

11Reverse Engineering | Class 10 | Martin Balao | martin.uy/reverse | v1.0 EN | CC BY-SA

ROP

● Return to libc● Call system (Linux) or WinExec (Windows)

– Invoke a command or application (I.e. shell)

● Call dlopen (Linux) or LoadLibrary (Windows)– Execute code when library is loaded

● In x86, a memory corruption on the stack may allow control of all parameters for these calls (ABI)

Page 12: Reverse Engineering - martin.uy · 2018. 6. 19. · Reverse Engineering | Class 10 | Martin Balao | martin.uy/reverse | v1.0 EN | CC BY-SA 15 ROP Return Oriented Programming (ROP)

12Reverse Engineering | Class 10 | Martin Balao | martin.uy/reverse | v1.0 EN | CC BY-SA

ROP

● Return to libc● In x86_64, ABI requires to load registers to

send parameters to a function● Virtual address space randomization (ASLR):

in which virtual addresses are system, dlopen, WinExec and LoadLibrary functions located?

Page 13: Reverse Engineering - martin.uy · 2018. 6. 19. · Reverse Engineering | Class 10 | Martin Balao | martin.uy/reverse | v1.0 EN | CC BY-SA 15 ROP Return Oriented Programming (ROP)

13Reverse Engineering | Class 10 | Martin Balao | martin.uy/reverse | v1.0 EN | CC BY-SA

ROP

● Return to libc● Return to strcpy/memcpy/sprintf/etc● Copy shellcode to a writable and executable

location● W^X: protection against writable and

executable segments

Page 14: Reverse Engineering - martin.uy · 2018. 6. 19. · Reverse Engineering | Class 10 | Martin Balao | martin.uy/reverse | v1.0 EN | CC BY-SA 15 ROP Return Oriented Programming (ROP)

14Reverse Engineering | Class 10 | Martin Balao | martin.uy/reverse | v1.0 EN | CC BY-SA

Lab

Exercise 10.1: return to Libc

Page 15: Reverse Engineering - martin.uy · 2018. 6. 19. · Reverse Engineering | Class 10 | Martin Balao | martin.uy/reverse | v1.0 EN | CC BY-SA 15 ROP Return Oriented Programming (ROP)

15Reverse Engineering | Class 10 | Martin Balao | martin.uy/reverse | v1.0 EN | CC BY-SA

ROP

● Return Oriented Programming (ROP)● Control of the stack is required to do ROP

– Pivot the stack to a controlled area if necessary

● Concatenate multiple calls to short assembly sequences: gadgets– Each “call” is a return to what’s on the top of the stack

– Gadgets end in a RET instruction (or an equivalent one) that allows to continue controlling the execution flow through the stack

– Registers and memory state are conveniently modified in each call to a gadget

Page 16: Reverse Engineering - martin.uy · 2018. 6. 19. · Reverse Engineering | Class 10 | Martin Balao | martin.uy/reverse | v1.0 EN | CC BY-SA 15 ROP Return Oriented Programming (ROP)

16Reverse Engineering | Class 10 | Martin Balao | martin.uy/reverse | v1.0 EN | CC BY-SA

ROP

● Return Oriented Programming● Goals: unprotect memory (mprotect syscall in

Linux or VirtualProtect in Windows) to jump to shellcode or execute a binary (execve syscall)– Another approach could be allocating new

memory with write and execution permissions, and copy the payload to jump there

Page 17: Reverse Engineering - martin.uy · 2018. 6. 19. · Reverse Engineering | Class 10 | Martin Balao | martin.uy/reverse | v1.0 EN | CC BY-SA 15 ROP Return Oriented Programming (ROP)

17Reverse Engineering | Class 10 | Martin Balao | martin.uy/reverse | v1.0 EN | CC BY-SA

ROP

● Return Oriented Programming● In which address is shellcode located?● Example: stack randomization

Page 18: Reverse Engineering - martin.uy · 2018. 6. 19. · Reverse Engineering | Class 10 | Martin Balao | martin.uy/reverse | v1.0 EN | CC BY-SA 15 ROP Return Oriented Programming (ROP)

18Reverse Engineering | Class 10 | Martin Balao | martin.uy/reverse | v1.0 EN | CC BY-SA

ROP

static unsigned long randomize_stack_top(unsigned long stack_top){

unsigned long random_variable = 0;

if (current->flags & PF_RANDOMIZE) {random_variable = get_random_long();random_variable &= STACK_RND_MASK;random_variable <<= PAGE_SHIFT;

}#ifdef CONFIG_STACK_GROWSUP

return PAGE_ALIGN(stack_top) + random_variable;#else

return PAGE_ALIGN(stack_top) - random_variable;#endif}

fs/binfmt_elf.c (Linux kernel)

Page 19: Reverse Engineering - martin.uy · 2018. 6. 19. · Reverse Engineering | Class 10 | Martin Balao | martin.uy/reverse | v1.0 EN | CC BY-SA 15 ROP Return Oriented Programming (ROP)

19Reverse Engineering | Class 10 | Martin Balao | martin.uy/reverse | v1.0 EN | CC BY-SA

ROPRun 1: /usr/bin/ls

Page 20: Reverse Engineering - martin.uy · 2018. 6. 19. · Reverse Engineering | Class 10 | Martin Balao | martin.uy/reverse | v1.0 EN | CC BY-SA 15 ROP Return Oriented Programming (ROP)

20Reverse Engineering | Class 10 | Martin Balao | martin.uy/reverse | v1.0 EN | CC BY-SA

ROPRun 2: /usr/bin/ls

Page 21: Reverse Engineering - martin.uy · 2018. 6. 19. · Reverse Engineering | Class 10 | Martin Balao | martin.uy/reverse | v1.0 EN | CC BY-SA 15 ROP Return Oriented Programming (ROP)

21Reverse Engineering | Class 10 | Martin Balao | martin.uy/reverse | v1.0 EN | CC BY-SA

ROP

● Return Oriented Programming● In which address is shellcode located?

– A ptr leak or a heap spray may be necessary

● In which addresses are gadgets located?– Mapped libraries may be randomized (PIC) but

some are not

– Binary image may be randomized (PIE) or not

Page 22: Reverse Engineering - martin.uy · 2018. 6. 19. · Reverse Engineering | Class 10 | Martin Balao | martin.uy/reverse | v1.0 EN | CC BY-SA 15 ROP Return Oriented Programming (ROP)

22Reverse Engineering | Class 10 | Martin Balao | martin.uy/reverse | v1.0 EN | CC BY-SA

ROP

● Return Oriented Programming● In which addresses are gadgets located?

– Example of Position Independent Executable (PIE): /usr/bin/ls (x86_64)

Page 23: Reverse Engineering - martin.uy · 2018. 6. 19. · Reverse Engineering | Class 10 | Martin Balao | martin.uy/reverse | v1.0 EN | CC BY-SA 15 ROP Return Oriented Programming (ROP)

23Reverse Engineering | Class 10 | Martin Balao | martin.uy/reverse | v1.0 EN | CC BY-SA

ROPRun 1: /usr/bin/ls

fs/binfmt_elf.c (Linux kernel)

Page 24: Reverse Engineering - martin.uy · 2018. 6. 19. · Reverse Engineering | Class 10 | Martin Balao | martin.uy/reverse | v1.0 EN | CC BY-SA 15 ROP Return Oriented Programming (ROP)

24Reverse Engineering | Class 10 | Martin Balao | martin.uy/reverse | v1.0 EN | CC BY-SA

ROPRun 1: /usr/bin/ls

fs/binfmt_elf.c (Linux kernel)

Page 25: Reverse Engineering - martin.uy · 2018. 6. 19. · Reverse Engineering | Class 10 | Martin Balao | martin.uy/reverse | v1.0 EN | CC BY-SA 15 ROP Return Oriented Programming (ROP)

25Reverse Engineering | Class 10 | Martin Balao | martin.uy/reverse | v1.0 EN | CC BY-SA

ROPRun 2: /usr/bin/ls

fs/binfmt_elf.c (Linux kernel)

Page 26: Reverse Engineering - martin.uy · 2018. 6. 19. · Reverse Engineering | Class 10 | Martin Balao | martin.uy/reverse | v1.0 EN | CC BY-SA 15 ROP Return Oriented Programming (ROP)

26Reverse Engineering | Class 10 | Martin Balao | martin.uy/reverse | v1.0 EN | CC BY-SA

ROPRun 2: /usr/bin/ls

fs/binfmt_elf.c (Linux kernel)

Page 27: Reverse Engineering - martin.uy · 2018. 6. 19. · Reverse Engineering | Class 10 | Martin Balao | martin.uy/reverse | v1.0 EN | CC BY-SA 15 ROP Return Oriented Programming (ROP)

27Reverse Engineering | Class 10 | Martin Balao | martin.uy/reverse | v1.0 EN | CC BY-SA

ROP

● Return Oriented Programming● X86 ELF binaries used not to be PIE, and the

virtual address to be mapped was specified in the program header

Virtual Address

main-static (ELF 32)

Page 28: Reverse Engineering - martin.uy · 2018. 6. 19. · Reverse Engineering | Class 10 | Martin Balao | martin.uy/reverse | v1.0 EN | CC BY-SA 15 ROP Return Oriented Programming (ROP)

28Reverse Engineering | Class 10 | Martin Balao | martin.uy/reverse | v1.0 EN | CC BY-SA

ROP

fs/binfmt_elf.c (Linux kernel)

Run: main-static (ELF 32)

→ addr

Page 29: Reverse Engineering - martin.uy · 2018. 6. 19. · Reverse Engineering | Class 10 | Martin Balao | martin.uy/reverse | v1.0 EN | CC BY-SA 15 ROP Return Oriented Programming (ROP)

29Reverse Engineering | Class 10 | Martin Balao | martin.uy/reverse | v1.0 EN | CC BY-SA

ROP

● I.e: suppose that this binary main-static (ELF 32, not PIE) has a stack overflow and EIP can be controlled– Stack canary → no

– DEP → yes (not executable stack)

– ASLR → yes for libs, not for the executable image

Page 30: Reverse Engineering - martin.uy · 2018. 6. 19. · Reverse Engineering | Class 10 | Martin Balao | martin.uy/reverse | v1.0 EN | CC BY-SA 15 ROP Return Oriented Programming (ROP)

30Reverse Engineering | Class 10 | Martin Balao | martin.uy/reverse | v1.0 EN | CC BY-SA

ROP

Page 31: Reverse Engineering - martin.uy · 2018. 6. 19. · Reverse Engineering | Class 10 | Martin Balao | martin.uy/reverse | v1.0 EN | CC BY-SA 15 ROP Return Oriented Programming (ROP)

31Reverse Engineering | Class 10 | Martin Balao | martin.uy/reverse | v1.0 EN | CC BY-SA

ROP

● I.e: if we want to call sys_execve in order to execute /bin/bash in Linux x86, what has to be done according to syscalls ABI?● eax = 0xb (syscall number)● ebx = pointer to “/bin/bash” (parameter 1)● ecx = null pointer (parameter 2 - argv)● edx = null pointer (parameter 3 - envp)● eip = pointer to “int 80” instruction

Page 32: Reverse Engineering - martin.uy · 2018. 6. 19. · Reverse Engineering | Class 10 | Martin Balao | martin.uy/reverse | v1.0 EN | CC BY-SA 15 ROP Return Oriented Programming (ROP)

32Reverse Engineering | Class 10 | Martin Balao | martin.uy/reverse | v1.0 EN | CC BY-SA

ROP

Page 33: Reverse Engineering - martin.uy · 2018. 6. 19. · Reverse Engineering | Class 10 | Martin Balao | martin.uy/reverse | v1.0 EN | CC BY-SA 15 ROP Return Oriented Programming (ROP)

33Reverse Engineering | Class 10 | Martin Balao | martin.uy/reverse | v1.0 EN | CC BY-SA

ROP

Page 34: Reverse Engineering - martin.uy · 2018. 6. 19. · Reverse Engineering | Class 10 | Martin Balao | martin.uy/reverse | v1.0 EN | CC BY-SA 15 ROP Return Oriented Programming (ROP)

34Reverse Engineering | Class 10 | Martin Balao | martin.uy/reverse | v1.0 EN | CC BY-SA

ROP

Page 35: Reverse Engineering - martin.uy · 2018. 6. 19. · Reverse Engineering | Class 10 | Martin Balao | martin.uy/reverse | v1.0 EN | CC BY-SA 15 ROP Return Oriented Programming (ROP)

35Reverse Engineering | Class 10 | Martin Balao | martin.uy/reverse | v1.0 EN | CC BY-SA

ROP

Page 36: Reverse Engineering - martin.uy · 2018. 6. 19. · Reverse Engineering | Class 10 | Martin Balao | martin.uy/reverse | v1.0 EN | CC BY-SA 15 ROP Return Oriented Programming (ROP)

36Reverse Engineering | Class 10 | Martin Balao | martin.uy/reverse | v1.0 EN | CC BY-SA

ROP

Page 37: Reverse Engineering - martin.uy · 2018. 6. 19. · Reverse Engineering | Class 10 | Martin Balao | martin.uy/reverse | v1.0 EN | CC BY-SA 15 ROP Return Oriented Programming (ROP)

37Reverse Engineering | Class 10 | Martin Balao | martin.uy/reverse | v1.0 EN | CC BY-SA

ROP

Page 38: Reverse Engineering - martin.uy · 2018. 6. 19. · Reverse Engineering | Class 10 | Martin Balao | martin.uy/reverse | v1.0 EN | CC BY-SA 15 ROP Return Oriented Programming (ROP)

38Reverse Engineering | Class 10 | Martin Balao | martin.uy/reverse | v1.0 EN | CC BY-SA

ROP

Page 39: Reverse Engineering - martin.uy · 2018. 6. 19. · Reverse Engineering | Class 10 | Martin Balao | martin.uy/reverse | v1.0 EN | CC BY-SA 15 ROP Return Oriented Programming (ROP)

39Reverse Engineering | Class 10 | Martin Balao | martin.uy/reverse | v1.0 EN | CC BY-SA

ROP

Page 40: Reverse Engineering - martin.uy · 2018. 6. 19. · Reverse Engineering | Class 10 | Martin Balao | martin.uy/reverse | v1.0 EN | CC BY-SA 15 ROP Return Oriented Programming (ROP)

40Reverse Engineering | Class 10 | Martin Balao | martin.uy/reverse | v1.0 EN | CC BY-SA

ROP

Page 41: Reverse Engineering - martin.uy · 2018. 6. 19. · Reverse Engineering | Class 10 | Martin Balao | martin.uy/reverse | v1.0 EN | CC BY-SA 15 ROP Return Oriented Programming (ROP)

41Reverse Engineering | Class 10 | Martin Balao | martin.uy/reverse | v1.0 EN | CC BY-SA

ROP

Page 42: Reverse Engineering - martin.uy · 2018. 6. 19. · Reverse Engineering | Class 10 | Martin Balao | martin.uy/reverse | v1.0 EN | CC BY-SA 15 ROP Return Oriented Programming (ROP)

42Reverse Engineering | Class 10 | Martin Balao | martin.uy/reverse | v1.0 EN | CC BY-SA

ROP

Page 43: Reverse Engineering - martin.uy · 2018. 6. 19. · Reverse Engineering | Class 10 | Martin Balao | martin.uy/reverse | v1.0 EN | CC BY-SA 15 ROP Return Oriented Programming (ROP)

43Reverse Engineering | Class 10 | Martin Balao | martin.uy/reverse | v1.0 EN | CC BY-SA

ROP

Page 44: Reverse Engineering - martin.uy · 2018. 6. 19. · Reverse Engineering | Class 10 | Martin Balao | martin.uy/reverse | v1.0 EN | CC BY-SA 15 ROP Return Oriented Programming (ROP)

44Reverse Engineering | Class 10 | Martin Balao | martin.uy/reverse | v1.0 EN | CC BY-SA

ROP

Page 45: Reverse Engineering - martin.uy · 2018. 6. 19. · Reverse Engineering | Class 10 | Martin Balao | martin.uy/reverse | v1.0 EN | CC BY-SA 15 ROP Return Oriented Programming (ROP)

45Reverse Engineering | Class 10 | Martin Balao | martin.uy/reverse | v1.0 EN | CC BY-SA

ROP

● How to find gadgets?● Static analysis tools● Dynamic analysis tools: AGAFI

● Constraints satisfaction problem● Side-effects of some gadgets● Compensation for indirect reads/writes

● Instructions of a few bytes are preferable (I.e: xchg + ret is 2 bytes long and there are no side-effects)

Page 46: Reverse Engineering - martin.uy · 2018. 6. 19. · Reverse Engineering | Class 10 | Martin Balao | martin.uy/reverse | v1.0 EN | CC BY-SA 15 ROP Return Oriented Programming (ROP)

46Reverse Engineering | Class 10 | Martin Balao | martin.uy/reverse | v1.0 EN | CC BY-SA

ROP

● Unaligned jumps to find gadgets● In x86/x86_64 is possible to jump unaligned● CISC architectures have multiple valid

instructions, which is an advantage● POPAD instruction is interesting

● 1 byte long (0x61)● Load multiple registers with values from the

stack at once

Page 47: Reverse Engineering - martin.uy · 2018. 6. 19. · Reverse Engineering | Class 10 | Martin Balao | martin.uy/reverse | v1.0 EN | CC BY-SA 15 ROP Return Oriented Programming (ROP)

47Reverse Engineering | Class 10 | Martin Balao | martin.uy/reverse | v1.0 EN | CC BY-SA

ROP

● Multiple ways of achieving the desired state. Example: set eax to 0:● Is eax already 0?● pop eax● xor eax, eax● mov eax, 0x0● dec eax● xchg eax, r (r = 0)● etc.

Page 48: Reverse Engineering - martin.uy · 2018. 6. 19. · Reverse Engineering | Class 10 | Martin Balao | martin.uy/reverse | v1.0 EN | CC BY-SA 15 ROP Return Oriented Programming (ROP)

48Reverse Engineering | Class 10 | Martin Balao | martin.uy/reverse | v1.0 EN | CC BY-SA

ROP

● PTR leaks: is there any register pointing to a known place at crash time?

● Jump Oriented Programming: instead of RETs, use indirect jumps

● Call Oriented Programming: instead of RETs, use indirect calls

● In kernel space ROP works exactly the same way

Page 49: Reverse Engineering - martin.uy · 2018. 6. 19. · Reverse Engineering | Class 10 | Martin Balao | martin.uy/reverse | v1.0 EN | CC BY-SA 15 ROP Return Oriented Programming (ROP)

49Reverse Engineering | Class 10 | Martin Balao | martin.uy/reverse | v1.0 EN | CC BY-SA

Demo 10.1

ROP chain in user space

Page 50: Reverse Engineering - martin.uy · 2018. 6. 19. · Reverse Engineering | Class 10 | Martin Balao | martin.uy/reverse | v1.0 EN | CC BY-SA 15 ROP Return Oriented Programming (ROP)

50Reverse Engineering | Class 10 | Martin Balao | martin.uy/reverse | v1.0 EN | CC BY-SA

Control Flow Integrity

● A program has expected execution flows, defined by a graph in compilation/linking time

● A ROP attack makes the program execute a anomalous or unexpected flow

● Can the program detect when the expected flow is broken? This would be a good compromise indicator

Page 51: Reverse Engineering - martin.uy · 2018. 6. 19. · Reverse Engineering | Class 10 | Martin Balao | martin.uy/reverse | v1.0 EN | CC BY-SA 15 ROP Return Oriented Programming (ROP)

51Reverse Engineering | Class 10 | Martin Balao | martin.uy/reverse | v1.0 EN | CC BY-SA

Control Flow Integrity

● If DEP (Data Execution Prevention) is taken for granted, how can the attacker corrupt flows?– CALL 0xAABBCCDD cannot be corrupted: memory

where relative call parameter is located is in the code segment (.text) and it’s not writable

– Execution flows that can be corrupted are those that depend on data (indirect): CALL [REG] or JMP [REG] (being REG a register loaded with a value from memory), RET

Page 52: Reverse Engineering - martin.uy · 2018. 6. 19. · Reverse Engineering | Class 10 | Martin Balao | martin.uy/reverse | v1.0 EN | CC BY-SA 15 ROP Return Oriented Programming (ROP)

52Reverse Engineering | Class 10 | Martin Balao | martin.uy/reverse | v1.0 EN | CC BY-SA

Control Flow Integrity

Image from Software Security course (University of Maryland)

Page 53: Reverse Engineering - martin.uy · 2018. 6. 19. · Reverse Engineering | Class 10 | Martin Balao | martin.uy/reverse | v1.0 EN | CC BY-SA 15 ROP Return Oriented Programming (ROP)

53Reverse Engineering | Class 10 | Martin Balao | martin.uy/reverse | v1.0 EN | CC BY-SA

Control Flow Integrity

Image from Software Security course (University of Maryland)

Page 54: Reverse Engineering - martin.uy · 2018. 6. 19. · Reverse Engineering | Class 10 | Martin Balao | martin.uy/reverse | v1.0 EN | CC BY-SA 15 ROP Return Oriented Programming (ROP)

54Reverse Engineering | Class 10 | Martin Balao | martin.uy/reverse | v1.0 EN | CC BY-SA

Control Flow Integrity

● It’s possible to label destinations for indirect jumps. This is: add label bytes (not executable) previous to the jump target

● Before jumping, verify the existence of a correct label in those bytes previous to the jump target

● If label is correct, proceed to the jump Otherwise, an anomalous flow has been detected

● This has a performance hit

Page 55: Reverse Engineering - martin.uy · 2018. 6. 19. · Reverse Engineering | Class 10 | Martin Balao | martin.uy/reverse | v1.0 EN | CC BY-SA 15 ROP Return Oriented Programming (ROP)

55Reverse Engineering | Class 10 | Martin Balao | martin.uy/reverse | v1.0 EN | CC BY-SA

Control Flow Integrity

Image from Software Security course (University of Maryland)

Page 56: Reverse Engineering - martin.uy · 2018. 6. 19. · Reverse Engineering | Class 10 | Martin Balao | martin.uy/reverse | v1.0 EN | CC BY-SA 15 ROP Return Oriented Programming (ROP)

56Reverse Engineering | Class 10 | Martin Balao | martin.uy/reverse | v1.0 EN | CC BY-SA

Control Flow Integrity

Image from Software Security course (University of Maryland)

Page 57: Reverse Engineering - martin.uy · 2018. 6. 19. · Reverse Engineering | Class 10 | Martin Balao | martin.uy/reverse | v1.0 EN | CC BY-SA 15 ROP Return Oriented Programming (ROP)

57Reverse Engineering | Class 10 | Martin Balao | martin.uy/reverse | v1.0 EN | CC BY-SA

Control Flow Integrity

● This technique does not prevent from jumping to a place with the same label, despite not being a possible flow in the graph

● Greater label granularity is needed to prevent these cases

Page 58: Reverse Engineering - martin.uy · 2018. 6. 19. · Reverse Engineering | Class 10 | Martin Balao | martin.uy/reverse | v1.0 EN | CC BY-SA 15 ROP Return Oriented Programming (ROP)

58Reverse Engineering | Class 10 | Martin Balao | martin.uy/reverse | v1.0 EN | CC BY-SA

Control Flow Integrity

Image from Software Security course (University of Maryland)

Page 59: Reverse Engineering - martin.uy · 2018. 6. 19. · Reverse Engineering | Class 10 | Martin Balao | martin.uy/reverse | v1.0 EN | CC BY-SA 15 ROP Return Oriented Programming (ROP)

59Reverse Engineering | Class 10 | Martin Balao | martin.uy/reverse | v1.0 EN | CC BY-SA

Control Flow Integrityclass A {public:

virtual int m(void) = 0;};class B : public A {public:

int m(void);};class C : public A {public:

int m(void);};int B::m(void) {

return 1;}int C::m(void) {

return 2;}

int main(void) {int res = 0;A* b = new B();A* c = new C();

volatile unsigned long bu = reinterpret_cast<unsigned long>(&b);

volatile unsigned long cu = reinterpret_cast<unsigned long>(&c);

A* bb = *(reinterpret_cast<A**>(bu));A* cc = *(reinterpret_cast<A**>(cu));

res += bb->m();res += cc->m();

return res;}

Page 60: Reverse Engineering - martin.uy · 2018. 6. 19. · Reverse Engineering | Class 10 | Martin Balao | martin.uy/reverse | v1.0 EN | CC BY-SA 15 ROP Return Oriented Programming (ROP)

60Reverse Engineering | Class 10 | Martin Balao | martin.uy/reverse | v1.0 EN | CC BY-SA

Control Flow Integritymovq -48(%rbp), %raxmovq (%rax), %rdimovq -56(%rbp), %raxmovq (%rdi), %rcxmovq %rcx, %rdxsubq %r15, %rdxrolq $59, %rdxcmpq $3, %rdxjae 46 <_main+99>movq (%rax), %rbxcallq *(%rcx)

pointer to object b

object b

vtable B

call to 1st method from vtable B

integrity check: is it a valid vtable?

if not, error

pointer to object c

object c

clang++

Page 61: Reverse Engineering - martin.uy · 2018. 6. 19. · Reverse Engineering | Class 10 | Martin Balao | martin.uy/reverse | v1.0 EN | CC BY-SA 15 ROP Return Oriented Programming (ROP)

61Reverse Engineering | Class 10 | Martin Balao | martin.uy/reverse | v1.0 EN | CC BY-SA

Lab

Exercise 10.2

ROP chain in user space

Execute shellcode in the stack

Page 62: Reverse Engineering - martin.uy · 2018. 6. 19. · Reverse Engineering | Class 10 | Martin Balao | martin.uy/reverse | v1.0 EN | CC BY-SA 15 ROP Return Oriented Programming (ROP)

62Reverse Engineering | Class 10 | Martin Balao | martin.uy/reverse | v1.0 EN | CC BY-SA

References

● Software Security – University of Maryland– https://en.coursera.org/learn/software-security

● https://clang.llvm.org/docs/ControlFlowIntegrity.html