作家
登录

内核exploit——如何应对空指针异常现象

作者: 来源: 2017-10-26 09:24:54 阅读 我要评论

沙龙晃荡 | 去哪儿、陌陌、ThoughtWorks在主动化运维中的实践!10.28不见不散!

什么是空指针异常?


如不雅一个未初始化或零编号(zero-ed out)的指针被撤消引用时,将会导致法度榜样计数器/指令指针(PC/IP)指向0,大年夜而导致内核崩溃!

当碰到上述情况,起首需检查是否启用了任何保护法度榜样,如不雅启用了就将其全部封闭,包含治理员保护模式、数据履行保护模式(DEP / NX)以及mmap_min_addr保护机制。

ring0层与ring3层有所差别(Intel的CPU将特权级别分为4个级别:RING0、RING1、RING2、RING3。Windows只应用个中的两个级别RING0和RING3,RING0只给操作体系用,RING3谁都能用)。因为计算机应用二进制,是以在ring3层操作过程中,我们仅须要存眷若何追加一个shell敕令,我们须要这个时光来修改权限。光荣的是,今朝仍存在一些内核构造,持有当前的过程权限。我们将测验测验应用权限来进行root,并在处理完这些后再追加一个shell敕令。

若何晋升权限?

在进行晋升权限操作前,我们须要知道我们须要做哪些工作:

解决内核威逼问题

每个过程信息都存储为一个过程描述符(task_struct)

  1. struct task_struct { 
  2. /* ... */ 
  3. /* Process credentials: */ 
  4. /* Tracer's credentials at attach: */ 
  5. const struct cred __rcu *ptracer_cred; 
  6. /* Objective and real subjective task credentials (COW): */ 
  7. const struct cred __rcu *real_cred; 
  8. /* Effective (overridable) subjective task credentials (COW): */ 
  9. const struct cred __rcu *cred; 
  10. /* ... */ 
  11. 下列是cred.h文件: 
  12. struct cred { 
  13. /* ... */ 
  14. kuid_tuid;/* real UID of the task */ 
  15. kgid_tgid;/* real GID of the task */ 
  16. kuid_tsuid;/* saved UID of the task */ 
  17. kgid_tsgid;/* saved GID of the task */ 
  18. kuid_teuid;/* effective UID of the task */ 
  19. kgid_tegid;/* effective GID of the task */ 
  20. /* ... */ 

下列是sched.h文件:

下面我们将重要存眷有效的用户身份证实(UID)义务。如不雅我们成功将其值设置为0,则当前义务将具有root权限!

我们应当若何找到他们?

可以应用一些内核符号。

一些功能可用于晋升当前的过程权限,它们的地址是静态的,可以根据我们处理的内核从新生成:

  1. /proc/kallsyms, /proc/ksyms, /dev/ksyms.. 

上述这些函数在cred.c.中。

  1. extern int commit_creds(struct cred *); 
  2. /* ... */ 
  3. extern struct cred *prepare_kernel_cred(struct task_struct *); 

我们可以看到,prepare_kernel_cred()函数的返回值类型为struct cred *,之后再以此作为参数传递给commit_creds(),如许就可以将我们新获得的权限分派给当前的过程!

结论:可以经由过程“commit_creds(prepare_kernel_cred(0))”敕令来晋升权限;

懂得马脚并学会触发这些马脚

在进行内核开辟前,我们须要知道若何触发马脚,还须要知道在什么情况下指针会被撤消。


懂得马脚并学会触发这些马脚

解决内核威逼问题

我们起首须要检查保护法度榜样

如上图所示,所有的保护办法都出于封闭状况。

在“tostring_write()”函数里,我们可以看到这些敕令应当始终以10'*'开首。

在完成后,开端运行

当这个内核模块被加载时,它会在每次运行时启动构造,每次运行都邑启动一次。

如上图所示,我们不难发明这会启动“tostring_create()”。当在“tostring_s struct!”下设置函数指针时,该功能就会响应

 1/5    1 2 3 4 5 下一页 尾页

  推荐阅读

  别不相信 大数据已经侵入到你生活的方方面面

沙龙晃荡 | 去哪儿、陌陌、ThoughtWorks在主动化运维中的实践!10.28不见不散! 大年夜数据这个词,几乎天天都邑听到。不过谈到这个词典,要么是科技公司介绍新技巧、要么是专家学者介绍将>>>详细阅读


本文标题:内核exploit——如何应对空指针异常现象

地址:http://www.17bianji.com/lsqh/38226.html

关键词: 探索发现

乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

网友点评
自媒体专栏

评论

热度

精彩导读
栏目ID=71的表不存在(操作类型=0)