PTRACE_PEEKTEXT, PTRACE_PEEKDATA:从addr指定的地址中读取一个字,读取的结果作为这个函数的返回值。 PTRACE_POKETEXT, PTRACE_POKEDATA:往addr指定的地址中写入一个字。trcaee的内存值被修改。 PTRACE_GETREGS, PTRACE_GETFPREGS:将tracee的通用寄存器或浮点寄存器分别复制到tracer的内存地址中。 PTRACE_SETREGS, PTRA...
PTRACE_PEEKTEXT, PTRACE_PEEKDATA //从子进程内存空间addr指向的位置读取一个字,并作为调用的结果返回。Linux内部对文本段和数据段不加区分,所以目前这两个请求相等。data参数被忽略。 PTRACE_PEEKUSR //从子进程的用户区addr指向的位置读取一个字,并作为调用的结果返回。 PTRACE_POKETEXT, PTRACE_POKEDATA //将dat...
ptrace 支持不同的操作,这些操作由ptrace请求代码指定— 一些值得注意的示例包括 PTRACE_ATTACH(附加到进程)、PTRACE_PEEKTEXT(从进程内存读取)和 PTRACE_GETREGS(检索进程寄存器)。 使用ptrace 检索远程进程的寄存器的示例: // Attach to the remote process ptrace(PTRACE_ATTACH, pid, NULL, NULL); wait(NULL);...
// peek: see if shellcode has got injected peekWord := make([]byte, len(data)) n, err = syscall.PtracePeekText(pid, uintptr(origRip), peekWord) if err != nil { return fmt.Errorf("PEEK: 0x%x", origRip) } log.Printf("Peeked %d bytes of shellcode: %x at RIP (0x%x)", n,...
然后,我们调用ptrace,使用第一个参数PTRACE_ATTACH,并将第二个参数设定为要附加的进程的PID。之后,我们需要调用wait来等待标志着附加构成完成的SIGTRAP信号。 此时,我们连接的进程已经停止,也就意味着我们可以对其进行任意地修改。 注入代码 第一步,我们必须要决定在哪里注入代码。这里存在很多可能: ...
ptrace(PTRACE_GETREGS, pid, NULL, &oldregs); 接下来,我需要在该进程中找到一个可以编写注入代码的地方。最简单的方法是解析位于procfs中的“maps”文件。例如,Ubuntu上运行的sshd进程的“/ proc / PID / maps”文件如下所示: ptrace(PTRACE_PEEKTEXT, pid, addr, NULL); ...
PTRACE_CONT:目标进程继续 PTRACE_DETACH:断联目标进程 比如设置PTRACE_PEEKTEXT,就能把目标进程的某个地址的内存读到本进程。 用户函数调用 前面说到,我们希望让目标进程调用dlopen(target.so),来实现target.so的注入。抽象出来,就是如何让目标进程调用一个用户函数(即,非系统调用的函数)。
ptrace 支持不同的操作,而这些操作则通过一个 ptrace 请求代码来指定,值得注意的一些操作示例包括:PTRACE_ATTACH(连接到进程)、PTRACE_PEEKTEXT(从进程内存中读取)和 PTRACE_GETREGS(检索进程寄存器)。代码段 1 显示了 ptrace 的一个用例。// Attach to the remote process ptrace(PTRACE_ATTACH, pid, NULL, NULL...
1.PTRACE_PEEKTEXT; 2.PTRACE_PEEKDATA; 3.PTRACE_PEEKUSR; 4.PTRACE_POKETEXT: 5.PTRACE_POKEDATA: 6.PTRACE_POKEUSR: 7.PTRACE_SYSCALL: 8.PTRACE_CONT: 9.PTRACE_KILL: 10.PTRACE_SINGLESTEP: 11.PTRACE_DETACH: 12.PTRACE_GETREGS: 13.PTRACE_SETREGS: 14.PTRACE_GETFPREGS: 15.PTRACE_SETFPREGS:...
比如设置PTRACE_PEEKTEXT,就能把目标进程的某个地址的内存读到本进程。 用户函数调用 前面说到,我们希望让目标进程调用dlopen(target.so),来实现target.so的注入。抽象出来,就是如何让目标进程调用一个用户函数(即,非系统调用的函数)。 那么如何调用?可以拆分为两步,第一步找到目标函数的地址,第二步调用它。