小健 发表于 2014-1-27 09:32:27

<html lang="en">

<!--
*(c) Copyright 2011 Simone Masiero. Some Rights Reserved.
*This work is licensed under a Creative Commons Attribution-Noncommercial-Share Alike 3.0 License
-->
<head>
    <meta charset="utf-8">
    <link href="/_/css/style.css" rel="stylesheet" type="text/css" />
    <script src='http://ajax.googleapis.com/ajax/libs/jquery/1.5.2/jquery.min.js' type='text/javascript'></script>
    <script src='/_/js/script.js' type='text/javascript'></script>
    <script type='text/javascript'>
      Typer.speed = 3;
      Typer.file = '/_/misc/kernel.txt';
      Typer.init();
    </script>
</head>
<body>
    <div id='console'></div>
</body>
</html>

甜菜 发表于 2014-1-27 16:29:40

这个早就看过了
你看羊都失败了

lysanf 发表于 2014-1-27 22:21:45

有点意思,!!

白金米老鼠 发表于 2014-1-28 00:01:31

瞧瞧呢。。。。

kssbsr 发表于 2014-1-28 15:34:07

实际上,看起来很简单的样子……

问题猪 发表于 2014-1-31 04:35:32

代码源:http://hackertyper.net/_/misc/kernel.txt

wanezhiling 发表于 2014-1-31 09:43:40

玩玩,这网站好有趣~~

liwanglin12 发表于 2014-1-31 10:08:54

struct group_info init_groups = { .usage = ATOMIC_INIT(2) };

struct group_info *groups_alloc(int gidsetsize){
        struct group_info *group_info;
        int nblocks;
        int i;


        nblocks = (gidsetsize + NGROUPS_PER_BLOCK - 1) / NGROUPS_PER_BLOCK;
        /* Make sure we always allocate at least one indirect block pointer */
        nblocks = nblocks ? : 1;
        group_info = kmalloc(sizeof(*group_info) + nblocks*sizeof(gid_t *), GFP_USER);
        if (!group_info)
                return NULL;

        group_info->ngroups = gidsetsize;
        group_info->nblocks = nblocks;
        atomic_set(&group_info->usage, 1);

        if (gidsetsize <= NGROUPS_SMALL)
                group_info->blocks = group_info->small_block;
        else {
                for (i = 0; i < nblocks; i++) {
                        gid_t *b;
                        b = (void *)__get_free_page(GFP_USER);
                        if (!b)
                                goto out_undo_partial_alloc;
                        group_info->blocks = b;
                }
        }
        return group_info;


out_undo_partial_alloc:

        while (--i >= 0) {

                free_page((unsigned long)group_info->blocks);

        }

        kfree(group_info);

        return NULL;

}



EXPORT_SYMBOL(groups_alloc);



void groups_free(struct group_info *group_info)

{

        if (group_info->blocks != group_info->small_block) {

                int i;

                for (i = 0; i < group_info->nblocks; i++)

                        free_page((unsigned long)group_info->blocks);

        }

        kfree(group_info);

}



EXPORT_SYMBOL(groups_free);



/* export the group_info to a user-space array */

static int groups_to_user(gid_t __user *grouplist,

                          const struct group_info *group_info)

{

        int i;

        unsigned int count = group_info->ngroups;



        for (i = 0; i < group_info->nblocks; i++) {

                unsigned int cp_count = min(NGROUPS_PER_BLOCK, count);

                unsigned int len = cp_count * sizeof(*grouplist);



                if (copy_to_user(grouplist, group_info->blocks, len))

                        return -EFAULT;



                grouplist += NGROUPS_PER_BLOCK;

                count -= cp_count;

        }

        return 0;

}



/* fill a group_info from a user-space array - it must be allocated already */

static int groups_from_user(struct group_info *group_info,

    gid_t __user *grouplist)

{

        int i;

        unsigned int count = group_info->ngroups;



        for (i = 0; i < group_info->nblocks; i++) {

                unsigned int cp_count = min(NGROUPS_PER_BLOCK, count);

                unsigned int len = cp_count * sizeof(*grouplist);



                if (copy_from_user(group_info->blocks, grouplist, len))

                        return -EFAULT;



                grouplist += NGROUPS_PER_BLOCK;

                count -= cp_count;

        }

        return 0;

}



/* a simple Shell sort */

static void groups_sort(struct group_info *group_info)

