Предполагается, что код, подобный приведенному ниже, может «тестировать» шелл-код, а именно выполнять его.
char shellcode[] = "...";
int main(int argc, char **argv)
{
int (*func)();
func = (int (*)()) shellcode;
(int)(*func)();
}
Однако, когда я пытаюсь использовать такие примеры, я получаю то, что код, кажется, выполняется в памяти, которая не является исполняемой, потому что он получает segfault при самой первой инструкции шелл-кода.
Если вместо этого я изменю объявление шелл-кода на #define
, я смогу заставить шелл-код выполняться. Однако шелл-код останавливается, когда пытается записать в свою собственную память (этот шелл-код предполагает, что он выполняется в стеке).
Итак, мой вопрос заключается в том, какой самый простой и надежный способ протестировать шелл-код, предполагающий исполняемую (очевидно) и доступную для записи память? Если я выделю код в стеке или куче и попытаюсь перейти к нему, я просто столкнусь с NX-битной защитой и снова потерплю неудачу. Теперь, очевидно, я мог бы отключить бит NX, но нет ли лучшего способа провести это тестирование?