Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
#include <stdio.h>
void **ret;
void *leave;
void foo(){
void (*boo)(void); //указатель на функцию
printf("Stack rewrite!\n");
boo = (void (*)(void))leave;
boo(); // fini()
}
int main(int argc, char *argv[], char *envp[]) {
int a[123] = {0};
unsigned long int mark = 0xbfbfbfbfbfbfbfbf; //метка, от которой будем работать
ret = (void**)(&mark+2); // извлекаем адрес, функции, вызываемой после завершения (fini)
leave = *ret; // запоминаем
*ret = (void*)foo; // перетираем
return 0; // вызов функции foo()
}
int main[] = {1, 2, 3};
Несколько подробностей о функции main