Я добавляю функцию в свой отладчик (я использую Ptrace для управления отслеживаемым процессом, а также кодами libbfd/libopcodes), чтобы раскрутить стек и определить, существуют ли несоответствия между выделенным пространством стека каждого CALL и статически полученным размером локальной переменной, печать адреса и размера локального стека каждого кадра по пути.
Моя общая методология заключается в том, чтобы взять адрес в базовом указателе (EBP
/RBP
), увеличить указатель до значения, которое должно содержать сохраненный указатель кадра, разыменовать этот адрес, проверить его с помощью PTRACE_PEEKDATA
и повторять до тех пор, пока я не разыменую адрес, занимающий область за пределами куча.
Я знаю, как проверять регистры сегментов кода/данных, но в идеале мне нужен метод, чтобы проверить, нахожусь ли я все еще внутри стека вызовов, даже если сегментация была изменена страницами памяти W ^ X или другим неисполняемым стеком.
Короче говоря, как я могу проверить (в общем случае), когда я вышел за пределы стека, не сработав при этом с общей ошибкой защиты?
(Кроме того, я понимаю, что действую исходя из предположения, что проверка сегмента страницы адреса является идеальной методологией здесь - возможно, существует другой более простой метод, чтобы определить, находится ли адрес в пространстве стека текущего процесса)
system()
). Если ваша программа на C зависит от указанной информации/функциональности, она обречена на плохую переносимость. Вы можете несколько улучшить переносимость, если будете придерживаться функциональности POSIX, но это улучшение будет только улучшением для ОС, совместимых с POSIX. Для всех остальных это будет противоположностью улучшения. - person Alexey Frunze   schedule 05.04.2013