Linux进程注入技术疑问:共享对象与内存映射变化
关于Linux进程注入的两个疑问解答
1. 注入libc内存页后是否会产生COW副本?
是的,确实会生成独立的修改版实例。具体逻辑如下:
- libc的内存映射权限为
r-xp,其中p代表私有映射(PRIVATE),自带写时复制(COW)机制。 - 原本多个进程会共享同一份libc的物理内存页来节省资源,但当你通过
PTRACE_POKEDATA修改目标进程的libc页时,内核会触发COW机制:为目标进程单独复制出该页的物理副本,所有修改操作仅作用于这个私有副本。 - 其他进程仍会使用原始的libc共享页,完全不受这次注入修改的影响。
2. 为什么/bin/sh替换了目标进程而非作为子进程存在?
这是因为注入的shellcode直接调用了execve("/bin/sh", ...)系统调用,而非先fork再执行exec:
execve的核心作用就是替换当前进程的整个地址空间:它会把当前进程的代码段、数据段、堆栈、内存映射全部替换为/bin/sh的内容,进程PID保持不变,但执行逻辑完全切换为shell。- 这种情况下不会创建新的子进程,因此
pstree中看不到/bin/sh作为target的子进程,而是target进程本身被替换成了/bin/sh。
内容的提问来源于stack exchange,提问作者Raz Gavriel
相关产品推荐
相关产品推荐

