SlideShare a Scribd company logo
CNIT 127: Exploit Development



Ch 3: Shellcode
Updated 2-2-18
Topics
• Protection rings
• Syscalls
• Shellcode
• nasm Assembler
• ld GNU Linker
• objdump to see contents of object files
• strace System Call Tracer
• Removing Nulls
• Spawning a Shell
Understanding System Calls
Shellcode
• Written in assembler
• Translated into hexadecimal opcodes
• Intended to inject into a system by
exploiting a vulnerability
• Typically spawns a root shell, but may do
something else
System Calls (or Syscalls)
• Syscalls directly access the kernel, to:
– Get input
– Produce output
– Exit a process
– Execute a binary file
– And more
• They are the interface between protected
kernel mode and user mode
Protection Rings
• Although the x86
provides four
rings, only rings 0
and 3 are used by
Windows or Unix
• Ring 3 is user-
land
• Ring 0 is kernel-
land
• Links Ch 3a-3c
Protecting the Kernel
• Protected kernel mode
– Prevents user applications from compromising
the OS
• If a user mode program attempts to
access kernel memory, this generates an
access exception
• Syscalls are the interface between user
mode and kernel mode
Libc
• C library wrapper
• C functions that perform syscalls
• Advantages of libc
– Allows programs to continue to function
normally even if a syscall is changed
– Provides useful functions, like malloc
– (malloc allocates space on the heap)
• See link Ch 3d
Syscalls use INT 0x80
1. Load syscall number into EAX
2. Put arguments in other registers
3. Execute INT 0x80
4. CPU switches to kernel mode
5. Syscall function executes
Syscall Number and Arguments
• Syscall number is an integer in EAX
• Up to six arguments are loaded into
– EBX, ECX, EDX, ESI, EDI, and EBP
• For more than six arguments, the first
argument holds a pointer to a data
structure
exit()
• The libc exit function does a lot of
preparation, carefully covering many
possible situations, and then calls SYSCALL
to exit
Disassembling exit
• gdb e
– disassemble main
– disassemble exit
– disassemble __run_exit_handlers
• All that stuff is error handling, to prepare
for the syscall, which is at the label _exit
• disassemble _exit
Disassembling _exit
• syscall 252 (0xfc), exit_group() (kill all threads)
• syscall 1, exit() (kill calling thread)
– Link Ch 3e
Writing Shellcode for the
exit() Syscall
Shellcode Size
• Shellcode should be as simple and
compact as possible
• Because vulnerabilities often only allow a
small number of injected bytes
– It therefore lacks error-handling, and will
crash easily
Seven Instructions
• exit_group
• exit
sys_exit Syscall
• Two arguments: eax=1, ebx is return value
(0 in our case)
• Link Ch 3m
Simplest code for exit(0)
nasm and ld
• nasm creates object file
• ld links it, creating an executable ELF file
objdump
• Shows the contents of object files
C Code to Test Shellcode
• From link Ch 3k
• Textbook version explained at link Ch 3i
Compile and Run
• Textbook omits the "-z execstack" option
• It's required now or you get a segfault
• Next, we'll use "strace" to see all system
calls when this program runs
• That shows a lot of complex calls, and
"exit(0)" at the end
Using strace
• apt-get install strace
Injectable Shellcode
Getting Rid of Nulls
• We have null bytes, which will terminate
a string and break the exploit
Replacing Instructions
• This instruction contains nulls
– mov ebx,0
• This one doesn't
– xor ebx,ebx
• This instruction contains nulls, because it
moves 32 bits
– mov eax,1
• This one doesn't, moving only 8 bits
– mov al, 1
OLD NEW
objdump of New Exit Shellcode
Spawning a Shell
Beyond exit()
• The exit() shellcode stops the program, so
it just a DoS attack
• Any illegal instruction can make the
program crash, so that's of no use
• We want shellcode that offers the
attacker a shell, so the attacker can type
in arbitrary commands
Five Steps to Shellcode
1. Write high-level code
2. Compile and disassemble
3. Analyze the assembly
4. Clean up assembly, remove nulls
5. Extract commands and create shellcode
fork() and execve()
• Two ways to create a new process in Linux
• Replace a running process
– Uses execve()
• Copy a running process to create a new
one
– Uses fork() and execve() together
C Program to Use execve()
• See link Ch 3l
Recompile with Static
• Static linking preserves our execve syscall
• objdump of main is long, but we only care
about main and __execve
main()
• Pushes 3 Arguments
• Calls __execve
Man Page
• execve() takes three arguments
execve() Arguments
1. Pointer to a string containing the name
of the program to execute
– "/bin/sh"
2. Pointer to argument array
– happy
3. Pointer to environment array
– NULL
Objdump of __execve
• Puts four parameters into edx, ecx, ebx,
and eax
• INT 80
CNIT 127 Ch 3: Shellcode

