2013-07-14 3 views
3

Я следую за «Smashing the Stack for fun and profit» http://insecure.org/stf/smashstack.html.Smashing the stack: Почему этот код работает?

Интересно, почему мой код работает, хотя я написал его, чтобы сделать ошибку сегментации.

#include <stdio.h> 
#include <string.h> 

void function(char *str){ 
    char buffer[16]; 
    strcpy(buffer, str); 
} 

int main(void) 
{ 
    char large_string[256]; 
    int i; 

    for(i = 0; i < 255; i++) 
     large_string[i]; 

    function(large_string); 
    return 0; 
} 
+0

Нет ли чего-то недостающего в корпусе для петли? Думаю, это своего рода неполное заявление. – junix

+3

bcoz даже ошибка сегментации не определен в случае неопределенного поведения :) – VoidPointer

+0

@junix неполный, но не вне допустимого диапазона –

ответ

6

Это просто потому, что ваш large_string не инициализирован: она содержит мусор, и его длина (количество байт до '\0'), скорее всего, намного меньше 256 (например, на моей машине четвертый байт large_string равен нулю, поэтому strcpy копирует всего 4 байта).

Сделать

for(i = 0; i < 254; i++) 
    large_string[i] = 'A'; 
large_string[255] = '\0'; 

и вы получите ошибку сегментации.

0

вы инициализация строки в large_string[256];, а затем пройти через эти предметы. вы не проходите границы массива, чтобы не было ошибок сегментации.

, если вы поставите значения в массиве, то программа даст сбой, потому что strcpy будет вылез из диапазона

+1

Это справедливо только в том случае, если один из первых 16 элементов large_string является «\ 0». В противном случае strcpy должен взорвать пределы буфера, объявленного в функции. – junix

+1

'large_string' не инициализируется и содержит мусор. 'strcpy' копирует данные до первого' \ 0'. Здесь просто повезло. – Inspired

+0

true, что я добавлю это к комментарию –

0

Вы не инициализировали large_string должным образом.

После цикла for добавьте нулевой символ в конце массива \0, который может помочь.

large_string[255] = '\0'; 

И лучше инициализировать массив, а теперь он помещает значения мусора.

for(i = 0; i < 255; i++) 
    large_string[i] = 'a'; 

Edit:

Как и в комментариях, junix сказал - Более важным является то, что нет \0, по крайней мере, 16 байт, чем имея \ 0 в байте 255, чтобы вызвать стек smash ;-)

+1

Я бы сказал, что более важно, чтобы не было '\ 0' для не менее 16 байтов, чем наличие' \ 0' в байте 255, чтобы спровоцировать разбить стек;) – junix

+0

Да, точно - Согласен с тобой. –

1

Возможно, реализация для инициализации large_string для всех ноль. И strcpy фактически копирует пустую строку.

for(i = 0; i < 255; i++) 
    large_string[i] = 'a'; 

Это приведет к ошибке сегментации.