Мне нужно использовать уязвимость буфера в приведенном ниже коде, используя строку командных кодов оболочки. Я видел почти все, что предлагал Google, но эта конкретная проблема меня путает из-за разделения функций.Обратный адрес из отдельной функции при использовании уязвимости буфера
void printThis(){
if(printf("You did it 1!") >=0) exit(0);
if(printf("You did it 2!") >=0) exit(0);
if(printf("You did it 3!") >=0) exit(0);
}
void readIn(FILE *f){
char exploit[12];
int i;
fscanf(f, "%s", exploit);
for(i = 0; i < 12; i++){
printf("%c", exploit[i]);
}
printf("\"\n");
}
int main(int argc, char** argv){
FILE *fp;
fp = fopen(argv[1], "r");
readIn(fp);
fclose(fp);
printf("You suck at exploiting. I should not be printed.");
}
Я любопытно, как переполнение буфера в readIn()
с обратным адресом заявления в printThis()
, поскольку они используют различные стеки. Интуиция говорит, что переход к вызову на печать будет работать, но я не смог заставить его работать.
Любые предложения по получению информации, необходимой для полезной нагрузки в GDB? Спасибо за вашу помощь!
Я думаю, вам нужно переполнить 'exploit', пока адрес возврата стека стека' readIn' не будет заменен адресом 'printThis'. Как это сделать, зависит от архитектуры, для которой построена программа. – Diego
Я понимаю, что @Diego. Скажем, в 'printThis' есть 100' printf' операторов, и я хочу вернуть определенную строку, которая находится в '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ' Нужно ли вставлять строку вручную или я могу вернуть адрес, где хранятся данные? Благодарю. – user3242611
Я думаю, вы не можете просто прыгнуть в середину функции и ожидать ее работы. Обычно содержат пролог, который устанавливает регистры, связанные с стеком, и т. Д. Если, конечно, стек не исполняется, и вы делаете это в полезной нагрузке. Но все зависит от фактического машинного кода. Источник C не так важен. – Diego