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