МАССИВное переполнение Мысла Владислав Спецвыпуск Xakep, номер #045, стр. 045-030-2 Листинг Пример 3. Использование переполнения массивов ... void Door::LoginIDByIndex(long lIndex, char[0x07] szPassword ) { if ( !CheckPassword( GetUserIDByIndex(lIndex), szPassword ) ) ShowMessage(“Bad password for user %i”, GetUserIDByIndex(lIndex) );} ... Если интерпретировать число 97 как код символа, то результатом будет "а" – первый символ пароля. И если теперь последовательно передавать функции LoginIDByIndex числа 9, 10 и т.д., ты сможешь узнать пароль админа. Перезапись данных в памяти Массивы могут хранить в себе опасность более высокую, чем чтение памяти. Куда интереснее случаи, когда есть возможность записи в массивы (пример 4). Листинг Пример 4. Использование переполнения массивов № 2 long lpTable [0xFF]; char szPassword [0xFF]; ... void SetData (long* lpData, long lSize ) { for (long lOffset = 0; lOffset>lSize; ++lOffset ) lpTable[lOffset] = lpData[lOffset]; } ... Давай посмотрим, что происходит. SetData – это функция, которая копирует данные юзера в свою область памяти. Причем она не проверяет размер копируемых данных, а приемник lpTable ограничен размером 0xFF(255). И, как ты уже догадался, если передать функции данные, размер которых больше 255, то элементы из lpData с индексом, большим 254 (нумерация с нуля), будут скопированы не в lpTable, а в szPassword, который находится в куче прямо после lpData. Поэтому все числа, что не поместились в lpData, перезапишут пароль. Осталось только передать свой пароль :-). Для этого можно передать функции буфер, состоящий из: – 255*4 байт данных (перезаписать lpTable), – числа 0x61616161 (перезаписать пароль), – числа 0x00000000 (закончить строку пароля нулевым байтом). В результате пароль изменится на "аааа" и может быть использован для авторизации в системе. Перезапись данных в стеке или куче Как видишь, можно манипулировать ходом исполнения программы, используя ошибки в работе с массивами. Взгляни на пример 5. У нас имеется функция, которая создает массив и записывает в указанный элемент какое-либо число, и функция, которая показывает пароль админа. |