Переполнение буфера в стеке, как перезаписать локальную переменную значением, содержащим нулевой символ - PullRequest
2 голосов
/ 28 января 2012

Я пытаюсь найти способ перезаписать адрес возврата функции, содержащей этот код:

длина = больше целевого размера, но меньше смещения адреса возврата от начала целевого массива.

for (i = 0; i <= length; i++)
   target[i] = argument[i];

Аргумент - это то, что я передаю из ввода.

Локальная переменная length достаточно велика, чтобы я мог переполнить аргумент для перезаписи i и length.

Предположим, смещение возвратаадрес от начального адреса цели - 300.

Мне нужно перезаписать i, чтобы быть некоторым числом, меньшим, чем 300 (0x12c), и length, чтобы быть некоторым числом, большим, чем 300.

Поскольку это 32-разрядная система, целое число 0x0000012c содержит нулевой символ, поэтому я не могу передать его через аргумент.

Есть ли способ перезаписать адрес возврата в этом случае?

1 Ответ

1 голос
/ 29 января 2012

Похоже на проблему переполнения буфера.

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

Другая возможность - это тип данных. Если он подписан, то очень большие значения будут интерпретироваться как отрицательное число. Подчеркните «арифметические переполнения», хотя в этой атаке вы перезаписываете числовое значение.

...