首页
社区
课程
招聘
[求助]CVE-2015-3636绕过pxn问题请教
发表于: 2016-7-23 09:36 7939

[求助]CVE-2015-3636绕过pxn问题请教

2016-7-23 09:36
7939
大家好,月初的时候去了mosec听了360的安全研究人员讲解pxn绕过的技巧,现在自己实践的时候,遇到了一些问题,故来请教。
    其中一个方法的思路是,利用内核使用系统调用时关闭内核的地址空间保护,即系统调用是设计给用户态程序用的,当用户态去调用系统调用时会受地址空间的限制,有时内核也要去使用系统调用,当内核使用的时候就要去掉地址空间的限制,一般调用set_fs(KERNEL_DS)(这个函数就是修改addr_limit的)去掉空间限制,使用完系统调用后还要将地址空间的限制还原set_fs(old_fs),3636中可以跳转到kernel_setsockopt()函数并控制寄存器绕过set_fs(old_fs),从而使用户态可以一直访问内核的地址空间
    通过内核panic信息,可以得到要控制sk结构中的变量偏移,现在我已经可以覆盖sk->sk_prot->close指针,让其跳转到kernel_setsockopt函数中,也已经顺利绕过set_fs(old_fs)执行,按理说,此时内核空间已经打开,但我访问一个内核地址却失败了,这让我很困惑。还有,就是即使我已经能够访问内核了,但要怎样定位creds的位置,因为这样的过程并没有去泄露内核sp。这个问题困惑好几天了,恳求知道的前辈不吝赐教……

ROM:C0851D64 kernel_setsockopt_  
ROM:C0851D64                 MOV             R12, SP
ROM:C0851D68                 STMFD           SP!, {R4,R5,R11,R12,LR,PC}
ROM:C0851D6C                 SUB             R11, R12, #4
ROM:C0851D70                 SUB             SP, SP, #8
ROM:C0851D74                 STR             LR, [SP,#0x1C+var_20]!
ROM:C0851D78                 BL              __gnu_mcount_nc_
ROM:C0851D7C                 MOV             R12, SP
ROM:C0851D80                 BIC             R4, R12, #0x1FC0
ROM:C0851D84                 CMP             R1, #1
ROM:C0851D88                 BIC             R4, R4, #0x3F
ROM:C0851D8C                 MOV             R12, #0
ROM:C0851D90                 LDR             R5, [R4,#8]
ROM:C0851D94                 STR             R12, [R4,#8]
ROM:C0851D98                 BEQ             loc_C0851DBC
ROM:C0851D9C                 LDR             R12, [R0,#0x18] ; r0即sk可控,在r0+0x18处放用户态地址a
ROM:C0851DA0                 LDR             LR, [R11,#arg_0]
ROM:C0851DA4                 STR             LR, [SP,#0x20+var_20]
ROM:C0851DA8                 LDR             R12, [R12,#0x30] ; 用户态地址a+0x30处放0xC0851DB4
ROM:C0851DAC                 BLX             R12
ROM:C0851DB0
ROM:C0851DB0 loc_C0851DB0                            ; CODE XREF: kernel_setsockopt_+64j
ROM:C0851DB0                 STR             R5, [R4,#8] ; set_fs(oldfs)指令,略过该指令,关闭kernel的地址空间保护
ROM:C0851DB4                 SUB             SP, R11, #0x14 ; 跳到此处
ROM:C0851DB8                 LDMFD           SP, {R4,R5,R11,SP,PC}
ROM:C0851DBC ; ---------------------------------------------------------------------------
ROM:C0851DBC
ROM:C0851DBC loc_C0851DBC                            ; CODE XREF: kernel_setsockopt_+34j
ROM:C0851DBC                 LDR             LR, [R11,#arg_0]
ROM:C0851DC0                 STR             LR, [SP,#0x20+var_20]
ROM:C0851DC4                 BL              sock_setsockopt_
ROM:C0851DC8                 B               loc_C0851DB0
ROM:C0851DC8 ; End of function kernel_setsockopt_

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (10)
雪    币: 28972
活跃值: (7458)
能力值: ( LV15,RANK:3306 )
在线值:
发帖
回帖
粉丝
2
mark一下, 防止以后忘记了
1. 内核空间已经打开, 但访问一个内核地址却失败
  直接访问内核地址肯定不行, 得通过管道或其他方式读写内核地址
  如果方法正确,那应该是不在同一个线程
2. 定位creds
  特征码搜索内核中的init进程的cred, 再通过该cred的task表找到本进程的cred(匹配进程名)
2016-7-23 23:53
0
雪    币: 47
活跃值: (418)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
3
谢谢,我用这个思路尝试尝试
2016-7-24 10:47
0
雪    币: 2177
活跃值: (2045)
能力值: (RANK:400 )
在线值:
发帖
回帖
粉丝
4
可以参考下我写的这篇文章:http://blog.csdn.net/hu3167343/article/details/47394707
2016-7-25 10:25
0
雪    币: 47
活跃值: (418)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
5
[QUOTE=莫灰灰;1438248]可以参考下我写的这篇文章:http://blog.csdn.net/hu3167343/article/details/47394707[/QUOTE]

好的啊
2016-7-25 21:25
0
雪    币: 191
活跃值: (195)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
6
好高端的东西,前排带上瓜子学习,谢谢灰灰大神
2016-7-25 21:42
0
雪    币: 8
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
看来内核级的  要多看看了
2016-7-25 22:30
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
楼主的问题我也不懂是否回答。我也在研究这个,不过深入程度不如楼主。我看楼主看内核应该是已经成功提取了内核镜像文件,我解压得到的并不是一个ELF格式的文件,请问这个是正常的吗?楼主能否介绍下你是提取内核镜像文件用于分析的步骤?
2016-7-26 00:19
0
雪    币: 17
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
能详细讲一下360提供的思路吗
2016-7-26 00:55
0
雪    币: 47
活跃值: (418)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
10
你好,从手机中提取出的kernel文件的确不是elf格式,或者说不是标准的elf格式,但拖到ida中一样是可以识别的,具体的步骤你可以参考http://bbs.pediy.com/showthread.php?t=207538 这个帖子,这个帖子你往后翻一翻,我贴了一个小脚本,是用于在ida中导入符号表的,然后你就可以在ida中分析具体的代码了
2016-7-26 09:42
0
雪    币: 6003
活跃值: (3490)
能力值: ( LV6,RANK:96 )
在线值:
发帖
回帖
粉丝
11
https://github.com/jianqiangzhao/mosec2016

ppt
2016-7-28 18:02
0
游客
登录 | 注册 方可回帖
返回
//