More Related Content

PDF
CNIT 127 Ch 3: Shellcode
PDF
CNIT 127: 3: Shellcode
PDF
CNIT 127: Ch 2: Stack Overflows in Linux
PDF
CNIT 127 Ch 3: Shellcode
PDF
CNIT 127 Ch 6: The Wild World of Windows
PDF
CNIT 127 Ch 3: Shellcode
PDF
CNIT 127 Ch Ch 1: Before you Begin
PDF
CNIT 127 Ch 8: Windows overflows (Part 1)
CNIT 127 Ch 3: Shellcode
CNIT 127: 3: Shellcode
CNIT 127: Ch 2: Stack Overflows in Linux
CNIT 127 Ch 3: Shellcode
CNIT 127 Ch 6: The Wild World of Windows
CNIT 127 Ch 3: Shellcode
CNIT 127 Ch Ch 1: Before you Begin
CNIT 127 Ch 8: Windows overflows (Part 1)

What's hot (20)

PDF
127 Ch 2: Stack overflows on Linux
PDF
CNIT 127 14: Protection Mechanisms
PDF
CNIT 127 14: Protection Mechanisms
PDF
CNIT 127 Lecture 7: Intro to 64-Bit Assembler (not in book)
PDF
CNIT 127: Ch 8: Windows overflows (Part 1)
PDF
CNIT 127: Ch 18: Source Code Auditing
PDF
CNIT 127 Ch 2: Stack overflows on Linux
PDF
CNIT 127 Lecture 7: Intro to 64-Bit Assembler
PDF
CNIT 127: Ch 3: Shellcode
PDF
Ch 2: TCP/IP Concepts Review
PDF
CNIT 127 Ch 4: Introduction to format string bugs (rev. 2-9-17)
PDF
CNIT 127 Ch 2: Stack overflows on Linux
PDF
CNIT 127 Ch 1: Before you Begin
PDF
CNIT 127 Ch 4: Introduction to format string bugs
PPT
Practical Malware Analysis: Ch 7: Analyzing Malicious Windows Programs
PDF
CNIT 127: 8: Windows overflows (Part 2)
PDF
CNIT 126: 10: Kernel Debugging with WinDbg
PDF
Practical Malware Analysis Ch12
PDF
CNIT 126 9: OllyDbg
PDF
CNIT 126 Ch 7: Analyzing Malicious Windows Programs
127 Ch 2: Stack overflows on Linux
CNIT 127 14: Protection Mechanisms
CNIT 127 14: Protection Mechanisms
CNIT 127 Lecture 7: Intro to 64-Bit Assembler (not in book)
CNIT 127: Ch 8: Windows overflows (Part 1)
CNIT 127: Ch 18: Source Code Auditing
CNIT 127 Ch 2: Stack overflows on Linux
CNIT 127 Lecture 7: Intro to 64-Bit Assembler
CNIT 127: Ch 3: Shellcode
Ch 2: TCP/IP Concepts Review
CNIT 127 Ch 4: Introduction to format string bugs (rev. 2-9-17)
CNIT 127 Ch 2: Stack overflows on Linux
CNIT 127 Ch 1: Before you Begin
CNIT 127 Ch 4: Introduction to format string bugs
Practical Malware Analysis: Ch 7: Analyzing Malicious Windows Programs
CNIT 127: 8: Windows overflows (Part 2)
CNIT 126: 10: Kernel Debugging with WinDbg
Practical Malware Analysis Ch12
CNIT 126 9: OllyDbg
CNIT 126 Ch 7: Analyzing Malicious Windows Programs
Ad

