首页
社区
课程
招聘
[原创]root环境下直接修改ro属性
2017-10-28 10:27 9875

[原创]root环境下直接修改ro属性

2017-10-28 10:27
9875

root环境下直接修改ro属性

属性是由init进程读取到内存中,然后通过mmap只读方式共享到其他进程中。读的时候每个进程都可以直接读取,而修改或者添加只能由init进程来进行,这样方便selinux权限管理。

 

有root权限后,我们可以将属性内存通过mmap读写的方式共享到我们的内存中,这样可以任意修改,绕过init的限制。

属性内存结构

 * +-----+   children    +----+   children    +--------+
 * |     |-------------->| ro |-------------->| secure |
 * +-----+               +----+               +--------+
 *                       /    \                /   |
 *                 left /      \ right   left /    |  prop   +===========+
 *                     v        v            v     +-------->| ro.secure |
 *                  +-----+   +-----+     +-----+            +-----------+
 *                  |  n  |   | sys |     | com |            |     1     |
 *                  +-----+   +-----+     +-----+            +===========+
 *

上图其实很形象,是字典树和二叉树的混合。结点信息数据结构如下:

typedef struct prop_bt {
    uint8_t namelen;        // 该结点名字长度
    uint8_t reserved[3];    // 对齐的作用
    uint32_t prop;          // 指向prop_info,里面保存key和value信息
    uint32_t left;          // 左兄弟,长度小于或者长度相同而名字小于当前结点
    uint32_t right;         // 右兄弟,长度大于或者长度相同而名字大于当前结点
    uint32_t children;      // 子结点
    char name[0];
} prop_bt;

typedef struct prop_info {
    uint32_t serial;            
    char value[PROP_VALUE_MAX]; // PROP_VALUE_MAX = 92,所以说属性值最大长度为91,'\0'结尾
    char name[0];               // 属性名字
} prop_info;

思路:

1. Android N上,首先读取读取/property_contexts文件,获取属性前缀和security context(selinux定义的)的关系,由于每个security context对应一个文件,所以需要通过前缀来找到对应的文件,6.0及以下所以属性都保存在/dev/__properties__文件中,可以不读取/property_contexts文件
2. 打开对应的文件,将属性以'.'分隔,将第一部分和头结点对比,若相同则第二部分和children对比,不同,若小于则继续使用第一部分比较left结点,若大于则比较right结点。依次类推,若最后部分和结点N相等,则N的prop就是所要找到prop_info.

附上源码:https://github.com/W-WTerDan/android_properties


[培训]二进制漏洞攻防(第3期);满10人开班;模糊测试与工具使用二次开发;网络协议漏洞挖掘;Linux内核漏洞挖掘与利用;AOSP漏洞挖掘与利用;代码审计。

收藏
点赞1
打赏
分享
最新回复 (7)
雪    币: 6071
活跃值: (3297)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
MaYil 2017-10-28 15:21
2
0
感谢分享
雪    币: 122
活跃值: (1420)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
koflfy 1 2018-6-23 23:10
3
0
mark..........
雪    币: 1
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
老溫 2018-7-2 15:19
4
0
想問下這句做什麼用的?
p_info->serial = (valuelen << 24) | (p_info->serial & 0xffffff);
雪    币: 1
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
Evolution_804216 2018-8-30 22:45
5
0
牛逼哄哄,非常有用
雪    币: 210
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
南极兵 2018-8-31 11:35
6
0
标记。。
雪    币: 37
活跃值: (21)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
ckczck 2018-9-21 11:33
7
0
mark
雪    币: 182
活跃值: (198)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
老G 2018-9-26 16:00
8
0
mark
游客
登录 | 注册 方可回帖
返回