Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

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

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

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

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

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

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

С некоторой осторожностью можно было, очевидно, подделать OS произвольным образом.

Ответ 3

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

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

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

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

Ответ 5

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

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

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

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