Для запуска произвольных собранных шестнадцатеричных инструкций в программе на С обычно требуется привести данные в виде указателя на функцию и затем вызвать такой указатель.
Обычное использование
int main(){
void (*ret)() = (void(*)())code;
ret();
return 0;
}
Однако я также натолкнулся на другой способ достижения той же самой задачи как таковой
Рассматриваемый вопрос
int main() {
(*(void (*)()) code);
return 0;
}
Может кто-нибудь помочь объяснить:
- Разница между двумя случаями
- Почему второй случай работает без какого-либо вызова
Проблема возникает, когда трудно отследить шестнадцатеричный код инструкции в отладчике, таком как GDB, без фактического вызова шестнадцатеричного кода в сценарии второго случая.
** * 1028 1029 * Редактировать
Протестированная программа была скомпилирована с помощью gcc и с параметрами: -fno-stack-protector -z exexcstack
машина проверена и версия gcc:
gcc version 7.3.0 (Ubuntu 7.3.0-27ubuntu1~18.04)