0x32 FunctionCallConvention
0x32 FunctionCallConvention
Content
Intel Architecture
C Arrays
BoF Exploit
Assembler
Remote Exploit
Shellcode
Exploit Mitigations
Function Calls
Slide 2
Function Call Convention
Slide 3
x32 Memory Layout
0xc0000000
0xbfffffff
Stack
Heap
Code
0x0804800
0x0000000
Slide 4
Stacks
push pop
Slide 6
Stack
0x10000
0x00010
push pop
Slide 7
Stack
push 0x1
push 0x2
push 0x3
pop
push 0x4
Slide 8
Stack
Slide 9
Stack
push 0x3
pop
push 0x4
Slide 10
Stack
Slide 11
Stack
push 0x3
pop
push 0x4
Slide 12
Stack
Slide 13
Stack on intel
ESP
push pop
Slide 14
Stack in computers
Note:
CPU instructions like push/pop are just for ease of use
The “stack values” can be accessed (read, write) like every other memory address
You can point the stack (ebp, esp) to wherever in the memory you want
There’s usually just ONE stack per process (thread)
Slide 15
x32 Call Convention
What is a function?
Self contained subroutine
Re-usable
Can be called from anywhere
After function is finished: Jump to the calling function
(calee)
Slide 17
x32 Call Convention
void main(void) {
int blubb = 0;
foobar(blubb);
return;
}
Slide 19
x32 Call Convention
push pop
Slide 20
x32 Call Convention
void main(void) {
Pointer
int blubb = 0;
foobar(&blubb);
&blubb
return;
SIP
} Pointer SFP
compass1
void foobar(int *arg1) {
char compass1[]; compass2
char compass2[];
} allocate push pop
Slide 21
x32 Call Convention
push pop
Slide 22
x32 Call Convention
Slide 23
x32 Call Convention
Intel syntax:
mov eax,1
mov ebx,0ffh
int 80h
AT&T syntax:
movl $1,%eax
movl $0xff,%ebx
int $0x80
Slide 25
x32 Call Convention
In ASM:
ret
pop eip
Slide 26
x32 Call Convention
In ASM:
In ASM:
Buffer writes go up
0xFFFF
arg1
SIP
SFP
compass1
compass2
0x0100
Slide 29
x32 Call Convention
Recap:
User data is on the stack
Also: important stuff is on the stack (Instruction Pointer, SIP)
Stack grows down
Writes go up
Slide 30
x32 Call Convention Details
x32 Call Convention Details
Slide 32
x32 Call Convention Details
push 3 push 3
jmp add
Slide 33
x32 Call Convention Details
add():
push 4 push ebp
push 3 mov ebp, esp,
push EIP sub esp, 0x10
jmp add
mov eax, DWORD PTR [ebp + 0xc]
mov edx, DWORD PTR [ebp + 0x8]
add eax, edx
mov DWORD PTR [ebp – 0x04], eax
mov eax, DWORD PTR [ebp – 0x04]
leave
ret
Slide 34
x32 Call Convention Details
add():
push 4 push ebp
push 3 mov ebp, esp,
push EIP sub esp, 0x10
jmp add
mov eax, DWORD PTR [ebp + 0xc]
mov edx, DWORD PTR [ebp + 0x8]
add eax, edx
mov DWORD PTR [ebp – 0x04], eax
mov eax, DWORD PTR [ebp – 0x04]
Slide 35
x32 Call Convention Details
add():
push 4 push ebp
push 3 mov ebp, esp,
push EIP sub esp, 0x10
jmp add
mov eax, DWORD PTR [ebp + 0xc]
mov edx, DWORD PTR [ebp + 0x8]
add eax, edx
mov DWORD PTR [ebp – 0x04], eax
mov eax, DWORD PTR [ebp – 0x04]
Slide 36
x32 Call Convention Details
add():
push 4 push ebp
push 3 mov ebp, esp,
push EIP sub esp, 0x10
jmp add
Slide 37
Function Prolog
x32 Call Convention - Function Prolog
…
push 4
EBP SIP
push 3 SFP
call add
ESP c
From:
<main>
…
Slide 39
x32 Call Convention - Function Prolog
…
push 4
EBP SIP
push 3 SFP
call add
ESP c
From:
<main>
… 4
Slide 40
x32 Call Convention - Function Prolog
…
push 4
EBP SIP
push 3 SFP
call add
ESP c
From:
<main>
… 4
EIP 3
Slide 41
x32 Call Convention - Function Prolog
…
push 4
EBP SIP
push 3 SFP
call add
ESP c
From:
<main>
… 4
EIP 3
SIP (= EIP)
push ebp
mov ebp, esp
sub esp, 0x10
…
push 4
EBP SIP
push 3 SFP
call add
ESP c
From:
<main>
… 4
EIP 3
SIP (= old EIP)
push ebp
mov ebp, esp
sub esp, 0x10
push ebp
mov ebp, esp
EBP SIP
From:
<add>
Slide 44
x32 Call Convention - Function Prolog
push ebp
mov ebp, esp
EBP SIP
From:
<add>
Slide 45
x32 Call Convention - Function Prolog
push ebp
mov ebp, esp
EBP SIP
From:
<add>
Slide 46
x32 Call Convention - Function Prolog
push ebp
mov ebp, esp
EBP SIP
From:
<add>
Slide 47
Execute Function
x32 Call Convention - Execute Function
EBP SIP
SFP
From:
c
<main>
mov eax, DWORD PTR [ebp + 0xc] 4 EBP+0xc
mov edx, DWORD PTR [ebp + 0x8] 3 EBP+0x8
add eax, edx
SIP
mov DWORD PTR [ebp – 0x04], eax
SBP
mov eax, DWORD PTR [ebp – 0x04]
sum EBP-0x04 From:
<add>
Slide 49
Function Epilog
x32 Call Convention - Function Epilog
push ebp
mov ebp, esp
EBP SIP
From:
<add>
Slide 51
x32 Call Convention - Function Epilog
push ebp
mov ebp, esp
EBP SIP
From:
<add>
Slide 52
x32 Call Convention - Function Epilog
push ebp
mov ebp, esp
EBP SIP
Slide 53
x32 Call Convention - Function Epilog
push ebp
mov ebp, esp
EBP SIP
Slide 54
x32 Call Convention - Function Epilog
push ebp
mov ebp, esp
EBP SIP
push 4
push 3
push EIP
jmp add
…
Slide 55
x32 Call Convention - Function Calling
call <addr> =
push EIP
jmp <addr>
leave =
mov esp, ebp
pop ebp
ret =
pop eip
Slide 56
x32 Call Convention - Function Calling
Why “leave”?
Opposite of “enter”
“enter”:
push ebp
mov ebp, esp
sub esp, imm
Slide 57
x32 Call Convention - Function Calling
Recap:
When a function is called:
EIP is pushed on the stack (=SIP)
(“call” is doing implicit “push EIP”)
Slide 58
Accessing the Stack
Accessing the stack: triple view
SIP 0x1014
EBP SFP 0x1010
c 0x100C
4 0x1008
ESP 3 0x1004
0x1000
A) push 0x1
B) mov [ebp-0x10], 0x1
C) mov eax, 0x1000
mov [eax], 0x1
Slide 60
Function Calls in x64
x32 Call Convention - Function Call in x64
Slide 62
x32 Call Convention - Function Call in x64
Slide 63
x32 Call Convention - Function Call in x64
Slide 64
Function Call Convention Cheat Sheet
http://stackoverflow.com/questions/2535989/what-are-the-calling-conventions-for-unix-linux-system-calls-on-x86-64
Slide 65
EBP Cheat Sheet
SIP
SFP
c
EBP+0x0C 4 (argument 2)
EBP+0x08 3 (argument 1)
EBP+0x04 SIP
EBP SBP
EBP-0x04 sum (local var)
(local buffer)
ESP EBP-0x50
Slide 66
EBP Cheat Sheet
Slide 67
Outro
Further questions
Slide 69
Answers
Pseudocode:
pop <register>:
mov <register>, (%eax)
add eax, 4
Slide 70