如何以编程方式检测ELF二进制文件是否被篡改或损坏?
例如,如果我删除ELF二进制文件的后半部分(或库共享对象)并粘贴随机文本,这将损坏它,之后它将无法工作。我想检测Unix ELF 32二进制文件或UNIX共享C库对象是否受此限制。
感谢。
答案 0 :(得分:1)
我不确定你在想什么,但验证ELF二进制文件的“正确方法”是使用像SHA-1,MD5等HASH。
创建ELF文件时,您还可以使用此HASH算法创建“签名文件”,即MD5并验证结果。
例如,在Solaris上,您可以使用命令
创建MD5,SHA1,SHA256摘要# digest -a [algorithm] [/path/to/file] {-v}
因此,要验证“/ bin / sh”以防止修改,您应该
# digest -v -a md5 /bin/sh
md5 (/bin/sh) = f4ad35f5246f817d68f4895463d79b09
# digest -v -a sha1 /bin/sh
sha1 (/bin/sh) = aa3843a19f2225458d7e3e765f44e229a09c0ad0
# digest -v -a sha256 /bin/sh
sha256 (/bin/sh) = a5e1a0062bb6600f06e029ce58f500169e966400b173b7fba504d5cd4635f291
这里有更多西班牙语Where is MD5 in Solaris and HowTo Use it
的例子如果散列不是解决方案,则可以使用(在Solaris上)命令将ELF验证为 elfdump 和 ldd
您可以将 ldd 与 -iv 一起使用来验证共享库初始化
itily@openzooey:~/hello.world$ ldd -iv hello
find object=libc.so.1; required by hello
libc.so.1 => /lib/libc.so.1
find version=libc.so.1
libc.so.1 (SYSVABI_1.3) => /lib/libc.so.1
libc.so.1 (SUNWprivate_1.1) => /lib/libc.so.1
object=/lib/libc.so.1; filter for /usr/lib/ld.so.1
object=/lib/libc.so.1; filter for libm.so.2
find object=libm.so.2; required by /lib/libc.so.1
libm.so.2 => /lib/libm.so.2
find object=libc.so.1; required by /lib/libm.so.2
find version=libc.so.1
libc.so.1 (SUNW_1.1) => /lib/libc.so.1
libc.so.1 (SUNWprivate_1.1) => /lib/libc.so.1
init object=/lib/libc.so.1
要生成ELF校验和,您可以使用 -k
选项itily@openzooey:~/hello.world$ elfdump -k hello
elf checksum: 0x8922
但是,如果你没有可信任的ELF 进行比较,我认为这有点困难。
我希望这就是你要找的东西,
Urko,