正在做对运行中的程序进行注入的实验,环境时centos 7,x64。
过程中有一步是使用PTRACE附到目标进程上,在使用PTRACE_SYSCALL找到目标进程使用syscall的位置。
修改此时寄存器的值,使目标程序用sys_open先打开自建的共享库A.so(此步骤已经成功)。
然后再用同样的原理,使目标程序调用两次SYS_mmap,将A.so的TEXT段(RE)、DATA(RW)段分别映射如目标进程内存以便后续注入。
映射TEXT段成功了,能够返回映射地址,并且能在/proc/pid/maps文件中看到映射成功。但映射DATA段貌似失败了,返回0xfffffffffffffff3。将DATA的映射属性改为RE,则映射也能成功,怀疑是某种内存保护机制阻止了映射可写的段。
想请教有无大神知道是否是这个原因,如果是,如何能够规避呢?至少能够将此机制关闭以保证实验能够继续,十分感谢!
代码段如下:
ptrace(PTRACE_GETREGS, pid, NULL, ®_mmap);
evil_filehandle = (int )reg_mmap.rax;//SYS_open运行返回值
reg_mmap.rax = 0x09;
reg_mmap.rdi = 0x00;
reg_mmap.rsi = evilsegment.text_len + (PAGE_SIZE - (evilsegment.text_len & (PAGE_SIZE - 1)));;
reg_mmap.rdx= PROT_READ|PROT_EXEC;
reg_mmap.r10 = MAP_SHARED;
reg_mmap.r8 = evil_filehandle;
reg_mmap.r9 = evilsegment.text_off & ~(PAGE_SIZE - 1);
reg_mmap.rip = syscall_add;
ptrace(PTRACE_SETREGS, pid, NULL, ®_mmap);
ptrace(PTRACE_GETREGS, pid, NULL, ®_mmap);
ptrace(PTRACE_SINGLESTEP, pid, NULL, NULL);
wait(NULL);
ptrace(PTRACE_GETREGS, pid, NULL, ®_mmap);
eviltext = reg_mmap.rax;
reg_mmap.rax = 0x09;
reg_mmap.rdi = 0x00;
reg_mmap.rsi = evilsegment.data_len + (PAGE_SIZE - (evilsegment.data_len & (PAGE_SIZE - 1)));;
reg_mmap.rdx= PROT_READ|PROT_WRITE;
reg_mmap.r10 = MAP_SHARED;
reg_mmap.r8 = evil_filehandle;
reg_mmap.r9 = evilsegment.data_off & ~(PAGE_SIZE - 1);
reg_mmap.rip = syscall_add;
ptrace(PTRACE_SETREGS, pid, NULL, ®_mmap);
ptrace(PTRACE_GETREGS, pid, NULL, ®_mmap);
ptrace(PTRACE_SINGLESTEP, pid, NULL, NULL);
wait(NULL);
ptrace(PTRACE_GETREGS, pid, NULL, ®_mmap);
evildata = reg_mmap.rax;
你好,我是有问必答小助手,非常抱歉,本次您提出的有问必答问题,目前超出我们的服务范围,暂时无法为您解答。
首次提问人员可免费体验一次有问必答服务。目前首次提问的问题服务范围为:编程语言、Java开发、python、数据库、前端开发 领域专业技术问题,为您提供问题的解决思路和指导。不提供源码代写、项目文档代写、论文代写、安装包资源发送或安装指导等服务。
我们后续会持续优化,扩大我们的服务范围,为您带来更好地服务。