понимание выполнения c-кода в стеке (код Mac Hackers Handbook) - PullRequest
2 голосов
/ 05 февраля 2012

Я смотрел на этот пример при выполнении кода в стеке:

#include <stdio.h>
  #include <stdlib.h>
  #include <string.h>
  char shellcode[] = “\xeb\xfe”;
  int main(int argc, char *argv[]){
          void (*f)();
          char x[4];
          memcpy(x, shellcode, sizeof(shellcode));
          f = (void (*)()) x;
          f();
}

Это вызывает ошибку сегментации.Насколько я понимаю, это связано с тем, что шелл-коду не хватает памяти для остальных байтов, поскольку размер x равен только 4 байта.И это приводит к созданию операции записи для копирования в стековую память, что вызывает сегментацию.ошибка, поскольку стековая память доступна только для чтения.Правильно ли мое понимание?

1 Ответ

2 голосов
/ 05 февраля 2012

На какой именно операционной системе вы это используете?

Цитата из справочника Mac Hacker:

Leopard не устанавливает бит XD ни на какие части памяти, кроме стек. Неясно, является ли это ошибкой, недосмотром или преднамеренным, но даже если разрешения программного обеспечения памяти установлены на неисполнимый, вы все равно можете выполнить где угодно, кроме стека. следующая простая программа иллюстрирует эту точку зрения.

[ваш фрагмент следует]

(Акцент мой.)

Код должен сбиваться, если права установлены на неисполнимые (или если права вообще опущены). Это не было на Леопарде, который даже автор подвергает сомнению. То, что вы заметили, является совершенно нормальным поведением для современной ОС.

Я бы добавил: попробуйте запустить его через отладчик. \xeb\xfe - это бесконечный цикл, но технически вы не должны даже цикл один раз. ОС должна шлепнуть вас по запястью (что, видимо, здесь и происходит).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...