Зачем приводить «extern Put» к указателю функции «(void (*) (char *)) & Put»?

Я смотрю пример abo3.c из Небезопасное программирование и я ' m не гроклю отливку в примере ниже. Может кто меня просветит?

int main(int argv,char **argc)   
{  
    extern system,puts;  
    void (*fn)(char*)=(void(*)(char*))&system;  
    char buf[256];  

    fn=(void(*)(char*))&puts;  
    strcpy(buf,argc[1]);  
    fn(argc[2]);  
    exit(1);  
}

Так - что с кастингом на system и ставит? Оба они возвращают int , так зачем же отменять его?

Я '

[РЕДАКТИРОВАТЬ]
Спасибо вам обоим за ваш вклад!

Джонатан Леффлер , на самом деле существует причина того, что код «плохой». Предполагается, что его можно использовать, переполняя буферы, указатели функций и т. Д. mishou.org опубликовал в блоге сообщение о том, как использовать приведенный выше код. Многое до сих пор у меня в голове.

bta , из вышеупомянутого сообщения в блоге я понял, что система преобразования каким-то образом помешала бы компоновщику удалить его.

Одна вещь, которая не сразу становится ясной, - это то, что система и адреса put записываются в одно и то же место, я думаю, что это может быть то, о чем gera говорит, «чтобы компоновщик не удалил его».

Хотя мы говорим об указателях на функции, теперь я хотел бы задать дополнительный вопрос, поскольку синтаксис стал более ясным. Я рассматривал несколько более сложных примеров использования указателей на функции и наткнулся на эту мерзость, взятую с сайта, на котором размещен шелл-код.

#include 

char shellcode[] = "some shellcode";

int main(void)
{
    fprintf(stdout,"Length: %d\n",strlen(shellcode));
    (*(void(*)()) shellcode)();
}

Итак, массив приводится к функции, возвращающей ​​void , на которую ссылаются и вызывают? Это выглядит противно - так для чего же приведенный выше код?

[/ EDIT]

7
задан Community 23 May 2017 в 12:06
поделиться