对于页属性的管理相应思考
我看了下,虚拟地址到物理地址的转换很简单,解释虚拟页号对应找到物理页号,偏移计算出物理地址。而且虚拟偏移和物理偏移是一样的。所以这里这是虚拟页好和物理页号不可能是简单的确定映射关系。一定有一个复杂的动态映射算法。这个我先不关心。我想知道的反而是页表权限属性的一些内容。
我这里理解页面如果分虚拟和物理,那么页面的执行属性是否也分虚拟和物理。如果区分,那么我们更改属性是否单纯的通过丹村的修改虚拟内存或是物理内存的也属性是否也会影响到对应的物理页面和虚拟页面。
1.单纯修改一方方面的也属性
2.两方面都修改。
1.用户态修改
2.内核态修改。
关于提权思路
一般有两种
1.利用内核权限执行commit_creds(prepare_kenrel_cred);
这个代码可以直接使调用的者的用户层拥有root权限。
2.爆破cred结构
3.内核反弹shell,用户态连接,即为root权限。
关于堆地址泄露
四次分配相同大小fastbin, 释放1,3两次分配内存进入链表。 那么三号前向指针将指向1号内存。利用任意读漏洞,将4号内存向前任意读,将可以获得1号内存堆的地址。
那么就获得再次fastbin堆的地址。
任意地址写
释放的堆块如果被溢出覆盖了前后向指针,那么分配的地址就受到的自主控制,实现了任意地址读写的目的。
【linux内核漏洞利用】call_usermodehelper提权路径变量总结
关于对可执行的问题
本来我利用堆地址泄露的能力,在堆块复制了需要执行的shellcode,但是当我mprotect修改虚拟地址的可执行属性后,堆块中的代码并没有获得可执行的能力。
unsorted bin attack
修改任意地址为一个较大的值。
offbyone
堆溢出一个字节实现任意地址读写。
fastbinattack
任意地址读写 单链表容易实现。双链表任意读写不太容易
unlink
那么 unlink 具体执行的效果是什么样子呢?我们可以来分析一下
- BK->fd=P->fd ==> BK->fd=FD
- FD->bk=P->bk ⇒ FD->bk=BK
某种状况溢出更改P fd bk的值: - FD=P->fd = target addr -12
- BK=P->bk = expect value
- FD->bk = BK,即 *(target addr-12+12)=BK=expect value
- BK->fd = FD,即 *(expect value +8) = FD = target addr-12
这里的情况就会变为target addr-12将会变为伪造的前向块, expect value将被当作伪造的后向块。实际这两个块不在链表中。
但是这两个伪造的块中的相应位置值却被改变了。
但是目前的lib分配器有校验,
// fd bk
if (__builtin_expect (FD->bk != P || BK->fd != P, 0)) \
malloc_printerr (check_action, "corrupted double-linked list", P, AV); \
为了满足这个条件,我们必须伪造 前后假块中的前后向指针,使其指向P。那么便绕过了检测。