首页
社区
课程
招聘
[求助]linux 内核提权的问题
发表于: 2015-8-25 11:06 6772

[求助]linux 内核提权的问题

2015-8-25 11:06
6772
最近刚分析近几年的linux内核提权,遇到一个问题:
thread_info 中的addr_limit 一般是界定用户态进程的地址空间上限。
很多提权是将addr_limit修改为:0xffffffff。。。以覆盖到内核空间,达到内核任意地址读写目的。
但最近看keentime的blackhat的ppt,其中写道:shellcode的功能,是将thread_info 的addr_limit修改为0,然后利用pipe对内核任意地址进行读写。
不解为啥addr_limit=0,也能对内核任意地址进行读写呢?

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (2)
雪    币: 29
活跃值: (295)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
2
同没搞懂为什么这里addr_limit置0 会任意地址写  有大佬知道的可以点拨下么0.0

2018-12-18 20:38
0
雪    币: 47
活跃值: (418)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
3
endlif 同没搞懂为什么这里addr_limit置0 会任意地址写  有大佬知道的可以点拨下么0.0
0xffffffff 是指在32位 usr 可访问的空间由 3gb(0xBFFFFFFF) 扩展到 4gb(0xFFFFFFFF),直接写0也是没错的,因为内核就这样做,当内核想要关闭地址空间的限制时直接执行  set_fs(KERNEL_DS),从以下代码看,KERNEL_DS 的值就是 0


```
#define MAKE_MM_SEG(s)        ((mm_segment_t) { (s) })

#ifndef KERNEL_DS
#define KERNEL_DS        MAKE_MM_SEG(~0UL)
#endif

#ifndef USER_DS
#define USER_DS                MAKE_MM_SEG(TASK_SIZE - 1)
#endif

#ifndef get_fs
#define get_ds()        (KERNEL_DS)
#define get_fs()        (current_thread_info()->addr_limit)

static inline void set_fs(mm_segment_t fs)
{
       current_thread_info()->addr_limit = fs;
}
#endif
```
2019-1-16 11:16
0
游客
登录 | 注册 方可回帖
返回
//