背景
本文所介绍的内容是emp3r0r框架持久化模块的一部分。
Linux有一个独特的东西叫procfs,把“Everything is a file”贯彻到了极致。从/proc/pid/maps我们能查看进程的内存地址分布,然后在/proc/pid/mem我们可以读取或者修改它的内存。
所以理论上我们只需要一个dd和procfs即可将代码注入一个进程,也确实有人写了相关的工具。
但既然Linux提供了一个接口(只有这么一个,不像你们Windows),我们在通常情况下直接调用它就可以了。
ptrace
对,这唯一的接口就是ptrace。
这东西是用来操作进程的,大多用于调试器,它提供的功能足够我们完成本文所需的shellcode注入以及进程恢复了。
我们的思路是:
-
attach到目标进程,将其接管
-
把shellcode写到RIP指向的位置,在此之前先备份原有的代码
-
恢复进程运行
-
shellcode执行到中断,trap#SIGTRAP)并被我们接管
-
我们把原先的代码写回去,寄存器也都恢复
-
继续原进程的执行
进程的恢复
看了上面的思路,这个似乎并不难。但别忘了&