инъекция процесса linux, что случилось с общим объектным файлом и почему все отображение памяти процесса после инъекции изменилось?
Я пытаюсь улучшить инъекцию процессов Linux, и у меня есть некоторые вещи, которые я не совсем понимаю.
Метод инъекции, который я использую, — это базовая инъекция ptrace в текущее значение рипа. последовательность действий такова: ПРИСОЕДИНЯЙТЕСЬ к запущенному процессу с помощью ptrace, получите regs и измените память, размещенную в текущем рипе с помощью шеллкода, содержащего Linux/x86-x64 /bin/sh, используя PTRACE_POKETDATA, затем ОТСОЕДИНИТЕ процесс.
файл инъекции и целевой файл были взяты с https://github.com/0x00pf/0x00sec_code/tree/master/mem_inject
сначала я запустил целевой процесс и увидел его иерархию pstree:запущенный процесс скриншотпроцесс pstree иерархия
во-вторых, я взглянул на отображение памяти текущего процесса (как показано на рисунке):отображение памяти процесса — до внедрения
затем я запустил впрыск (как показано на рисунке):часть впрыска
Итак, инъекция происходит по адресу 0x7f049990bb96, как мы видим на скриншоте. это означает, что он находится на этой странице в памяти (из отображения памяти процесса - до изображения инъекции):введенная страница в памяти
затем после инъекции я снова запустил команду pstree, чтобы увидеть иерархию процессов и карту памяти:иерархия процессов pstree - после инъекции отображение памяти процесса - после инъекции
У меня есть два основных вопроса, чтобы улучшить мое понимание:
- когда происходит внедрение, оно внедряется на страницу libc-2.33.so. файл libc-2.33.so является общим объектом, поэтому он должен загружаться в память один раз, и каждый процесс будет ссылаться на один и тот же файл общего объекта. так что теперь, из-за защиты COW(копирование при записи), как мы можем видеть в сопоставлении памяти процесса (разрешения r-xp [p означает частный - имеет защиту COW]), у нас есть две версии libc-2.33. таким образом загружается в память, исходный общий объект libc и записанная (внедренная) libc загружается в процесс из-за COW.
это правда или я что-то неправильно понимаю в процессе?
- почему все сопоставления памяти процесса после инъекции изменились, а иерархия pstree не содержит /bin/sh в качестве дочернего процесса «целевого» процесса, но отбрасывает «целевой» процесс?