【摘要】 在對程序做安全審計、漏洞檢測時,通常都需要對程序做逆向分析,本文在沒有符號表的情況下,提出了一種恢復(fù)函數(shù)名稱的算法,方便對go語言二進制文件進行逆向分析,提升分析效率。
go語言是最近幾年發(fā)展非?;鸬囊环N語言,它具備和C/C++一樣的運行速度快的優(yōu)點,同時又具備開發(fā)效率高,支持包管理機制高階語言特點。其編譯出來的二進制文件格式和C/C++一樣運行在Linux平臺下是elf格式,運行在windows平臺下是pe格式,但同時在二進制文件的內(nèi)部細節(jié)上go語言有自己特有的屬性,二進制逆向人員可以利用go語言這些特有屬性來來實現(xiàn)對二進制文件進行更精準的逆向分析。
特性1:利用go語言中特有的節(jié)信息來判斷elf/pe文件的源代碼語言類型,是go語言還是C、c++語言。
通過判斷二進制文件中是否存在“.noptrdata”、“.gopclntab”、“.data.rel.ro.gopclntab”確定源代碼,如果存在上述節(jié)名稱,則源代碼為go語言;
特性2:在沒有符號表的情況下如何恢復(fù)函數(shù)名稱。
我們知道在C/C++編譯出來的二進制文件中,如果沒有符號表信息是沒法看到函數(shù)名稱的,在IDA工具中只能看到地址信息。
go語言怎么來恢復(fù)函數(shù)名稱呢,可以通過從.data.rel.ro節(jié)來恢復(fù)函數(shù)名,具體查找定位算法如下:
方法1:
解析解頭信息可以獲取magic, quantum, ptr_size, func_tab_count數(shù)據(jù),當magic為’\xfb\xff\xff\xff’時,entry_size = 2 * ptr_size為entry結(jié)構(gòu)體大小,func_tab_count 為entry結(jié)構(gòu)體數(shù)量;解析entry結(jié)構(gòu)獲取到名稱信息結(jié)構(gòu)數(shù)據(jù)位置偏移(需要注意64位和32位go程序 func_info_offset位置相反),讀取名稱信息結(jié)構(gòu)體數(shù)據(jù),再從中獲取到名稱字符串位置偏移(name_offset),根據(jù)此偏移定位到函數(shù)名稱字符串起始位置偏移,從該位置解析得到函數(shù)名稱。
方法2:
另外1.16版本go語言結(jié)構(gòu)有些新變化,magic變?yōu)椤痋xfa\xff\xff\xff’,解析頭信息獲取func_tab_cnt, file_cnt, func_name_off, cu_off, filetab_off, pctab_off, func_tab_off數(shù)據(jù),其中func_tab_off為entry數(shù)據(jù)起始位置,解析entry結(jié)構(gòu)獲取code_off, func_info_offset數(shù)據(jù),后續(xù)解析過程與magic=’\xfb\xff\xff\xff’一致。
總結(jié):
通過上述方法可以恢復(fù)函數(shù)真實名稱,從而方便對go語言二進制文件的逆向分析,提升分析效率。
可以試試下面的漏掃服務(wù),看看系統(tǒng)是否存在安全風(fēng)險:>>> 漏洞掃描服務(wù)
最新文章
- 文檔數(shù)據(jù)庫服務(wù)DDS數(shù)據(jù)恢復(fù)_MongoDB數(shù)據(jù)恢復(fù)_華為云
- TaurusDB數(shù)據(jù)恢復(fù)_備份恢復(fù)_文件恢復(fù)_恢復(fù)數(shù)據(jù)
- 調(diào)用函數(shù)_函數(shù)調(diào)用方式_函數(shù)工作流 FunctionGraph-華為云
- Gauss(DWS)數(shù)據(jù)加解密_數(shù)據(jù)加解密算法_數(shù)據(jù)加解密函數(shù)
- 什么是函數(shù)工作流_函數(shù)托管計算服務(wù)_函數(shù)工作流 FunctionGraph-華為云
- ModelArts模型訓(xùn)練_超參搜索簡介_超參搜索算法