我需要确定一个给定的ELF文件是否源自Go。根据此链接
$ readelf -a traefik.stripped | grep "\.note\.go\.buildid"这在任何方面都比传统的方式低劣吗?
$ go tool buildid traefik.stripped
oPIWoPjqt1P3rttpA3ee/ByNXPhvgS37nIoJY-HYB/8b25JYXrgktA-FYgU5MU/0Posfq41xZW9BEPEG4Ub这两种方法都能保证在已剥离的二进制文件上工作吗?
发布于 2021-11-03 12:06:47
我需要确定给定的ELF文件是否源自Go。
一般来说,这是不可能的。什么是和不是一个Go二进制没有很好的定义,一个充分优化的Go二进制可能最终只包含几个指令。例如,在x86_64上,您可能会得到一条HLT指令。
为什么脱衣舞本身不移除这部分?
这个部分(实际上每个部分)并不是执行所必需的--您可以删除所有部分,并且二进制文件仍然可以工作。
本节仅用于帮助开发人员识别特定的构建。默认情况下,strip不会删除它,因为这将违背本节的目的,但它当然可以这样做。
一个无辜的go开发人员可以建立一个golang并意外地删除这个(冗余吗?)部分
好的。开发人员可以运行一个坏版本的strip,或者他可以使用strip --strip-all别名strip,或者他可以使用其他的ELF后处理工具,或者他可以使用UPX,或者.
发布于 2021-11-03 10:08:06
上述部分是一个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删除上述部分似乎不会损害整个二进制文件的完整性。
发布于 2021-11-03 10:28:59
至于使用标准的go工具,部分应该在这里,但是有一种方式可以隐藏二进制代码的go性质,而不存在任何恶意意图。使用upx减少二进制文件的大小将完全隐藏二进制文件的go性质,因为upx与二进制文件一起工作,不受任何语言的影响。
https://stackoverflow.com/questions/69821995
复制相似问题