我需要確定給定的 ELF 檔案是否源自 Go。根據此鏈接:
$ readelf -a traefik.stripped | grep "\.note\.go\.buildid"
這在任何方面都不如 go 的原生方式:
$ go tool buildid traefik.stripped
oPIWoPjqt1P3rttpA3ee/ByNXPhvgS37nIoJY-HYB/8b25JYXrgktA-FYgU5MU/0Posfq41xZW9BEPEG4Ub
這兩種方法都保證適用于剝離的二進制檔案嗎?
uj5u.com熱心網友回復:
我需要確定給定的 ELF 檔案是否源自 Go
這在一般情況下是不可能做到的。什么是和不是 Go 二進制檔案并沒有很好的定義,一個充分優化的 Go 二進制檔案最終可能只包含幾條指令。例如x86_64,您可能會得到一條HLT指令。
為什么 strip 本身不會洗掉此部分?
這部分(實際上是每個部分)對于執行來說不是必需的——您可以洗掉所有部分,二進制檔案仍然可以作業。
本節僅用于幫助開發人員識別特定構建。 默認情況下strip不會洗掉它,因為這會破壞本節的目的,但它當然可以這樣做。
一個無辜的 Go 開發人員可以構建一個 golang ELF 并意外洗掉這個(冗余??)部分
當然。開發者可以運行一個破碎的版本strip,或者他可以有別名strip使用strip --strip-all,或者他也可以使用一些其他的ELF后期處理工具,或者他也可以使用UPX,或...
uj5u.com熱心網友回復:
提到的部分是一個NOTE部分:
$ readelf -a traefik.stripped | grep "\.note\.go\.buildid" | sed -n "1,1p"
[11] .note.go.buildid NOTE 0000000000400f9c 00000f9c
顯然NOTE有時可能會洗掉部分以減小尺寸(相關):
objcopy --remove-section=.note.go.buildid traefik.stripped traefik.super.stripped
洗掉上述部分似乎不會損害整個二進制檔案的完整性
uj5u.com熱心網友回復:
至于使用標準的 go 工具,該部分應該在那里,但是有一種方法可以隱藏二進制檔案的 go 特性,而沒有任何惡意。使用upx來減小二進制檔案的大小將完全隱藏二進制檔案的 go 性質,因為 upx 可以與任何語言的二進制檔案一起使用。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/352562.html
下一篇:在瀏覽器上臨時存盤資料
