Я смотрю пример 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 говорит, «чтобы компоновщик не удалил его».
Хотя мы говорим об указателях на функции, теперь я хотел бы задать дополнительный вопрос, поскольку синтаксис стал более ясным. Я рассматривал несколько более сложных примеров использования указателей на функции и наткнулся на эту мерзость, взятую с сайта, на котором размещен шелл-код.
#includechar shellcode[] = "some shellcode"; int main(void) { fprintf(stdout,"Length: %d\n",strlen(shellcode)); (*(void(*)()) shellcode)(); }
Итак, массив приводится к функции, возвращающей void
, на которую ссылаются и вызывают? Это выглядит противно - так для чего же приведенный выше код?
[/ EDIT]