Вопрос

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

Это было полезно?

Решение

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

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

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

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

Другие советы

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

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

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

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

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

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

Пока было смешно в то время, я держал рот на закрытии.

С какой-то уходом можно очевидно, можно подделать ОС в произвольных путях.

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

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

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

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

Все Hunky-Dory до того дня, когда вы продаете 671 299 виджетов на - $ 21 474 817,95. Босс может быть расстроен.

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top