2010-01-11 4 views
1

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

Вы назначены ведущим компьютерным инженером в межпланетной космической миссии на Юпитер. Спустя несколько месяцев в космосе главный компьютер корабля HAL9000 начинает работать с ошибкой и начинает убивать членов экипажа. Вы последний член команды остался жив, и вам нужно обмануть компьютер HAL 9000 для выполнения инструкции HALT. Хорошей новостью является то, что вы знаете, что машинный код для инструкции 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). 
+0

И что вы думаете об этом ответе? –

+0

Я не знаю ... – user133466

+0

Является ли это общим классом программирования C? –

ответ

2

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

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

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).

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

Фактическое переполнение буфера халтура slike это:

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

  2. Включите код, который должен быть выполнен в буфере , то есть в стеке.

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

Также хорошая книга по теме «Hacking: The art of exploitation», если вам нравится возиться со стеками и вызовами.

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

An article on buffer overflowing

+0

Я тебя люблю Эйден! – user133466

+0

@metashockwave, просто убедитесь, что вы проверяете мои факты! Это 5:44 утра в Великобритании, и я не спал;) –

Смежные вопросы