Проблемы с отладкой Ptrace mprotect

У меня проблемы с исследовательским проектом. Я пытаюсь использовать ptrace для наблюдения за выполнением целевого процесса. С помощью ptrace я внедряю системный вызов mprotect в целевой сегмент кода (аналогично точке останова) и устанавливаю защиту стека на PROT_NONE. После этого я восстанавливаю исходные инструкции и позволяю цели продолжаться. Когда я получаю недопустимый segfault разрешения, я снова ввожу системный вызов, чтобы снова снять защиту стека, а затем выполняю инструкцию, вызвавшую segfault, и снова защищаю стек.

(Это действительно работает для простых программ.)

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

Еще раз подчеркну, что сбои происходят не всегда и не всегда происходят в одних и тех же местах.

Это похоже на проблему с синхронизацией, но, насколько я могу судить (имеется в виду, что я просмотрел /proc/pid/tasks/), работает только один поток.

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


person salbei    schedule 14.10.2011    source источник
comment
Почему бы не использовать настоящие точки останова? см., например, mainisusuallyafunction.blogspot.com/2011/01 /   -  person Yann Droneaud    schedule 14.10.2011
comment
спасибо, но мне нужно много точек останова памяти. (я тоже пользуюсь обычными)   -  person salbei    schedule 14.10.2011
comment
Для справки, эту серию статей стоит прочитать eli .thegreenplace.net/2011/01/23/how-debuggers-work-part-1 eli.thegreenplace.net/2011/01/27/ eli.thegreenplace.net/2011/02/07/ особенно та часть, в которой объясняется, что инструкция trap закодирована на один байт нужно, чтобы не испортить отлаживаемую программу (по крайней мере на x86)   -  person Yann Droneaud    schedule 14.10.2011


Ответы (1)


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

РЕДАКТИРОВАТЬ:

Учитывая, что отключение ASR «исправляет» проблему, возможно, основная проблема может заключаться в следующем:

  1. Где-то думают, что 0 недействителен, когда он должен быть действительным, или наоборот. (что у меня было).
  2. Использование адресов из одного прогона против другого прогона?
person Douglas Leeder    schedule 14.10.2011
comment
Большое спасибо, это действительно заставило ошибки исчезнуть, и я наконец-то могу продолжить свой проект :). Но я все же хотел бы знать, почему это не работает с включенным aslr. - person salbei; 14.10.2011
comment
@salbei Я добавил множество идей для причин. - person Douglas Leeder; 14.10.2011