Ptrace и выделение памяти

Я некоторое время играл с ptrace. Я следовал некоторым руководствам, таким как этот или вот этот. Пока что, когда у меня есть дочерний процесс ptrace-d, я могу:

  • Обнаружение системных вызовов и просмотр регистров.
  • Получить строки, содержащиеся в адресах, на которые указывают регистры, благодаря опции PTRACE_PEEKDATA параметра ptrace.
  • Измените значения этих регистров и измените значения памяти в пользовательском пространстве дочернего процесса благодаря опции PTRACE_POKEDATA для ptrace.

Моя проблема заключается в следующем: допустим, например, я только что обнаружил системный вызов open. Я могу изменить имя открываемого файла благодаря адресу, хранящемуся в регистре ebx. Однако мне интересно, могу ли я просто изменить имя файла на все, что захочу, любого размера. Если имя, на которое я меняюсь, действительно велико (скажем, в 50 раз больше исходной длины имени файла), не буду ли я возиться с некоторой памятью, на которую не должен писать? Должен ли я «выделить» некоторую память в пространстве памяти ребенка? Если да, то как это сделать?

Обратите внимание, что дочерний процесс — это некоторая программа, выполняемая с помощью execve, я не могу получить доступ к ее исходному коду.


person kosklain    schedule 11.11.2012    source источник


Ответы (1)


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

Вот несколько случайных идей (полностью непроверенных) о том, как распределять память в дочернем процессе:

  • вызвать системный вызов mmap от его имени (это, вероятно, будет довольно сложно), но вы получите страницу (или больше) памяти для игры с
  • выделите некоторое пространство в текущем стеке (не изменяйте регистры дочернего элемента, но используйте свое знание того, какую часть стека использует дочерний элемент, чтобы поместить временные объекты в неиспользуемый раздел). Технически дочерний процесс может делать то же самое (так что вы можете в конечном итоге испортить эти данные), но это очень маловероятно.
  • спрятать вещи в дальнем конце стека (опять же, предполагая, что ребенок тоже не проделывает этот трюк).
  • Я не думал, что вызвать malloc будет легко, но погуглив «ptrace child allocate memory», я нашел: http://www.hick.org/code/skape/papers/needle.txt (который находит подпрограмму malloc, используемую динамическим компоновщиком ELF, и создает вызов для выделения памяти) .
person P.T.    schedule 11.11.2012
comment
Спасибо, это помогло мне! Я закончил тем, что выделил память от имени детей, введя некоторый код :-) - person kosklain; 12.11.2012