開啟冒險之旅
我是一個線程,出生在這個Linux帝國,今天我的任務是去執行一段人類用C語言編寫的代碼。
一陣忙活過后,一個fopen函數調用的指令出現在我面前,跟隨指令指向的方向,我來到了libc.so的地盤,進入了一個名為open的房間,房間里的桌上放了一張紙,上面寫了一個編號和幾句指令。
根據指令,我需要把編號放到eax寄存器,把open函數的參數放到ebx、ecx、edx三個寄存器中。
忙完上面的操作,我環顧四周,發現這房間里還有一道門,門上寫着sysenter。
我小心翼翼的走了進去,突然,眼前閃過一道白光,緊接着光線消失,四周變得幽暗起來。但我能感覺到我在移動着,片刻之后,開始出現了亮光。
神秘的長者
“歡迎來到內核地址空間!”,一位白胡子老頭向我走了過來。
“敢問長者是誰”,我有點緊張。
“年輕人別怕,你是第一次來這里吧,難怪看着眼生。這里是帝國的內核空間,帝國核心都在這里,你們這些應用程序線程平時是很少這里的,我就是專門在這里接待從應用層下來的線程們,為你們指路的”,老頭一邊說,一遍捋了捋胡須。
“多謝老先生,勞煩您帶下路”,說完我倆就一起向前走。
很快,我們來到一面巨大的牆壁面前,牆壁上面有很多格子,每個格子上面都寫了一個編號。我注意到牆的最上面還有一塊招牌,上面寫着:sys_call_table。
“年輕人,這是系統調用表,來,把你的編號給我”,老頭轉過身來。
我想起來這里之前,名為open的房間里紙上的那個編號,記得我把它放到eax寄存器里去了。
我從eax寄存器取出之前放置的編號,交給了老頭。
“哦,是個2號,是要去sys_open啊”,說完,老頭打開了牆上2號格子的抽屜,拿出了一個紙條交給我。
我一看,上面寫着:
sys_open: 0x7ffe10002030
“老先生,看來你對這里很熟嘛,還沒看都知道我是要去sys_open”。
“那當然,從帝國誕生的第一天起,我就在這里工作了,帝國的三百多個系統調用我早就背的滾瓜爛熟了,剛來的時候我也和你差不多年輕,現在都滿頭白發咯,歲月不饒人啊!”,老頭又捋了捋胡須。
系統調用
“系統調用?什么意思?”,我第一次聽到這幾個字。
“你現在來到我們這里辦事,這就叫系統調用啊!”。
“還是不太明白,還請老先生賜教”。
“好吧,年輕人好學,老朽就給你說道說道。在天地混沌初開的時候,比特宇宙早期孕育的一些帝國文明,他們所有的程序都是和帝國自身的核心代碼在一個地方執行。但這樣的后果是程序之間經常發生混亂沖突,還經常傷害帝國本身的程序。”。
“到后來,一些新出現的帝國文明,像咱們的Linux帝國,還有Windows帝國等等,為了安全考慮,一方面把普通應用程序和帝國自身程序分開,普通應用程序執行的地方叫用戶態地址空間,而帝國核心程序運行的地方叫內核地址空間,這叫權限分離。另一方面把多個普通應用程序之間也分開,防止他們的沖突混亂,把這叫進程隔離。”老頭喝了口水繼續說道。
“老先生您說了這么多,這跟系統調用又有什么關系呢?”
“別着急啊,聽我繼續說給你聽。應用程序和帝國核心分開后,應用程序就沒法直接訪問磁盤、內存、網絡等等設備了。那他們需要訪問這些設備怎么辦呢?為了讓這些應用程序還能工作,帝國安排專門的部門來統一管理這些工作,把所有的功能分門別類開辟了300多個窗口來為你們提供服務,你前面拿到的sys_open函數就是其中一個。還設立一個特殊通道,類似於蟲洞,連接用戶空間和內核空間。而你們這些應用程序想要來辦事,就帶着辦事窗口的編號,從這個蟲洞過來,而我就在這頭接待你們,指引你們去具體的窗口辦理業務,整個過程呢就叫做系統調用啦!終於講完了,可累死老夫了”。
"蟲洞?是不是就是那個sysenter指令,通過它進入的?",我恍然大悟。
“對,沒錯!”。
“原來如此,那為何不直接把sys_open函數的地址寫在我來之前的open房間,還要弄一個編號來查,這不更省事嗎?”
“唉,此言差矣,這些個函數的地址都是機密,怎么能隨便透露給你們上面的應用程序呢。而且,為了安全,這些地址會隨着帝國每次啟動變化的,不是一個固定的地址,所以還是要用編號來查哦!”
“感謝老先生,今日獲益良多,時辰不早,我該去做我的正事了,再會”!
“年輕人再見,一會兒我們還會見面的,你還得從這里回去呢”,老頭說完就又去接待其他人去了。
線程內核堆棧
按照紙條上面的地址,我來到了sys_open函數的地方,開始執行這里的代碼,完成我要辦理的事情。
看到第一條push操作堆棧指令,我一下就慌了,我之前都是在用戶空間工作,第一次來這里,沒有堆棧可怎么辦吶!
就在這時,旁邊走過來一個大叔。
“你是第一次來這里吧!”,大叔一下看穿了我的萌新屬性。
“大叔你好,我確實是第一次來,這里沒有堆棧,我怎么push啊”,我向大叔求救。
“怎么沒有啊,你仔細看看你的堆棧指針esp指向的地方呢?”
順着esp指向的地方望去,果然有一個堆棧,不過和我來之前在用戶空間的堆棧不太一樣,這個小了許多。
“大叔,這個堆棧是哪來的啊?”,我又向大叔請教。
“這個叫線程的內核堆棧,每個應用程序的線程都有兩個堆棧,一個在用戶空間,一個在內核空間。這個呢就是你在內核空間的堆棧啦,專門供你在內核空間來辦事的時候使用的,因為用得少,加上內核空間的資源寶貴,所以比你之前那個小了很多”,大叔解答了我的疑惑。
“哦,原來如此啊,多謝大叔。對了大叔,你也是從那個sysenter蟲洞穿越過來的嗎?”
“我是從蟲洞過來的,不過不是sysenter哦,而是···哦我還有事要忙,就此別過吧”,說完匆忙離去。
我大吃一驚!難道還有別的蟲洞?
未完待續·······
彩蛋
“怎么樣,提權還順利嗎?”
“嗯,事情都辦妥了,只是出了一點小插曲。你檢查下我們進程的權限,現在應該已經是root了。”
“發生了什么?”
“剛才在內核空間遇到一個萌新,差點說漏嘴我是怎么進去的了”
欲知后事如何,請關注后續精彩......
精彩回顧: