Chapter.06 Pwn入門與Segmentation Fault
“
一片漆黑。
筱懿明仿佛被封鎖于一個獨特的空間當中,向前、向后,視野中空無一物,只余下無邊的黑暗。
筱懿明張了張嘴,嘗試著想要說些什么,但是整個世界仍然如同一泓古泉一般沉寂,他甚至無法察覺到自己喉嚨的顫動。
恍惚之間,一個虛無縹緲的聲音從遠處傳來。
「不要...」
筱懿明四下探望著,嘗試著尋找聲音的來源,但映入眼簾中的仍是無盡的黑暗。
筱懿明能夠感受得到,這聲音的來源似乎在逐漸向他靠近,卻似乎只是在不斷地重復著那一句奇怪的話。伴隨著聲音的來源似乎越來越近,筱懿明最終聽清了她所說的——
「不要使用帶有安全隱患的 gets()函數(shù)!」
”
筱懿明猛地睜開雙眼,從床上彈了起來——
他已經(jīng)很久沒有做過這樣的夢了,又或者說,他已經(jīng)很久沒有做過夢了。
自從那一天起。
筱懿明搖了搖頭,隨即拿起身旁的手機——不出所料,現(xiàn)在已經(jīng)是早上十一點了,——當然,十一點已經(jīng)基本上算是中午的范疇了,室友們早就已經(jīng)去上課了,寢室里只有他一個人,但十一點起床并不意味著筱懿明就是一個貪睡的人,恰恰相反的是他一直信奉著“能夠少睡一點就少睡一點”的神秘理念,平均下來一天只睡五個小時左右,對他來說,計算機所帶給他的樂趣遠遠大于睡覺的樂趣——而按照平均一天只睡五個小時這個情況向前逆推,我們很容易得到的便是我們的主人公筱懿明在將近凌晨六點鐘左右才上床睡覺——毫無疑問,是在通宵看一道逆向題。
雖然當筱懿明將二進制文件拖入 IDA 之后看起來似乎能夠分析出匯編代碼的樣子,但是有著這樣一個令他困擾的函數(shù)——無法被成功反編譯,而在 IDA-view 窗口的左側(cè)屬于這個函數(shù)的這一段反匯編代碼左側(cè)的地址【全部被標紅】——似乎是 IDA 在警告著筱懿明。
不僅如此,甚至從某個語句開始下方的數(shù)據(jù)全部都無法被成功反匯編,在 IDA 中顯示的只有原始的數(shù)據(jù)。
------
.text:0000000000008121 jz short near ptr loc_8125+1
.text:0000000000008123 jnz short near ptr loc_8125+1
.text:0000000000008125
.text:0000000000008125 loc_8125:; CODE XREF:.text:0000000000008121↑j
.text:0000000000008125 ;.text:0000000000008123↑j
.text:0000000000008125 call near ptr 70860E72h
.text:0000000000008125 ;---------------------------------------------------------------------------
.text:000000000000812A dw 0FFFFh, 48FFh, 0C789h
.text:0000000000008130 dq 0C38948FFFFB56BE8h, 48FFFFFF70858D48h, 48FFFFB489E8C789h
------
再往下的全都是沒法成功被分析出來的數(shù)據(jù),而對于匯編十分不熟悉的筱懿明看了大半個晚上才弄明白 x86 中的各種基礎(chǔ)指令的含義,更別說分析程序的邏輯了。
“這里這兩個近跳轉(zhuǎn)是干啥的...這里還有一個無效的跳轉(zhuǎn)...下面這些數(shù)據(jù)又是干啥的?.text段不是代碼段么?”
“或許應(yīng)該轉(zhuǎn)換一下思路......?如果說只是為了沖分的話多做幾種類型的題目或許會好一些......?”筱懿明思忖著,悄然嘆了一口氣,“似乎 pwn 也是二進制安全這個領(lǐng)域的?看一下都是些什么樣的題......”
GEEKERCTF,pwn分區(qū),第一道題目「Pwn2Own」,說明如下——
------
什么是Pwn?
Pwn /po?n/這個詞本身其實是一個擬聲詞,最初來源于黑客們設(shè)想中的完全獲取一臺設(shè)備的控制權(quán)后便會發(fā)出“砰”的一聲,Pwn因此而得名,即利用挖掘到的二進制漏洞對設(shè)備或系統(tǒng)發(fā)起攻擊,并最終拿到shell(獲取控制權(quán))
Pwn也是最能代表原教旨主義黑客的一個安全研究方向
題目的二進制文件一般會被部署到服務(wù)器上,使用nc xx.xx.xx.xx(ip) xxxx(端口)命令可以與服務(wù)器進行交互。并且該二進制文件的副本(與服務(wù)器上的完全相同或者基本相同)將作為附件形式被提供給選手下載。
你需要逆向分析二進制文件副本中存在的可利用漏洞,針對其編寫Exploit(漏洞利用腳本),然后向服務(wù)器發(fā)起攻擊,拿到服務(wù)器上保存的flag文件或字符串,將其提交至本平臺。
注意命令行中的nc并不是做題工具,而是 netcat ,用以連接遠程服務(wù)器的小工具;為了更為方便地解題,我們推薦在Linux下安裝pwntools庫(或者其它),用于編寫可用性較高的Exploit。至于如何安裝,如何使用,就需要聰明的你發(fā)揮自己的學習能力啦~
------
“Linux 啊......那看來還得整一個虛擬機......先分析一下這個程序看看,”筱懿明緩緩將二進制文件拖進 IDA ,“簡單來說......就是這個程序被部署到了服務(wù)器的某個端口上,而我們需要找到他的漏洞并以此獲得遠程服務(wù)器的控制權(quán)......?”
筱懿明的嘴角不禁勾起一絲弧度。
“這種事情,可真是......黑客得不得了呢.....”
熟練地將附件下載至本地,拖入 IDA,這一次的程序相比起 RE 分區(qū)的那幾道題而言分析的難度低了不止一個檔次,整個程序就只有孤零零的幾個函數(shù), main 函數(shù)的邏輯更是簡單:
------
int __cdecl main(int argc, const char **argv, const char **envp)
{
char v4[112];//[rsp+0h][rbp-70h] BYREF
gets(v4, argv, envp);
return 0;
}
------
筱懿明的腦子里緩緩冒出一個問號:?
“這程序怎么只有一個 gets 函數(shù)啊,flag呢?我flag去哪了?”
筱懿明將目光放到左側(cè)的 Functions Window 中,卻也是不見任何 flag 的身影,但哪怕真的有,在 main 函數(shù)的執(zhí)行流中似乎也見不到其蹤跡,不過倒是有著一個名為「backdoor」的小函數(shù)引起了筱懿明的注意——
------
int backdoor()
{
return system(“/bin/sh“);
}
-----
“backdoor 是「后門」的意思吧,意思是說運行這個函數(shù)就有后門?什么意思?system我倒是懂...就是直接用系統(tǒng)執(zhí)行嘛...那/bin/sh又是什么東西?而且這個程序也執(zhí)行不到backdoor啊,不是直接gets讀入了就結(jié)束了嘛?”
無數(shù)的問題沖擊著筱懿明的大腦,令他陷入混亂之中,雖然這個程序的邏輯相比起他在逆向分區(qū)所做的哪怕是簽到題都要簡單得多,但目前的他卻是不能夠理解——這樣一個程序怎么就能夠讓他“黑入目標服務(wù)器”——拿到目標主機的控制權(quán)呢?
“先運行看一下效果...隨便輸點東西試試...”筱懿明熟練地用鼠標雙擊二進制文件,這一次卻是沒有彈出熟悉的黑框框,而是彈出了來自Windows的親切提示——“你要如何打開這個文件?”。
“這是為啥...看來這個程序只能在Linux上跑?感覺應(yīng)該是這個樣子...”雖然筱懿明此時還不知道 ELF 與 PE 兩種文件格式,但卻是誤打誤撞找到了解決問題的辦法,“那就裝一個「黑客必備」的 Kali Linux 吧!”
對于以前使用過 NOI Linux 的筱懿明而言安裝虛擬機并非難事——當然,目前他對 Linux 仍然是一無所知的狀態(tài),只知道如何在 NOI Linux 下使用 DEV C++編譯源程序并進行調(diào)試——來自于高中打 NOIP 的那段經(jīng)歷給他留下的知識——而日常編程他倒是更習慣于在 Windows 上弄,因為以前編寫的代碼基本只用到了標準庫而 OI 主要考的又是算法因此倒也沒有出過問題。
正所謂“安裝五分鐘,下載兩小時”,雖然江洲科學技術(shù)大學的計算機科學與技術(shù)專業(yè)在第X輪學科評估中拿到了A-的好成績,網(wǎng)絡(luò)空間安全專業(yè)更是拿到了A,但是校園網(wǎng)的網(wǎng)速卻是比一些C-的大學還要差,據(jù)學長們相傳二十年前為了建設(shè)一流計算機學科,當年校園網(wǎng)建設(shè)這一塊據(jù)說是投入了大量經(jīng)費,每位同學都給到了5Mbps的帶寬,每人每月有8GB的流量——如今二十多年過去了,筱懿明還依然在享用著學長們留下來的豐富校園網(wǎng)資源,這每個月8GB的5Mbps的流量就好像是一條紐帶,將江洲科學技術(shù)大學這二十多屆的學生緊密地聯(lián)系在了一起,望著眼前打開個網(wǎng)頁都要等上半天的瀏覽器,筱懿明仿佛回到了二十多年前互聯(lián)網(wǎng)剛剛形成時的那個純潔無暇的模樣。
“還是開個手機熱點來得實在...”雖然校園網(wǎng)的建設(shè)似乎尚且落后于時代,但江州科學技術(shù)大學卻是整個江洲市——乃至于全國最早完成5G全面覆蓋的高校之一,在5G的強力加持下,一個不到3GB大小的鏡像文件便很快出現(xiàn)在了筱懿明的電腦硬盤中,圖形化的安裝界面也讓筱懿明輕松安裝好了Kali Linux。
“不過怎么把這個文件弄進虛擬機里啊...”
在網(wǎng)上簡單查找了幾種文件共享的方法之后筱懿明便決定還是直接在虛擬機里面上競賽平臺重新下載題目文件來得實在一些,好在現(xiàn)在主流的桌面Linux發(fā)行版都自帶有 Firefox 瀏覽器——不過其實較新的Linux發(fā)行版(例如Ubuntu20.04)都支持在宿主機與虛擬機之間直接進行文件的復制。
“在Linux下運行二進制文件好像還要打開那個黑框框...我記得好像是在文件夾里右鍵....「Open in Terminal」...有了...”快速百度了一下「如何在Linux上執(zhí)行程序」,筱懿明在彈出的“黑框框”——終端當中小心翼翼地敲下了「./pwn」。
“按照之前逆向分析的結(jié)果這個程序就只有一個普通的gets()函數(shù),所以現(xiàn)在屏幕上啥都沒有...隨便輸點東西試試...”
筱懿明嘗試了諸如「114514」、「woshijiaxintang」、「ndfhdhffhjkfdafdvw473847932rkjnac」等各種奇形怪狀的字符串,但每一次程序都在其輸入結(jié)束之后便沒有任何動靜地結(jié)束了。
“完全無法理解的存在...這咋就能黑進去...”已經(jīng)一個多小時過去了,毫無疑問的是,經(jīng)過了無數(shù)次的嘗試,筱懿明依然沒有找到突破口,“按逆向分析的結(jié)果這個程序就只是一個簡單的讀入輸入的程序?。窟@我能做啥?”
筱懿明的腦海中突然浮現(xiàn)了一個身影——排在GeekerCTF排行榜第五名的宋文,大部分題目都解出來了的「Watcherm4n」毫無疑問是能解開pwn方向的入門題的,但是先不說比賽期間交流題目解法是否合乎比賽規(guī)則,心高氣傲的筱懿明是不可能接受“連入門題也要問大佬該怎么做”這種事情的——至少目前他還是“如此有原則”的一個人——當然,是他自認為如此。
“還是再重新看看逆向有沒有什么新發(fā)現(xiàn)吧...”
筱懿明重新切回 IDA 窗口,默默地注視著那個孤零零的 gets()函數(shù),他突然想到一個問題——
“gets()函數(shù)向 v4 這個字符數(shù)組內(nèi)存放數(shù)據(jù),但是 v4 的大小好像只有112,如果我輸入多于 112 個字符會怎樣呢?”
思索片刻后筱懿明便決定展開行動,反正只是本地測試,哪怕輸完以后虛擬機炸了他都不會心疼——雖然說這種事情基本上不可能發(fā)生。
112個字符——沒有動靜。
113個字符——沒有動靜。
114個字符——沒有動靜。
115個字符——沒有動靜。
116個字符——沒有動靜。
117個字符——沒有動靜。
118個字符——這一次程序沒有再重新回到「root@kali:~#」,而仍像是還在等待輸入的樣子。
“卡住了?”
筱懿明再次敲擊了回車,這一次在終端當中出現(xiàn)了一行陌生的英文——
「Segmentation fault (core dumped)」。
墨晚鳶
好像挺久沒更新了...最近是越來越忙啦