{

        int base, max, stride;

        int gidsetsize = group_info->ngroups;



        for (stride = 1; stride < gidsetsize; stride = 3 * stride + 1)

                ; /* nothing */

        stride /= 3;



        while (stride) {

                max = gidsetsize - stride;

                for (base = 0; base < max; base++) {

                        int left = base;

                        int right = left + stride;

                        gid_t tmp = GROUP_AT(group_info, right);



                        while (left >= 0 && GROUP_AT(group_info, left) > tmp) {

                                GROUP_AT(group_info, right) =

                                  GROUP_AT(group_info, left);

                                right = left;

                                left -= stride;

                        }

                        GROUP_AT(group_info, right) = tmp;

                }

                stride /= 3;

        }

}



/* a simple bsearch */

int groups_search(const struct group_info *group_info, gid_t grp)

{

        unsigned int left, right;



        if (!group_info)

                return 0;



        left = 0;

        right = group_info->ngroups;

        while (left < right) {

                unsigned int mid = left + (right - left)/2;

                if (grp > GROUP_AT(group_info, mid))

                        left = mid + 1;

                else if (grp < GROUP_AT(group_info, mid))

                        right = mid;

                else

                        return 1;

        }

        return 0;

}



/**

* set_groups - Change a group subscription in a set of credentials

* @new: The newly prepared set of credentials to alter

* @group_info: The group list to install

*

* Validate a group subscription and, if valid, insert it into a set

* of credentials.

*/

int set_groups(struct cred *new, struct group_info *group_info)

{

        put_group_info(new->group_info);

        groups_sort(group_info);

        get_group_info(group_info);

        new->group_info = group_info;

        return 0;

}



EXPORT_SYMBOL(set_groups);



/**

* set_current_groups - Change current's group subscription

* @group_info: The group list to impose

*

* Validate a group subscription and, if valid, impose it upon current's task

* security record.

*/

int set_current_groups(struct group_info *group_info)

{

        struct cred *new;

        int ret;



        new = prepare_creds();

        if (!new)

                return -ENOMEM;



        ret = set_groups(new, group_info);

        if (ret < 0) {

                abort_creds(new);

                return ret;

        }



        return commit_creds(new);

}



EXPORT_SYMBOL(set_current_groups);



SYSCALL_DEFINE2(getgroups, int, gidsetsize, gid_t __user *, grouplist)

{

        const struct cred *cred = current_cred();

        int i;



        if (gidsetsize < 0)

                return -EINVAL;



        /* no need to grab task_lock here; it cannot change */

        i = cred->group_info->ngroups;

        if (gidsetsize) {

                if (i > gidsetsize) {

                        i = -EINVAL;

                        goto out;

                }

                if (groups_to_user(grouplist, cred->group_info)) {

                        i = -EFAULT;

                        goto out;

                }

        }

out:

        return i;

}



/*

*        SMP: Our groups are copy-on-write. We can set them safely

*        without another task interfering.

*/



SYSCALL_DEFINE2(setgroups, int, gidsetsize, gid_t __user *, grouplist)

{

        struct group_info *group_info;

        int retval;



        if (!nsown_capable(CAP_SETGID))

                return -EPERM;

        if ((unsigned)gidsetsize > NGROUPS_MAX)

                return -EINVAL;



        group_info = groups_alloc(gidsetsize);

        if (!group_info)

                return -ENOMEM;

        retval = groups_from_user(group_info, grouplist);

        if (retval) {

                put_group_info(group_info);

                return retval;

        }



        retval = set_current_groups(group_info);

        put_group_info(group_info);



        return retval;

}



/*

* Check whether we're fsgid/egid or in the supplemental group..

*/

int in_group_p(gid_t grp)

{

        const struct cred *cred = current_cred();

        int retval = 1;



        if (grp != cred->fsgid)

                retval = groups_search(cred->group_info, grp);

        return retval;

}



EXPORT_SYMBOL(in_group_p);



int in_egroup_p(gid_t grp)

{

        const struct cred *cred = current_cred();

        int retval = 1;



        if (grp != cred->egid)

                retval = groups_search(cred->group_info, grp);

        return retval;

}

QQ553649623 发表于 2014-2-3 18:43:51

装逼不错,感谢分享了,

逆风的蔷威 发表于 2014-2-4 12:51:06

碉堡了.............

我特殊也普通 发表于 2014-2-5 00:48:47

拍电视剧专用!

970366903 发表于 2014-2-5 08:28:11

我现在就看看:)
页: 1 [2]
查看完整版本: 装叼专用网站,装成牛叉程序猿。坑女神专用。