通過(guò)dlopen函數(shù)打開(kāi)136字節(jié)大小的so文件可以將藏匿于程序頭表的匯編指令運(yùn)行,這是如何做到的。
在學(xué)習(xí)復(fù)現(xiàn)某個(gè)漏洞的時(shí)候,查閱到了分析文章,該文章地址為該漏洞的分析文章。在作者進(jìn)行漏洞利用時(shí),構(gòu)造了如下的.so文件。
白色框框住的二進(jìn)制數(shù)據(jù)就是如下圖的匯編指令
匯編指令的意思就是利用execve系統(tǒng)調(diào)用運(yùn)行了/tmp/hax腳本。
當(dāng)我通過(guò)dlopen函數(shù)與openssl的engine參數(shù)加載該.so文件時(shí),該.so文件都能被運(yùn)行,且無(wú)報(bào)錯(cuò),如下圖所示。
其中runlib程序代碼,以及/tmp/hax腳本內(nèi)容如下圖所示
openssl的engine參數(shù)最后也是運(yùn)行了dlopen。
那么問(wèn)題就是,為什么dlopen可以運(yùn)行這個(gè).so的這段匯編指令,dlopen打開(kāi).so文件不應(yīng)該只能運(yùn)行.init段的代碼嗎?
我簡(jiǎn)略分析了一下dlopen的源碼,也僅僅是打開(kāi).so文件讀取ELF頭數(shù)據(jù)進(jìn)行比對(duì),然后將程序段載入內(nèi)存,并無(wú)直接執(zhí)行指令的代碼。
同時(shí),該.so文件數(shù)據(jù)的入口地址為0x2,圖1白框的匯編指令位于第一個(gè)Dynamic類(lèi)型的程序頭處,該程序頭的記錄該程序頭的地址為0x58,好像怎么樣都不會(huì)執(zhí)行到這段匯編指令啊。
該程序頭的各項(xiàng)數(shù)據(jù)如下圖所示
那么請(qǐng)問(wèn)為什么通過(guò)dlopen打開(kāi)該.so文件就可以運(yùn)行這段匯編指令呢?