欢迎光临本站!

Linux Kernel Exploit 内核漏洞学习(2)-ROP

来源:原创    更新时间:2019-08-12 21:39:08    编辑:星谷下载    浏览:529

Linux Kernel Exploit 内核漏洞学习(2)-ROP

简介



ROP的全称为Return-oriented Programming,主要思想是在栈缓冲区溢出的基础上,利用程序中已有的小片段 (gadgets) 来改变某些寄存器或者变量的值,从而控制程序的执行流程。


这种攻击方法在用户态的条件中运用的比较多,ret2shellcode、ret2libc、ret2text等ret2系列都利用到了ROP的思想,当然这种攻击手法在内核态同样是有用的,并且手法都基本一样。


这里我以2018年的强网杯中的core来进行演示和学习的,环境我已经放到的了github上面了,需要的可以自行下载学习。



前置知识



>>>>

kernel space to user space


我们知道Linux操作系统中用户态和内核态是相互隔离的,所以当系统从内核态返回到用户态的时候就必须要进行一些操作,才可以是两个状态分开,具体操作是:


1、通过swapgs指令恢复用户态GS的值;

2、通过sysretq或者iretq指令恢复到用户控件继续执行;

如果使用iretq指令则还需要给出用户空间的一些信息(CS、eflags/rflags、esp/rsp等)。比如这里利用的iretq指令,在栈中就给出CS,eflags,sp,ss等信息。


Linux Kernel Exploit 内核漏洞学习(2)-ROP


当然,我们可以通过下来这这个函数来获取并保存这些信息:


unsigned long user_cs, user_ss, user_eflags, user_sp;
void save_stats(){
asm(
"movq %%cs, %0\n"
"movq %%ss, %1\n"
"movq %%rsp, %3\n"
"pushfq\n"
"popq %2\n"
:"=r"(user_cs), "=r"(user_ss), "=r"(user_eflags),"=r"(user_sp)
:
: "memory"
);
}



>>>>

提权函数


在内核态提权到root,一种简单的方法就是是执行下面这个函数:


commit_creds(prepare_kernel_cred(0));


这个函数会使我们分配一个新的cred结构(uid=0, gid=0等)并且把它应用到调用进程中,此时我们就是root权限了。


commit_credsprapare_kernel_cred都是内核函数,一般可以通过cat /proc/kallsyms查看他们的地址,但是必须需要root权限。


Linux Kernel Exploit 内核漏洞学习(2)-ROP


具体分析



现在我们可以先分析一下这个core.ko驱动了,首先查看一下这个ko文件的保护机制有哪些:


Linux Kernel Exploit 内核漏洞学习(2)-ROP

评论区

表情

共0条评论
  • 这篇文章还没有收到评论,赶紧来抢沙发吧~

相关内容