大家好,月初的时候去了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_
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)