я шел через вопросы безопасности в C. Я не мог понять код, приведенный ниже, как это портит стек,переполнение буфера в стеке
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int chk_perm(){
printf("\n Check Perm \n");
return 2;
}
int main(int argc,char* argv[]){
int fg;
char filename[16];
if(argc != 2){
fprintf(stderr,"Usage : %s filename\n",argv[0]);
exit(1);
}
fg = chk_perm();
strcpy(filename,argv[1]);
if(fg == 0xdeadbeef){
//execute as root or deposit million dollars in bank account
}
else{
//execute as a normal user , deduct $10 from an account
}
return 0;
}
ARGV [1] прошло, может изменить значение фг. Сказано, что коррупция произойдет, если argv [1] передал целый двоичный код, который может вызвать нежелательные результаты, может быть передан как аргумент вместе с обратным адресом.
Я не мог понять, как strcpy повреждает стек check_perm таким образом, что значение fg изменяется.
Мое предположение о программе,
Когда программа начинает работу, он создает стек для основной функции и положить свои аргументы, обратный адрес, локальные переменные на Int фг stack.So будет занимать 4 байта (08567500 loc) стека и имени файла [16] будут занимать следующие 16 байт (08567504). Даже если имя файла переполнено более чем 16 байтами, оно может испортиться, если после него появилась какая-либо локальная переменная.
Так как fg получает повреждение из-за strcpy (имя файла, argv [1]);
Это единственный ответ, который правильно учитывает направление роста стекол, а также –
@NPE: Спасибо. Я проверил адрес fg и имя файла. fg помещается под именем файла. Но у меня есть сомнения. когда стек загружается, параметры, адрес возврата, локальные переменные сохраняются в стек в порядке. Поэтому локальные переменные fg должны получить наивысший адрес, чем имя файла. И имя файла массива растет от более низкого к более высокому sddress. Почему имя файла имеет самый высокий адрес, чем fg. – Angus
@Angus: Возможно, тот, кто написал пример, говорил о системе с нисходящим стеком, но система, на которую вы протестировали, использует верхний стек. – aschepler