![](/img/trans.png)
[英]NASM x86_64 assembly in 32-bit mode: Why does this instruction produce RIP-Relative Addressing code?
[英]Linux sys_call_table rip relative addressing x86_64
我正在嘗試在Linux x86_64上獲取sys_call_table的偏移量。
首先,我通過從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的第一個字節是操作碼,然后是ModRM字節,然后是SIB,然后是32位位移,因此我將3加到ptr並將其解引用為整數值,然后將其添加到ptr,因為它是%RIP,並且地址是RIP相對的。 但是結果值是錯誤的,它與我在gdb中看到的值不一致,所以我在哪里錯了?
它不是x7e9fed00,而是-0x7e9fed00-負位移。
那是2的補數負數0x81601300的符號幅度形式
小端處理器將其存儲為“ 00 13 60 81”
不知道您是否會在結果地址找到sys_call_table。 作為一種替代想法,似乎有些人通過在內存中搜索應該在其中列出的指向函數的已知指針來找到它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.