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