Czy inteligentnie przypisuje się pamięć do algorytmu gcc, aby zapobiec atakowi przepełnienia bufora?Problem z przydziałem pamięci gcc - atak przepełnienia buforu
int function(char *str) {
int a = 0; // See the
char b[16] = "abcd"; // changes here
if(!strcmp(b, str))
a = 1;
return a;
}
i
int function(char *str) {
char b[16] = "abcd"; // See the
int a = 0; // changes here
if(!strcmp(b, str))
a = 1;
return a;
}
Kiedy debugowanie z gdb, zawsze alokacji pamięci, pierwszą liczbę całkowitą zmiennych, a następnie układ znaków; bez względu na kolejność deklaracji zmiennych. tj. W powyższych przypadkach kompilator przydziela pamięć najpierw do a
, a następnie do b
.
(higher address)
Memory
| |
| |
+--------+
| |
| |
| |
| |
+--------+ <----- b (16 bytes)
| |
+--------+ <----- a (4 bytes)
| |
(lower address)
Tak więc, nawet jeśli będziemy dostarczać więcej niż 16 znaków w str
, nie może wpływać na wartość a
. Czy ktoś może mi tutaj pomóc?
Dziękuję.
_Standard_ umożliwia takie porządkowanie w dowolnych celach, które chce wykonać kompilator. Najczęściej - optymalizacja. To wciąż "inteligencja", ale nie do zapobiegania "atakowi przepełnienia bufora". I nadal jest niezdefiniowanym zachowaniem_ (przepełnienie bufora) –