我目前正在尝试在 SGX 飞地上重现微架构攻击(CacheZoom),同时我必须挂钩其中一个中断服务例程(apic_timer_interrupt)。原作者继续对我不完全理解的目标地址进行了一些奇怪的计算。最重要的是,memcpy 指令会导致我的系统崩溃。
我对如何调用中断服务处理程序的理解是,有一个中断向量表存储不同中断的处理程序的基地址,所以如果我们想挂钩中断服务处理程序,我们可以通过覆盖中断向量来实现表指向我们的处理程序。我不确定内核符号表(/proc/kallsysms)是存储中断向量表行条目的地址还是处理程序本身的地址。如果它存储中断向量表条目的地址,那么仅将新处理函数的地址复制到与内核符号表中的地址对应的地址是不够的。是我错过了什么吗?
我已经附加了挂钩部分的功能。这里,plocal_apic_timer_interrupt 存储了(sudo cat /proc/kallsyms | grep "T apic_timer_interrupt) 返回的地址,plapic_next_deadLine 存储了(sudo cat /proc/kallsyms | grep "t lapic_next_deadline" | awk '{print $1}') 返回的地址.attack_handler 只是处理函数定义。
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 指令的情况下运行代码,内核日志的输出如下。与变量关联的地址(我希望它有助于理解正在发生的事情):
[ 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