Similar to CNIT 127 Ch 3: Shellcode (20)

PDF
Shellcoding in linux
PDF
Shellcode Disassembling - Reverse Engineering
PDF
Linux Shellcode disassembling
PDF
NDC TechTown 2023_ Return Oriented Programming an introduction.pdf
PDF
Return Oriented Programming, an introduction
PDF
N_Asm Assembly system calls (sol)
PDF
Software Vulnerabilities in C and C++ (CppCon 2018)
PPTX
OS SERVICES.pptxJGHHHHHHHHHHHHHHHHGGGGGGGG
ODP
null Pune meet - Application Security: Code injection
PDF
Shellcoding, an Introduction
PDF
X86 assembly nasm syntax
ODP
Design and implementation_of_shellcodes
PPT
1. Von Neumann + Booting Sequence + System Calls.ppt
PPT
Advanced c programming in Linux
PPTX
Tranning-2
ODP
Design and Implementation of Shellcodes.
PDF
CyberLink LabelPrint 2.5 Exploitation Process
PPTX
Advanced Bulkification Strategies in Apex Triggers
PPT
LINUX Device Drivers
PPTX
NASM Introduction.pptx
Shellcoding in linux
Shellcode Disassembling - Reverse Engineering
Linux Shellcode disassembling
NDC TechTown 2023_ Return Oriented Programming an introduction.pdf
Return Oriented Programming, an introduction
N_Asm Assembly system calls (sol)
Software Vulnerabilities in C and C++ (CppCon 2018)
OS SERVICES.pptxJGHHHHHHHHHHHHHHHHGGGGGGGG
null Pune meet - Application Security: Code injection
Shellcoding, an Introduction
X86 assembly nasm syntax
Design and implementation_of_shellcodes
1. Von Neumann + Booting Sequence + System Calls.ppt
Advanced c programming in Linux
Tranning-2
Design and Implementation of Shellcodes.
CyberLink LabelPrint 2.5 Exploitation Process
Advanced Bulkification Strategies in Apex Triggers
LINUX Device Drivers
NASM Introduction.pptx
Ad

More from Sam Bowne (20)

