核心地址空間大冒險:系統呼叫
開啟冒險之旅
我是一個執行緒,出生在這個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的創業