为了账号安全,请及时绑定邮箱和手机立即绑定

如何确定 ELF 文件是否为 Go ELF 文件?

如何确定 ELF 文件是否为 Go ELF 文件?

Go
哈士奇WWW 2022-10-10 19:04:58
我需要确定给定的 ELF 文件是否来自 Go。根据此链接:$ readelf -a traefik.stripped | grep "\.note\.go\.buildid"这是否以任何方式不如 Go 的原生方式:$ go tool buildid traefik.strippedoPIWoPjqt1P3rttpA3ee/ByNXPhvgS37nIoJY-HYB/8b25JYXrgktA-FYgU5MU/0Posfq41xZW9BEPEG4Ub两种方法都可以保证在剥离的二进制文件上工作吗?
查看完整描述

3 回答

?
摇曳的蔷薇

TA贡献1793条经验 获得超6个赞

我需要确定给定的 ELF 文件是否来自 Go

这是一般情况下不可能做到的。什么是和不是 Go 二进制文件没有很好的定义,一个充分优化的 Go 二进制文件最终可能只包含几条指令。例如x86_64,您可能会得到一条HLT指令。

为什么 strip 本身不会删除此部分?

这部分(实际上是每个部分)对于执行不是必需的——您可以删除所有部分,二进制文件仍然可以工作。

本节用于帮助开发人员识别特定构建。 默认情况下strip不会删除它,因为这会破坏本节的目的,但它当然可以这样做。

一个无辜的 go 开发人员可以构建一个 golang ELF 并意外删除这个(冗余??)部分

当然。开发人员可以运行一个损坏的版本strip,或者他可以使用别名stripstrip --strip-all或者他可以使用其他一些 ELF 后处理工具,或者他可以使用 UPX,或者......


查看完整回答
反对 回复 2022-10-10
?
红颜莎娜

TA贡献1842条经验 获得超12个赞

至于使用标准的 go 工具,该部分应该在那里,但是有一种方法可以隐藏二进制文件的 go 特性而没有任何恶意。使用upx来减小二进制文件的大小将完全隐藏二进制文件的 go 特性,因为 upx 可以处理任何语言的二进制文件。



查看完整回答
反对 回复 2022-10-10
?
侃侃尔雅

TA贡献1801条经验 获得超16个赞

提到的部分是一个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

删除提到的部分似乎不会损害整个二进制文件的完整性


查看完整回答
反对 回复 2022-10-10
  • 3 回答
  • 0 关注
  • 184 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信