PDF
Introduction to the Class & CISSP Certification
PDF
Cyberwar
PDF
3: DNS vulnerabilities
PDF
8. Software Development Security
PDF
4 Mapping the Application
PDF
3. Attacking iOS Applications (Part 2)
PDF
12 Elliptic Curves
PDF
11. Diffie-Hellman
PDF
2a Analyzing iOS Apps Part 1
PDF
9 Writing Secure Android Applications
PDF
12 Investigating Windows Systems (Part 2 of 3)
PDF
10 RSA
PDF
12 Investigating Windows Systems (Part 1 of 3
PDF
9. Hard Problems
PDF
8 Android Implementation Issues (Part 1)
PDF
11 Analysis Methodology
PDF
8. Authenticated Encryption
PDF
7. Attacking Android Applications (Part 2)
PDF
7. Attacking Android Applications (Part 1)
PDF
5. Stream Ciphers
Introduction to the Class & CISSP Certification
Cyberwar
3: DNS vulnerabilities
8. Software Development Security
4 Mapping the Application
3. Attacking iOS Applications (Part 2)
12 Elliptic Curves
11. Diffie-Hellman
2a Analyzing iOS Apps Part 1
9 Writing Secure Android Applications
12 Investigating Windows Systems (Part 2 of 3)
10 RSA
12 Investigating Windows Systems (Part 1 of 3
9. Hard Problems
8 Android Implementation Issues (Part 1)
11 Analysis Methodology
8. Authenticated Encryption
7. Attacking Android Applications (Part 2)
7. Attacking Android Applications (Part 1)
5. Stream Ciphers

Recently uploaded (20)

PPTX
GDM (1) (1).pptx small presentation for students
PDF
O7-L3 Supply Chain Operations - ICLT Program
PDF
2.FourierTransform-ShortQuestionswithAnswers.pdf
PDF
TR - Agricultural Crops Production NC III.pdf
PDF
Module 4: Burden of Disease Tutorial Slides S2 2025
PPTX
human mycosis Human fungal infections are called human mycosis..pptx
PDF
Sports Quiz easy sports quiz sports quiz
PPTX
Lesson notes of climatology university.
PDF
Classroom Observation Tools for Teachers
PDF
Microbial disease of the cardiovascular and lymphatic systems
PDF
grade 11-chemistry_fetena_net_5883.pdf teacher guide for all student
PDF
VCE English Exam - Section C Student Revision Booklet
PPTX
master seminar digital applications in india
PDF
3rd Neelam Sanjeevareddy Memorial Lecture.pdf
PPTX
Pharma ospi slides which help in ospi learning
PDF
The Lost Whites of Pakistan by Jahanzaib Mughal.pdf
PDF
Supply Chain Operations Speaking Notes -ICLT Program
PDF
01-Introduction-to-Information-Management.pdf
PDF
Anesthesia in Laparoscopic Surgery in India
PPTX
1st Inaugural Professorial Lecture held on 19th February 2020 (Governance and...
GDM (1) (1).pptx small presentation for students
O7-L3 Supply Chain Operations - ICLT Program
2.FourierTransform-ShortQuestionswithAnswers.pdf
TR - Agricultural Crops Production NC III.pdf
Module 4: Burden of Disease Tutorial Slides S2 2025
human mycosis Human fungal infections are called human mycosis..pptx
Sports Quiz easy sports quiz sports quiz
Lesson notes of climatology university.
Classroom Observation Tools for Teachers
Microbial disease of the cardiovascular and lymphatic systems
grade 11-chemistry_fetena_net_5883.pdf teacher guide for all student
VCE English Exam - Section C Student Revision Booklet
master seminar digital applications in india
3rd Neelam Sanjeevareddy Memorial Lecture.pdf
Pharma ospi slides which help in ospi learning
The Lost Whites of Pakistan by Jahanzaib Mughal.pdf
Supply Chain Operations Speaking Notes -ICLT Program
01-Introduction-to-Information-Management.pdf
Anesthesia in Laparoscopic Surgery in India
1st Inaugural Professorial Lecture held on 19th February 2020 (Governance and...

CNIT 127 Ch 3: Shellcode

  • 1. CNIT 127: Exploit Development
 
 Ch 3: Shellcode Updated 2-2-18
  • 2. Topics • Protection rings • Syscalls • Shellcode • nasm Assembler • ld GNU Linker • objdump to see contents of object files • strace System Call Tracer • Removing Nulls • Spawning a Shell
  • 4. Shellcode • Written in assembler • Translated into hexadecimal opcodes • Intended to inject into a system by exploiting a vulnerability • Typically spawns a root shell, but may do something else
  • 5. System Calls (or Syscalls) • Syscalls directly access the kernel, to: – Get input – Produce output – Exit a process – Execute a binary file – And more • They are the interface between protected kernel mode and user mode
  • 6. Protection Rings • Although the x86 provides four rings, only rings 0 and 3 are used by Windows or Unix • Ring 3 is user- land • Ring 0 is kernel- land • Links Ch 3a-3c
  • 7. Protecting the Kernel • Protected kernel mode – Prevents user applications from compromising the OS • If a user mode program attempts to access kernel memory, this generates an access exception • Syscalls are the interface between user mode and kernel mode
  • 8. Libc • C library wrapper • C functions that perform syscalls • Advantages of libc – Allows programs to continue to function normally even if a syscall is changed – Provides useful functions, like malloc – (malloc allocates space on the heap) • See link Ch 3d
  • 9. Syscalls use INT 0x80 1. Load syscall number into EAX 2. Put arguments in other registers 3. Execute INT 0x80 4. CPU switches to kernel mode 5. Syscall function executes
  • 10. Syscall Number and Arguments • Syscall number is an integer in EAX • Up to six arguments are loaded into – EBX, ECX, EDX, ESI, EDI, and EBP • For more than six arguments, the first argument holds a pointer to a data structure
  • 11. exit() • The libc exit function does a lot of preparation, carefully covering many possible situations, and then calls SYSCALL to exit
  • 12. Disassembling exit • gdb e – disassemble main – disassemble exit – disassemble __run_exit_handlers • All that stuff is error handling, to prepare for the syscall, which is at the label _exit • disassemble _exit
  • 13. Disassembling _exit • syscall 252 (0xfc), exit_group() (kill all threads) • syscall 1, exit() (kill calling thread) – Link Ch 3e
  • 14. Writing Shellcode for the exit() Syscall
  • 15. Shellcode Size • Shellcode should be as simple and compact as possible • Because vulnerabilities often only allow a small number of injected bytes – It therefore lacks error-handling, and will crash easily
  • 17. sys_exit Syscall • Two arguments: eax=1, ebx is return value (0 in our case) • Link Ch 3m
  • 18. Simplest code for exit(0)
  • 19. nasm and ld • nasm creates object file • ld links it, creating an executable ELF file
  • 20. objdump • Shows the contents of object files
  • 21. C Code to Test Shellcode • From link Ch 3k • Textbook version explained at link Ch 3i
  • 22. Compile and Run • Textbook omits the "-z execstack" option • It's required now or you get a segfault • Next, we'll use "strace" to see all system calls when this program runs • That shows a lot of complex calls, and "exit(0)" at the end
  • 23. Using strace • apt-get install strace
  • 25. Getting Rid of Nulls • We have null bytes, which will terminate a string and break the exploit
  • 26. Replacing Instructions • This instruction contains nulls – mov ebx,0 • This one doesn't – xor ebx,ebx • This instruction contains nulls, because it moves 32 bits – mov eax,1 • This one doesn't, moving only 8 bits – mov al, 1
  • 28. objdump of New Exit Shellcode
  • 30. Beyond exit() • The exit() shellcode stops the program, so it just a DoS attack • Any illegal instruction can make the program crash, so that's of no use • We want shellcode that offers the attacker a shell, so the attacker can type in arbitrary commands
  • 31. Five Steps to Shellcode 1. Write high-level code 2. Compile and disassemble 3. Analyze the assembly 4. Clean up assembly, remove nulls 5. Extract commands and create shellcode
  • 32. fork() and execve() • Two ways to create a new process in Linux • Replace a running process – Uses execve() • Copy a running process to create a new one – Uses fork() and execve() together
  • 33. C Program to Use execve() • See link Ch 3l
  • 34. Recompile with Static • Static linking preserves our execve syscall • objdump of main is long, but we only care about main and __execve
  • 35. main() • Pushes 3 Arguments • Calls __execve
  • 36. Man Page • execve() takes three arguments
  • 37. execve() Arguments 1. Pointer to a string containing the name of the program to execute – "/bin/sh" 2. Pointer to argument array – happy 3. Pointer to environment array – NULL
  • 38. Objdump of __execve • Puts four parameters into edx, ecx, ebx, and eax • INT 80