Как целочисленное переполнение является годным для использования?

У кого-либо есть подробное объяснение о том, как целые числа могут быть использованы? Я читал много о понятии, и я понимаю то, что это, и я понимаю переполнение буфера, но я не понимаю, как можно было изменить память надежно, или способом изменить поток приложения, путем создания целого числа больше, чем его определенная память....

21
задан Rob Kennedy 7 July 2010 в 16:49
поделиться

5 ответов

Это определенно можно эксплуатировать, но, конечно, зависит от ситуации.

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

Подробнее о переполнении целых чисел ssh: http://www.kb.cert.org/vuls/id/945216

Подробнее о целочисленном переполнении: http://projects.webappsec.org/w/page/13246946/Integer%20Overflows

17
ответ дан 29 November 2019 в 20:43
поделиться

Я использовал APL / 370 в конце 60-х на IBM 360/40. APL - это язык, в котором практически все является многомерным массивом, и есть удивительные операторы для управления массивами, включая преобразование из N измерений в M измерений и т. Д.

Неудивительно, что массив из N измерений имел границы индекса 1 .. k с другим положительным k для каждой оси .. и k юридически всегда было меньше 2 ^ 31 (положительные значения в 32-битном машинном слове со знаком). Теперь массив из N измерений имеет место в памяти. Попытки доступа к слоту массива с использованием индекса, слишком большого для оси, проверяются APL по верхней границе массива. И, конечно же, это применимо к массиву из N измерений, где N == 1.

APL не проверял, сделали ли вы что-то невероятно глупое с оператором RHO (изменение формы массива). APL допускает максимум 64 измерения. Итак, вы можете создать массив размером от 1 до 64, и APL сделает это, если все размеры массива будут меньше 2 ^ 31. Или вы можете попытаться создать массив размером 65 . В этом случае APL пошутил и неожиданно вернул 64-размерный массив , но не смог проверить размеры осей. (Фактически, произошло «целочисленное переполнение»). Это означало, что вы могли создать массив с размерами осей 2 ^ 31 или более ... но, будучи интерпретированными как целые числа со знаком, они обрабатывались как отрицательные числа.

Правое заклинание оператора RHO, примененное к такому массиву, могло уменьшить размерность до 1, с верхней границей, получить это, «-1». Назовите эту матрицу «червоточиной» (вскоре вы поймете почему).Такой массив червоточин имеет место в памяти, как и любой другой массив. Но все обращения к массиву проверяются по верхней границе ... но проверка границы массива, как оказалось, была сделана беззнаковым сравнением APL. Итак, вы можете получить доступ к ЧЕРМОВУ [1], ЧЕРМОВУ [2], ... ЧЕРМОВУ [2 ^ 32-2] без возражений. Фактически, вы можете получить доступ ко всей памяти машины.

В APL также была операция присваивания массива, в которой вы могли заполнить массив значением. WORMHOLE [] <- 0, таким образом, обнуляет всю памяти.

Я сделал это только один раз, так как он стер память, содержащую мое рабочее пространство APL, интерпретатор APL и, очевидно, критическую часть APL, которая обеспечивала разделение времени (в те дни это не было защищено от пользователей) ... терминал комната перешел из своего нормального состояния с очень сильного механического шума (у нас было 2741 терминал Selectric APL) в полностью бесшумный примерно за 2 секунды. Через стекло в компьютерном зале я мог видеть, как оператор удивленно посмотрел на огни на 370, когда они все погасли. Последовало много беготни.

Хотя в то время это было забавно, я держал рот на замке.

Если проявить некоторую осторожность, очевидно, что можно произвольно вмешиваться в операционную систему.

11
ответ дан 29 November 2019 в 20:43
поделиться

Обычный случай - это код, который предотвращает переполнение буфера, запрашивая количество вводимых данных, которые будут предоставлены, а затем пытается установить это ограничение. Рассмотрим ситуацию, когда я утверждаю, что предоставляю 2 ^ 30 + 10 целых чисел. Принимающая система выделяет буфер размером 4 * (2 ^ 30 + 10) = 40 байт (!). Поскольку выделение памяти выполнено успешно, мне разрешено продолжить. Проверка входного буфера меня не остановит, когда я отправлю свой 11-й ввод, поскольку 11 <2 ^ 30 + 10. Тем не менее, я переполну фактически выделенный буфер.

3
ответ дан 29 November 2019 в 20:43
поделиться

Это зависит от того, как используется переменная. Если вы никогда не принимаете никаких решений по безопасности на основе целых чисел, которые вы добавили к вводимым целым числам (где противник может спровоцировать переполнение), то я не могу представить, как у вас могут возникнуть проблемы (но такого рода вещи могут быть тонкими).

С другой стороны, я видел много подобного кода, который не проверяет ввод пользователя (хотя этот пример надуман):

int pricePerWidgetInCents = 3199;
int numberOfWidgetsToBuy = int.Parse(/* some user input string */);
int totalCostOfWidgetsSoldInCents = pricePerWidgetInCents * numberOfWidgetsToBuy; // KA-BOOM!

// potentially much later
int orderSubtotal = whatever + totalCostOfWidgetInCents;

Все идет хорошо до того дня, когда вы продаете 671 299 виджетов за -$21 474 817.95. Босс может быть расстроен.

4
ответ дан 29 November 2019 в 20:43
поделиться

Я просто хотел подвести итог всему, что я узнал по своему первоначальному вопросу.

Причина, по которой меня это сбивало с толку, заключалась в том, что я знаю, как работает переполнение буфера, и могу понять, как вы можете легко это использовать. Целочисленное переполнение - это другой случай - вы не можете использовать целочисленное переполнение для добавления произвольного кода и принудительного изменения потока приложения.

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

Надеюсь, это поможет.

4
ответ дан 29 November 2019 в 20:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: