最近在开发一些东西的时候遇到了一些比较奇特的需求用到了该姿势,就顺势学习了一波,在一些情景下,我们需要无进程启动一些程序,此时线程注入就非常好用了,此处介绍下linux下的简单线程注入姿势
无进程运行程序
动态打补丁(替换函数)
调试器,逆向软件开发
程序辅助器?可能dll注入更多些2333
常驻服务程序
特定目标文件
在没有特殊手段的情况下,我们是无法用两个调试器同时调试同一个进程的
我们只有在拥有对该进程的相应权限的时候才可以注入进程
1 2 3 4 5 6 7 8 9 10
|
#include <stdio.h> #include <dlfcn.h>
void _init() { printf("inject success!\n"); }
|
1
|
strace -f -p pid -o /tmp/.log -e trace=read,write -s 1024
|
strace 跟踪进程中的系统调用处查询
这里
或者
这里
查询
当然我们也可以直接打开我们的terminal,然后 man ptrace
这里我们只举例几个我们会用到的几个参数
1 2 3 4 5 6 7
|
PTRACE_ATTACH,PTRACE_TRACEME PTRACE_CONT PTRACE_PEEKTEXT, PTRACE_PEEKDATA, PTRACE_PEEKUSR PTRACE_POKETEXT,PTRACE_POKEDATA, PTRACE_POKEUSR PTRACE_GETREGS PTRACE_SETREGS PTRACE_DETACH, PTRACE_KILL
|
那么我们现在暂时拥有了内存的读写权限,现在就该向我们的进程中注入代码了
1 2 3
|
#include <dlfcn.h> void * dlopen( const char * pathname, int mode); void* dlsym(void* handler, const char* symbol);
|
关于ret2dl的文章
或者其他师傅的一些文章
当然,此处安利<<程序员的自我修养—链接、装载与库>>
那么现在我们就可以通过类似的方法来获取__libc_dlopen_mode的地址啦
因为不是pwn题,所以我们需要做的并不是那么麻烦,在可以获得进程的内存读写权限的时候,我们只需要遍历一下link_map和相关链表就可以完成_libc_dlopen_mode的符号解析从而获取地址
此时我们需要的就是调用了
linux-inject
,
saruman
,
vegule
,
cub3
,
vlany