Издательский дом ООО "Гейм Лэнд"СПЕЦВЫПУСК ЖУРНАЛА ХАКЕР #45, АВГУСТ 2004 г.

МАССИВное переполнение

Мысла Владислав

Спецвыпуск 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. У нас имеется функция, которая создает массив и записывает в указанный элемент какое-либо число, и функция, которая показывает пароль админа.

Назад на стр. 045-030-1  Содержание  Вперед на стр. 045-030-3