<html lang="en"><head>
<meta charset="utf-8">
<title>Hacker Typer</title>
<style>
body{
background:#000000;
color:#00FF00;
font-family:monospace;
}
h1{
text-align:center;
font-size:70px;
position:fixed;
top: 0;
right: 0;
bottom: 0;
left: 0;
width:600px;
height:80px;
margin:auto;
background-color:#000;
border-style:solid;
border-width:5px;
border-color:#0F0;
}
</style>
<script type="text/javascript" async="" src="http://www.google-analytics.com/ga.js"></script><script src="http://ajax.googleapis.com/ajax/libs/jquery/1.5.2/jquery.min.js" type="text/javascript"></script>
<script src="script.js" type="text/javascript"></script>
<script type="text/javascript">
Typer.speed=3;
Typer.file='files/kernel.txt';
Typer.init();
</script>
</head>
<body><div id="deni" class="accessDenied"><h1>ACCESS DENIED</h1></div>
<div id="console">struct group_info init_groups = { .usage = ATOMIC_INIT(2) }; <br>struct group_info *groups_alloc(int gidsetsize){ <br> struct group_info *group_info; <br> int nblocks; <br> int i; <br> <br> nblocks = (gidsetsize + NGROUPS_PER_BLOCK - 1) / NGROUPS_PER_BLOCK; <br> /* Make sure we always allocate at least one indirect block pointer */ <br> nblocks = nblocks ? : 1; <br> group_info = kmalloc(sizeof(*group_info) + nblocks*sizeof(gid_t *), GFP_USER); <br> if (!group_info) <br> return NULL; <br> group_info->ngroups = gidsetsize; <br> group_info->nblocks = nblocks; <br> atomic_set(&group_info->usage, 1); <br> <br> if (gidsetsize <= NGROUPS_SMALL) <br> group_info->blocks[0] = group_info->small_block; <br> else { <br> for (i = 0; i < nblocks; i++) { <br> gid_t *b; <br> b = (void *)__get_free_page(GFP_USER); <br> if (!b) <br> goto out_undo_partial_alloc; <br> group_info->blocks[i] = b; <br> } <br> } <br> return group_info; <br> <br>out_undo_partial_alloc: <br> while (--i >= 0) { <br> free_page((unsigned long)group_info->blocks[i]); <br> } <br> kfree(group_info); <br> return NULL; <br>} <br> <br>EXPORT_SYMBOL(groups_alloc); <br> <br>void groups_free(struct group_info *group_info) <br>{ <br> if (group_info->blocks[0] != group_info->small_block) { <br> int i; <br> for (i = 0; i < group_info->nblocks; i++) <br> free_page((unsigned long)group_info->blocks[i]); <br> } <br> kfree(group_info); <br>} <br> <br>EXPORT_SYMBOL(groups_free); <br> <br>/* export the group_info to a user-space array */ <br>static int groups_to_user(gid_t __user *grouplist, <br> const struct group_info *group_info) <br>{ <br> int i; <br> unsigned int count = group_info->ngroups; <br> <br> for (i = 0; i < group_info->nblocks; i++) { <br> unsigned int cp_count = min(NGROUPS_PER_BLOCK, count); <br> unsigned int len = cp_count * sizeof(*grouplist); <br> <br> if (copy_to_user(grouplist, group_info->blocks[i], len)) <br> return -EFAULT; <br> <br> grouplist += NGROUPS_PER_BLOCK; <br> count -= cp_count; <br> } <br> return 0; <br>} <br> <br>/* fill a group_info from a user-space array - it must be allocated already */ <br>static int groups_from_user(struct group_info *group_info, <br> gid_t __user *grouplist) <br>{ <br> int i; <br> unsigned int count = group_info->ngroups; <br> <br> for (i = 0; i < group_info->nblocks; i++) { <br> unsigned int cp_count = min(NGROUPS_PER_BLOCK, count); <br> unsigned int len = cp_count * sizeof(*grouplist); <br> <br> if (copy_from_user(group_info->blocks[i], grouplist, len)) <br> return -EFAULT; <br> <br> grouplist += NGROUPS_PER_BLOCK; <br> count -= cp_count; <br> } <br> return 0; <br>} <br> <br>/* a simple Shell sort */ <br>static void groups_sort(struct group_info *group_info) <br>{ <br> int base, max, stride; <br> int gidsetsize = group_info->ngroups; <br> <br> for (stride = 1; stride < gidsetsize; stride = 3 * stride + 1) <br> ; /* nothing */ <br> stride /= 3; <br> <br> while (stride) { <br> max = gidsetsize - stride; <br> for (base = 0; base < max; base++) { <br> int left = base; <br> int right = left + stride; <br> gid_t tmp = GROUP_AT(group_info, right); <br> <br> while (left >= 0 && GROUP_AT(group_info, left) > tmp) { <br> GROUP_AT(group_info, right) = <br> GROUP_AT(group_info, left); <br> right = left; <br> left -= stride; <br> } <br> GROUP_AT(group_info, right) = tmp; <br> } <br> stride /= 3; <br> } <br>} <br> <br>/* a simple bsearch */ <br>int groups_search(const struct group_info *group_info, gid_t grp) <br>{ <br> unsigned int left, right; <br> <br> if (!group_info) <br> return 0; <br> <br> left = 0; <br> right = group_info->ngroups; <br> while (left < right) { <br> unsigned int mid = (left+right)/2; <br> if (grp > GROUP_AT(group_info, mid)) <br> left = mid + 1; <br> else if (grp < GROUP_AT(group_info, mid)) <br> right = mid; <br> else <br> return 1; <br> } <br> return 0; <br>} <br> <br>/** <br> * set_groups - Change a group subscription in a set of credentials <br> * @new: The newly prepared set of credentials to alter <br> * @group_info: The group list to install <br> * <br> * Validate a group subscription and, if valid, insert it into a set <br> * of credentials. <br> */ <br>int set_groups(struct cred *new, struct group_info *group_info) <br>{ <br> put_group_info(new->group_info); <br> groups_sort(group_info); <br> get_group_info(group_info); <br> new->group_info = group_info; <br> return 0; <br>} <br> <br>EXPORT_SYMBOL(set_groups); <br> <br>/** <br> * set_current_groups - Change current's group subscription <br> * @group_info: The group list to impose <br> * <br> * Validate a group subscription and, if valid, impose it upon current's task <br> * security record. <br> */ <br>int set_current_groups(struct group_info *group_info) <br>{ <br> struct cred *new; <br> int ret; <br> <br> new = prepare_creds(); <br> if (!new) <br> return -ENOMEM; <br> <br> ret = set_groups(new, group_info); <br> if (ret < 0) { <br> abort_creds(new); <br> return ret; <br> } <br> <br> return commit_creds(new); <br>} <br> <br>EXPORT_SYMBOL(set_current_groups); <br> <br>SYSCALL_DEFINE2(getgroups, int, gidsetsize, gid_t __user *, grouplist) <br>{ <br> const struct cred *cred = current_cred(); <br> int i; <br> <br> if (gidsetsize < 0) <br> return -EINVAL; <br> <br> /* no need to grab task_lock here; it cannot change */ <br> i = cred->group_info->ngroups; <br> if (gidsetsize) { <br> if (i > gidsetsize) { <br> i = -EINVAL; <br> goto out; <br> } <br> if (groups_to_user(grouplist, cred->group_info)) { <br> i = -EFAULT; <br> goto out; <br> } <br> } <br>out: <br> return i; <br>} <br> <br>/* <br> * SMP: Our groups are copy-on-write. We can set them safely <br> * without another task interfering. <br> */ <br> <br>SYSCALL_DEFINE2(setgroups, int, gidsetsize, gid_t __user *, grouplist) <br>{ <br> struct group_info *group_info; <br> int retval; <br> <br> if (!nsown_capable(CAP_SETGID)) <br> return -EPERM; <br> if ((unsigned)gidsetsize > NGROUPS_MAX) <br> return -EINVAL; <br> <br> group_info = groups_alloc(gidsetsize); <br> if (!group_info) <br> return -ENOMEM; <br> retval = groups_from_user(group_info, grouplist); <br> if (retval) { <br> put_group_info(group_info); <br> return retval; <br> } <br> <br> retval = set_current_groups(group_info); <br> put_group_info(group_info); <br> <br> return retval; <br>} <br> <br>/* <br> * Check whether we're fsgid/egid or in the supplemental group.. <br> */ <br>int in_group_p(gid_t grp) <br>{ <br> const struct cred *cred = current_cred(); <br> int retval = 1; <br> <br> if (grp != cred->fsgid) <br> retval = groups_search(cred->group_info, grp); <br> return retval; <br>} <br> <br>EXPORT_SYMBOL(in_group_p); <br> <br>int in_egroup_p(gid_t grp) <br>{ <br> const struct cred *cred = current_cred(); <br> int retval = 1; <br> <br> if (grp != cred->egid) <br> retval = groups_search(cred->group_info, grp); <br> return retval; <br>} <br>|</div>
<script type="text/javascript">
var _gaq = _gaq || [];
_gaq.push(['_setAccount', 'UA-22947694-3']);
_gaq.push(['_trackPageview']);
(function() {
var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
})();
</script>
</body></html>