转到跳转到mmaped ELF二进制文件的入口点

时间:2016-11-24 17:31:43

标签: c

我可以用" $ readelf cbinary -a"来检查我的二进制文件的入口点。并通过代码。但是当二进制文件被mmaped然后跳转到那里时如何检查其入口点虚拟adr?

int fd;
        int PageSize;
        char *fileName = "/home/dssiam/workspace_eclipse/hello/src/cprog";
        if ((PageSize = sysconf(_SC_PAGE_SIZE)) < 0) {
            perror("sysconf() Error=");
        }

    if ((fd = open(fileName, O_RDWR,  S_IXUSR | S_IXGRP | S_IXOTH)) == -1)
    {
            perror("err open file:");
            exit(1);
    }
    else
    {
        fd = open(fileName, O_RDWR, S_IXUSR | S_IXGRP | S_IXOTH);
    }

        void *address;
        int len;
        off_t my_offset = 0;
        len = PageSize*3;    //Map one page
        address = mmap(NULL, len, PROT_WRITE, MAP_SHARED, fd, my_offset);
        if (address == MAP_FAILED)
        {
            perror("mmap error. ");
        }



        lseek(fd, 24, SEEK_SET);
        unsigned long entry_point;
        read(fd, &entry_point, sizeof(entry_point)); //IT RETURN entry point adr of my binary at "/home/dssiam/workspace_eclipse/hello/src/cprog" but not in VM

        printf("entry: 0x%lx\n", entry_point);
        close(fd);
        void *ptr = (void *)0x80484b0;  // 0x80484b0 - entry_point vaddress
        goto *ptr; //no jump here

所以我可以跳到我的主程序的开头,但是我不能跳到二进制文件&#34; cprog&#34;存储在我的hdd和mmaped区域。 任何帮助,将不胜感激。

1 个答案:

答案 0 :(得分:1)

代码有很多错误(错误的mmap保护,错误的mmap起始地址,任意页面大小,C标准特别禁止这种计算goto)但最大的问题是这种方法根本不起作用,除了可能最多基本情况。

您不仅可以将elf文件中的单个函数映射到内存中并期望它能够正常工作 - 您需要为可重定位代码执行重定位,甚至对于PIC(位置无关代码),您仍然需要创建GOT。

我猜你真正想要动态加载编译文件,所以使用标准方法执行此操作:将文件编译为.so动态库,然后使用dlopen / dlsym从文件中访问函数。