Outline
• Background Knowledge
• Stack Frame
• Function Calling Convention
• Buffer Overflow
• Exploit
• Shellcode
• Return to text
• Return to libc
• Bypass stack guard
3
Slide 4
Slide 4 text
Stack Frame
• Stack: LIFO (Last In First Out)
Last
Second
First
Last
Second
First
PUSH POP
Low Address
High Address
Stack growth
4
Slide 5
Slide 5 text
Function Call & Stack
1. Call Function
2. Back to main to
continue execution
5
Slide 6
Slide 6 text
Function Call & Stack
• Function 跑完後,程式需要回到原本呼叫 function 的下⼀一
⾏行行去執⾏行行,⽽而程式就是利利⽤用 stack 來來記錄下⼀一⾏行行指令
Back to here to continue Jump to 0x0804840b to execute Func
6
Slide 7
Slide 7 text
Function Call & Stack
• Caller Part
• ESP: Stack Pointer
• void Func(int a, int b)
• …
Stack
ESP
growth
Low
High
push b
push a
call Func
7
Slide 8
Slide 8 text
Function Call & Stack
• Caller Part
• ESP: Stack Pointer
• void Func(int a, int b)
• …
b
Stack
ESP
growth
Low
High
push b
push a
call Func
8
Slide 9
Slide 9 text
Function Call & Stack
• Caller Part
• ESP: Stack Pointer
• void Func(int a, int b)
• …
a
b
Stack
ESP
growth
Low
High
push b
push a
call Func
9
Slide 10
Slide 10 text
Function Call & Stack
• Caller Part
• Return Address: call Func 下⼀一⾏行行
指令的位址
• void Func(int a, int b)
• …
Return Address
a
b
Stack
ESP
growth
Low
High
push b
push a
call Func
10
Slide 11
Slide 11 text
Function Call & Stack
• Callee Part
• 此時的 EBP 記錄著 main stack
frame base 的位址
• void Func(int a, int b)
char buf[12]; Previous ebp
Return Address
a
b
Stack
ESP growth
Low
High
push ebp
mov ebp, esp
sub esp, 0xc
=======
Main Stack Frame
Func Stack Frame
11
Slide 12
Slide 12 text
Function Call & Stack
• Callee Part
• 此時的 EBP 記錄著 Func stack
frame base 的位址
• void Func(int a, int b)
char buf[12]; Previous ebp
Return Address
a
b
Stack
EBP = ESP growth
Low
High
push ebp
mov ebp, esp
sub esp, 0xc
=======
Main Stack Frame
Func Stack Frame
12
Slide 13
Slide 13 text
Function Call & Stack
• Callee Part
• void Func(int a, int b)
char buf[12];
buf[0]~[3]
buf[4]~[7]
buf[8]~[11]
Previous ebp
Return Address
a
b
Stack
EBP growth
Low
High
push ebp
mov ebp, esp
sub esp, 0xc
13
ESP
buffer
Slide 14
Slide 14 text
Function Call & Stack
• void Func(int a, int b)
char buf[12];
buf[0]~[3]
buf[4]~[7]
buf[8]~[11]
Previous ebp
Return Address
a
b
Stack
EBP growth
Low
High
push ebp
mov ebp, esp
sub esp, 0xc
…
14
buffer
EBP + 0x4
EBP + 0x8
EBP + 0xc
EBP - 0x4
EBP - 0x8
EBP - 0xc
Slide 15
Slide 15 text
Buffer Overflow
• 程式本⾝身沒有正確檢查輸入的⼤大⼩小,如果輸入的⼤大⼩小比
buffer 還要⼤大就會蓋到其他變數影響程式的執⾏行行 (控制變數
or 控制程式流程)
15
Stack Overflow
• void Func(int a, int b)
char buf[12];
gets(buf); buf[0]~[3]
buf[4]~[7]
buf[8]~[11]
Previous ebp
Return Address
a
b
Stack
EBP growth
Low
High
17
ESP
buffer
Slide 18
Slide 18 text
Stack Overflow
• aaaaaaaaaaaa(a * 12)
aaaa
aaaa
aaaa
Previous ebp
Return Address
a
b
Stack
EBP growth
Low
High
18
ESP
buffer