两个函数地址减法

时间:2015-10-26 16:45:19

标签: c function subtraction

我正在阅读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的结果是什么?

3 个答案:

答案 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复制到地址0NULL)。

答案 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个字节的值   直接到目的地指向的内存块。