我想在Linux x86_64上獲得sys_call_table的偏移量。Linux sys_call_table rip相對尋址x86_64
所有我讀指針由MSR_LSTAR閱讀它system_call進入第一,它是正確的
static unsigned long read_msr(unsigned int msr)
{
unsigned low, high;
asm volatile("rdmsr" : "=a" (low), "=d" (high) : "c" (msr));
return ((low) | ((u64)(high) << 32));
}
然後我分析它找到調用指令操作碼,它也是正確的
#define CALL_OP 0xFF
#define CALL_MODRM 0x14
static unsigned long find_syscall_table(unsigned char *ptr)
{
//correct
for (; (*ptr != CALL_OP) || (*(ptr+1) != CALL_MODRM); ptr++);
//not correct
ptr += *(unsigned int*)(ptr + 3);
pr_info("%lx", (unsigned long)ptr);
return ptr;
}
但是在調用操作碼後我沒有得到地址。 ptr的第一個字節是opcode,然後是ModRM字節,然後是SIB,然後是32位移位,所以我將ptr加3並將其解引用爲整數值,然後將其添加到ptr中,因爲它是%RIP,地址是RIP相對的。但結果值是錯誤的,它不符合我在gdb中看到的值,所以我錯在哪裏?
通過在內部進行挖掘,您實際上想要完成什麼目標? –
目標是在運行時修補sys_call_table。我想以上述的方式做到這一點,但我無法找出爲什麼它不工作 –
正如我以前寫的,「call * sys_call_table(,%rax,8)」的system_call條目和偏移量是正確的,我檢查了它gdb allready。我認爲我在RIP相對地址方面失敗了,但不知道確切的位置 –