Указатель кадра / Счетчик программы / Переполнение массива - PullRequest
1 голос
/ 11 января 2010

Я работаю над практической задачей, поставленной для программирования на Си, и я столкнулся с этим вопросом.Я не совсем уверен, о чем спрашивает вопрос ... учитывая, что xDEADBEEF - это инструкция остановки, но где мы вводим deadbeef?почему ФП актуален в этом вопросе?спасибо!

Вы были назначены ведущим компьютерным инженером в межпланетном космическом полете на Юпитер.После нескольких месяцев в космосе главный компьютер корабля, HAL9000, начинает работать со сбоями и начинает убивать членов экипажа.Вы последний оставшийся в живых член экипажа, и вам нужно заставить компьютер HAL 9000 выполнить инструкцию HALT.Хорошая новость заключается в том, что вы знаете, что машинный код для инструкции остановки - это (в шестнадцатеричном формате) xDEADBEEF (в десятичном формате, это -559,038,737).Плохая новость заключается в том, что единственная программа, которую операционная система HAL 9000 готова запустить, - это шахматы.К счастью, у нас есть подробная распечатка исходного кода шахматной программы (выдержка из всех важных частей дана ниже).Обратите внимание, что функция getValues ​​считывает набор ненулевых целых чисел и размещает каждое число по порядку в массиве x.Первоначальный автор программы, очевидно, ожидал, что мы предоставим только два положительных числа, однако в программе нет ничего, что могло бы помешать нам ввести три или более чисел.Мы также знаем, что в стеке будут использоваться области памяти между 8000 и 8999, а начальное значение указателя кадра будет 8996.

void getValues(void) {
  int x[2]; // array to hold input values
  int k = 0;
  int n;
  n = readFromKeyboard(); // whatever you type on the keyboard is assigned to n
  while (n != 0) {
    x[k] = nextNumber;
    k = k + 1;
    n = readFromKeyboard();// whatever you type on the keyboard is assigned to n
  }
  /* the rest of this function is not relevant */
}

int main(void) {
  int x;
  getValues();
  /* the rest of main is not relevant */
}

Какую последовательность цифр следует вводить на клавиатуре, чтобы заставить компьютервыполнить команду остановки?

ОБРАЗЕЦ РЕШЕНИЯ

   One of the first three numbers should be -559038737.  The fourth number must be the address of where 0xdeadbeef was placed into memory.  Typical values for the 4th number are 8992 (0xdeadbeef is the second number) or 8991 (0xdeadbeef is first number).  

Ответы [ 2 ]

2 голосов
/ 11 января 2010

Что вы хотите сделать, это переполнить ввод , так что программа вернется в набор инструкций, которые вы перезаписали по адресу возврата.

Проблема заключается здесь:

  int x[2]; // array to hold input values

Передавая более 3 значений, вы можете перезаписать память, которую не следует делать. Пояснения к примеру:

  1. Первый ввод -559,038,737 помещает xDEADBEEF в память
  2. Второй ввод -559,038,737, почему бы и нет.
  3. Третий номер -559,038,737 не может повредить
  4. Четвертое число 8992 - это адрес, в который функция должна возвращаться.

Когда вызов функции вернется, он вернется к адресу, переписавшему адрес возврата в стеке с помощью (8992).

Вот несколько полезных ресурсов и выдержка:

Фактическая работа по переполнению буфера выглядит так:

  1. Найти код с потенциалом переполнения.

  2. Поместите код для выполнения в буфер, т.е. в стеке.

  3. Укажите адрес возврата на тот же код Вы только что положили в стек.

Также хорошей книгой на эту тему является « Взлом: искусство эксплуатации », если вам нравится возиться со стеками и процедурами вызова.

В вашем случае кажется, что они ищут, чтобы вы закодировали ваши инструкции в целые числа, переданные на вход.

Статья о переполнении буфера

0 голосов
/ 11 января 2010

Подсказка: прочитайте о переполнении буфера эксплойтах.

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