這篇是關於如何獲取sys_call_table位址教學,那麼什麼是sys_call_table,它是Linux平台上提供給Kernel使用的系統呼叫(system call),像是開檔的系統呼叫(sys_open)、寫檔的系統呼叫(sys_write),這些都是提供給Kernel所使用的,因此只要獲取sys_call_table的位址,就能攔截(Hook)系統上的所有系統呼叫,然而駭客只要透過攔截sys_call_table裡的系統呼叫,就能輕而易舉達到隱藏檔案、隱藏網路埠(port),甚至是提權到root,那我們來看看,到底是如何獲取sys_call_table的位址。
一、System.map
獲取sys_call_table的位址,最簡單的方法是查看/boot底下的System.map檔案,裡面就有標記sys_call_table的位址。
二、entry_64.S
在arch\x86\entry路徑下的entry_64.S檔案,裡面的程式碼有調用到sys_call_table(在entry_SYSCALL_64裡面),因此我們可以藉由它來獲取sys_call_table的位址。
我們還需要知道怎樣獲取entry_SYSCALL_64的位址,從arch\x86\kernel\cpu路徑下的common.c裡有初始化entry_SYSCALL_64的位址,它會利用wrmsrl將entry_SYSCALL_64的位址寫到MSR_LSTAR暫存器,因此我們只要透過rdmsrl,將它讀取出來就行了。
三、獲取sys_call_table實作
從上述的理論寫個小程式,再利用dmesg指令,將printk的訊息印出來,這樣我們就能輕鬆的獲取sys_call_table的位址了,最後只要sys_call_table[__NR_open] = own_open,就能攔截(Hook)sys_open啦!