1. 程式人生 > >核心地址空間大冒險:系統呼叫

核心地址空間大冒險:系統呼叫

開啟冒險之旅

我是一個執行緒,出生在這個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了。”

“發生了什麼?”

“剛才在核心空間遇到一個萌新,差點說漏嘴我是怎麼進去的了”

 

欲知後事如何,請關注後續精彩......

 

精彩回顧:

我是一個explorer的執行緒

我是一個防毒軟體執行緒

我是一個IE瀏覽器執行緒

位元宇宙-TCP/IP的誕生

產品vs程式設計師:你知道www是怎麼來的嗎?

我是一個流氓軟體執行緒

遠去的傳說:安全軟體群雄混戰史

一個HTTP資料包的奇幻之旅

闖蕩Linux帝國:nginx的創業