每个进程允许的映射页数的阈值

时间:2015-10-31 05:29:33

标签: c

我在这里尝试实现的目的是进行大量小(页面大小)mmap()调用并每次检查/proc/slabinfo,直到只留下一个平板。但在执行我的代码期间,我cat /proc/slabinfo查看了可用vm_area_struct的数量,但它没有下降。我猜每个进程允许的映射页数有一个阈值,对吗?

#define BASE (char *) 0x60000000

char *swapmem = NULL;
char *base = BASE;
char *map_addr;
static volatile int map_flags = PROT_WRITE|PROT_READ;
static char name[128];
static char line[128];

int get_slab_objs(const char *sn)
{
static int c, d, u = 0, a = 0;
FILE *fp=NULL;
char x1[20];

    fp = fopen("/proc/slabinfo", "r");
    if(!fp)
        printf("%s\n", "Not able to open /proc/slabinfo");
    fgets(name, sizeof(name) - 1, fp);
    do {
        c = u = a = -1;
        if (!fgets(line, sizeof(line) - 1, fp))
            break;
        c = sscanf(line, "%s %u %u %u %u %u %u", name, &u, &a,
               &d, &d, &d, &d);
    } while (strcmp(name, sn));
    close(fileno(fp));
    fclose(fp);
    return c == 7 ? a - u : -1;
}

//  leave one object in the SLAB
inline void prepare_slab()
{
void *r;

    r = mmap(map_addr, PAGE_SIZE, map_flags,
                 MAP_PRIVATE|MAP_ANONYMOUS|MAP_FIXED, 0, 0);

    map_addr += PAGE_SIZE;
    map_flags ^= PROT_READ;     

    if(MAP_FAILED == r) {
        printf("--> prepare_slab() failed\n");
    }
}

int main(int argc, char *argv[])
{
    map_addr = swapmem + 16*PAGE_SIZE + MEMSZ;

    int r;
    r = get_slab_objs("vm_area_struct");  
    while(r != 1 && r > 0) 
    {   
        prepare_slab();   
        r--;  
    }

    return 0;
}

1 个答案:

答案 0 :(得分:0)

在我看来,您似乎正在尝试运行this old uselib() exploit

它无法在任何现代系统上运行。此漏洞使用的漏洞在十年前已修补,并且uselib()系统调用甚至不存在于某些较新的内核中。此外,/proc/slabinfo proc条目现在只能由root读取,因此除非您已拥有root访问权限,否则此代码将无法运行。