内核模块内的memcpy指令导致内核崩溃

内核模块内的memcpy指令导致内核崩溃,c,linux-kernel,kernel-module,sgx,side-channel-attacks,C,Linux Kernel,Kernel Module,Sgx,Side Channel Attacks,我目前正试图在SGX enclave上复制一个微体系结构攻击(CacheZoom),同时我必须钩住一个中断服务例程(apic_timer_interrupt)。原作者继续对目标地址进行了一些奇怪的计算,我并不完全理解。最重要的是,memcpy指令导致我的系统崩溃 我对中断服务处理程序如何被调用的理解是,有一个中断向量表,它为不同的中断存储处理程序的基址,因此如果我们想钩住中断服务处理程序,我们可以通过覆盖中断向量表来指向我们的处理程序。我不确定内核符号表(/proc/kallsysms)是存储中

我目前正试图在SGX enclave上复制一个微体系结构攻击(CacheZoom),同时我必须钩住一个中断服务例程(apic_timer_interrupt)。原作者继续对目标地址进行了一些奇怪的计算,我并不完全理解。最重要的是,memcpy指令导致我的系统崩溃

我对中断服务处理程序如何被调用的理解是,有一个中断向量表,它为不同的中断存储处理程序的基址,因此如果我们想钩住中断服务处理程序,我们可以通过覆盖中断向量表来指向我们的处理程序。我不确定内核符号表(/proc/kallsysms)是存储中断向量表行条目的地址还是处理程序本身的地址。如果在case中它存储了中断向量表条目的地址,那么如果我只将新处理程序函数的地址复制到与内核符号表中的地址相对应的地址,这是不够的。是不是我错过了什么

我附加了做挂钩部分的功能。 这里,plocal_apic_timer_interrupt存储由(sudo cat/proc/kallsyms | grep“T apic_timer_interrupt)返回的地址,plapic_next_detaild存储由(sudo cat/proc/kallsyms | grep“T lapic u next_detaild”| awk'{print$1})返回的地址。攻击处理程序只是处理程序的函数定义

static void attack_handler(void);
static int deadline_handler(unsigned long delta, void * evt);
static void enable_attack_timer()
{
  unsigned int target_addr;
  unsigned char call_stub[] = {0xe8, 0xf1, 0xf2, 0xf3, 0xf4};
  unsigned char  jmp_stub[] = {0xe9, 0xf1, 0xf2, 0xf3, 0xf4};

  m_counter = 0;
  write_cr0 (read_cr0 () & (~ 0x10000));

  target_addr = attack_handler - plocal_apic_timer_interrupt - 5;  
  call_stub[1] = ((char*)&target_addr)[0];
  call_stub[2] = ((char*)&target_addr)[1];
  call_stub[3] = ((char*)&target_addr)[2];
  call_stub[4] = ((char*)&target_addr)[3];
  printk(KERN_ALERT "CACHEZOOM: %p\n", plocal_apic_timer_interrupt);
  printk(KERN_ALERT "CACHEZOOM: %p\n", plapic_next_deadLine);
  printk(KERN_ALERT "CACHEZOOM: %p\n", call_stub);


  memcpy((void*)plocal_apic_timer_interrupt, call_stub, sizeof(call_stub));  

  target_addr = deadline_handler - plapic_next_deadLine - 5;
  jmp_stub[1] = ((char*)&target_addr)[0];
  jmp_stub[2] = ((char*)&target_addr)[1];
  jmp_stub[3] = ((char*)&target_addr)[2];
  jmp_stub[4] = ((char*)&target_addr)[3];
  memcpy((void*)plapic_next_deadLine, jmp_stub, sizeof(jmp_stub)); 
  write_cr0 (read_cr0 () | 0x10000);

  hooked = true;
 
  printk("\nCACHEZOOM: ENABLED\n");
}
我尝试在没有memcpy指令和内核日志输出的情况下运行代码,如下所示。与变量关联的地址(我希望它有助于理解发生了什么):


您是否具有对您要从中键入/覆盖的内存部分的读写访问权限?您也可以使用
memcpy
进行此操作
jmp_存根[1]=((char*)&target_addr)[0];
嘿,感谢您的响应,但我认为写入控制寄存器(cr0)的cro指令允许主管级别在所有虚拟内存上写入,即使它是只读的,所以我认为这没有问题。

[  131.153507] CACHEZOOM, plocal_apic_timer_interrupt: 00000000a7cbf5a5
[  131.153511] CACHEZOOM, plapic_next_deadLine: 000000005f70f4fc
[  131.153512] CACHEZOOM, call_stub: 000000005b2b7d9c
[  131.153512] CACHEZOOM: hellooo
[  131.153513] 
               CACHEZOOM: ENABLED