Linux二进制注入过程中映射自建共享库失败

正在做对运行中的程序进行注入的实验,环境时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, &reg_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, &reg_mmap);
            ptrace(PTRACE_GETREGS, pid, NULL, &reg_mmap);

            ptrace(PTRACE_SINGLESTEP, pid, NULL, NULL);
            wait(NULL);
            ptrace(PTRACE_GETREGS, pid, NULL, &reg_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, &reg_mmap);
            ptrace(PTRACE_GETREGS, pid, NULL, &reg_mmap);


            ptrace(PTRACE_SINGLESTEP, pid, NULL, NULL);         
            wait(NULL);
            ptrace(PTRACE_GETREGS, pid, NULL, &reg_mmap);
            evildata = reg_mmap.rax;

     

你好,我是有问必答小助手,非常抱歉,本次您提出的有问必答问题,目前超出我们的服务范围,暂时无法为您解答。

首次提问人员可免费体验一次有问必答服务。目前首次提问的问题服务范围为:编程语言、Java开发、python、数据库、前端开发 领域专业技术问题,为您提供问题的解决思路和指导。不提供源码代写、项目文档代写、论文代写、安装包资源发送或安装指导等服务。

我们后续会持续优化,扩大我们的服务范围,为您带来更好地服务。