Добрый день всем!
Я пытаюсь понять, как работает переполнение буфера. Сейчас я нахожусь в процессе определения адреса обратного адреса функции, который я должен изменить, чтобы выполнить атаку переполнения буфера. Я написал простую программу, основанную на примере, который я прочитал в Интернете. Эта программа создает целочисленный указатель для хранения адреса адреса возврата функции в стеке. Для этого (если я понимаю, как переменные функции / программы организованы в стеке), я добавляю 8 к адресу переменной буфера и устанавливаю его в качестве значения ret. Я не делаю здесь ничего, что изменило бы адрес, указанный в адресе возврата func.
ОБНОВЛЕНИЕ: Я немного изменил программу, поэтому она печатает адрес стека параметра func a. Как вы можете видеть, расстояние между a и буфером составляет около 8 байтов, так что это, вероятно, будет означать, исходя из схемы стека, что сохраненный FP и старый EIP (адрес возврата func) находится между ними. Я прав?
Вот программа:
void func( int a){
char buffer[3];
int *ret;
ret = buffer + 11; // this is the configuratio which made the whole program works... This now points to the address containing func's return address
printf (" address of a is %d\n", &a);
printf ("address of buffer is %x\n", buffer);
printf ("address of ret is %x\n", ret);
printf ("value of ret is %x\n", (*ret));
}
void main(){
int num;
num = 0;
func(num);
num = 1;
printf("Num now is %d", num);
}
Вывод программы при получении:
альтернативный текст http://img20.imageshack.us/img20/2034/72783404.png
Как видите, я печатаю адрес буфера переменных и ret. Я добавил дополнительный оператор, печатающий значение переменной ret (предполагаемое расположение обратного адреса func, поэтому следует напечатать адрес следующей инструкции, которая будет выполнена после возврата func из выполнения).
Вот дамп, который показывает предполагаемый адрес инструкции, которая будет выполнена после возврата func. (Подчеркнуто зеленым) Как видите, это значение сильно отличается от напечатанного значения, содержащегося в переменной ret.
альтернативный текст http://img717.imageshack.us/img717/8273/assemblycodecopy.png
Мой вопрос: почему они разные? (конечно в предположении, что все, что я сделал, все правильно).
Иначе, что я сделал не так? Мое понимание стека выполнения программы неверно? Пожалуйста, помогите мне понять это. Мой проект должен выйти через неделю, и я его почти не трогал. Прошу прощения, если я требую, мне очень нужна ваша помощь.