Shellcode
The
good
news is that now we have a way of controlling
program flow. At this point we need
what is commonly referred to as
shellcode
.
Shellcode is a set of assembly instructions in which program flow can
be redirected and perform some functionality. The term
“shellcode” was coined to reflect
the fact that it contains Assembly instructions that execute a shell
(command interpreter), often at higher privilege levels. But where
should we place this shellcode? Because we already used our user
input buffer to take control of EIP, there is no reason we
can’t use the same buffer to serve a dual purpose by
also including the shellcode directly in the buffer. Because this
overflow is occurs in a C-style string, we should write the shellcode
to avoid the NULL
delimiting byte.
In an ideal world of exploitation, the top of the stack wouldn’t move and we could jump to this known location every time. But in the real world of remote exploits many factors affect where the top of the stack will be on program return, so we need a solution for dealing with these variations in where our shellcode will lie.
One way of dealing with this problem is to use what is commonly known as a NOP sled . The NOP assembly instruction performs “no operation.” It basically does nothing and has no effect on any CPU registers or flags. What is good about this is that we can prepend our shellcode with a buffer that consists solely of the bytes that represent the NOP instruction; on x86 architecture this is ...
Get Network Security Tools now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.