首頁
社區(qū)
課程
招聘
通過dlopen函數(shù)打開136字節(jié)大小的so文件可以將藏匿于程序頭表的匯編指令運(yùn)行,這是如何做到的。
白露降 2022-12-31 1648

在學(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)我通過dlopen函數(shù)與openssl的engine參數(shù)加載該.so文件時(shí),該.so文件都能被運(yùn)行,且無報(bào)錯(cuò),如下圖所示。

 

圖片描述

 

其中runlib程序代碼,以及/tmp/hax腳本內(nèi)容如下圖所示

 

圖片描述

 

圖片描述

 

openssl的engine參數(shù)最后也是運(yùn)行了dlopen。
那么問題就是,為什么dlopen可以運(yùn)行這個(gè).so的這段匯編指令,dlopen打開.so文件不應(yīng)該只能運(yùn)行.init段的代碼嗎?

 

我簡略分析了一下dlopen的源碼,也僅僅是打開.so文件讀取ELF頭數(shù)據(jù)進(jìn)行比對(duì),然后將程序段載入內(nèi)存,并無直接執(zhí)行指令的代碼。

 

同時(shí),該.so文件數(shù)據(jù)的入口地址為0x2,圖1白框的匯編指令位于第一個(gè)Dynamic類型的程序頭處,該程序頭的記錄該程序頭的地址為0x58,好像怎么樣都不會(huì)執(zhí)行到這段匯編指令啊。
該程序頭的各項(xiàng)數(shù)據(jù)如下圖所示
圖片描述

 

那么請(qǐng)問為什么通過dlopen打開該.so文件就可以運(yùn)行這段匯編指令呢?

收藏
2條回答
mb_jsalosiw 2022-12-31 2022-12-31編輯

也許是這個(gè)?
像win的DllMain一樣(?
https://www.cnblogs.com/D3Hunter/p/3175770.html#:~:text=DllMain%E5%8F%AF%E4%BB%A5%E5%9C%A8dll%E5%8A%A0%E8%BD%BD%E5%88%B0%E8%BF%9B%E7%A8%8B%E3%80%81%E7%BA%BF%E7%A8%8B%E6%97%B6%E8%B0%83%E7%94%A8%EF%BC%8C%E5%8F%AF%E4%BB%A5%E5%81%9A%E4%BA%9B%E5%88%9D%E5%A7%8B%E5%8C%96%E3%80%81%E6%B8%85%E7%90%86%E7%9A%84%E5%B7%A5%E4%BD%9C%20%E4%BD%86%E5%9C%A8linux%E4%B8%8A%E6%B2%A1%E6%9C%89%E4%B8%93%E9%97%A8%E7%9A%84%E5%87%BD%E6%95%B0%EF%BC%8C%E5%8F%AF%E4%BB%A5%E4%BD%BF%E7%94%A8gcc%E6%89%A9%E5%BC%A0%E5%B1%9E%E6%80%A7%20__attribute__,%28%28constructor%29%29%20and%20__attribute__%20%28%28destructor%29%29%E6%9D%A5%E5%AE%9E%E7%8E%B0
問就是MAGIC

回復(fù)
白露降: 這個(gè)是echo指令直接寫入空白文件的,沒有經(jīng)過編譯,而且是畸形的elf文件。
回復(fù) 2022-12-31
白露降 2023-1-3

https://www.int80.top/23-1-2/
通過調(diào)試分析dlopen源碼已經(jīng)解決該問題,分析過程分享在上面的博客上了

回復(fù)
elf文件
  參與學(xué)習(xí)     人
  提問次數(shù)     100 個(gè)
0
我的提問
0
我的回答
0
學(xué)習(xí)收益