有没有办法检测ELF二进制文件是否被破坏/被篡改?

时间:2011-01-09 20:26:03

标签: unix elf

如何以编程方式检测ELF二进制文件是否被篡改或损坏?

例如,如果我删除ELF二进制文件的后半部分(或库共享对象)并粘贴随机文本,这将损坏它,之后它将无法工作。我想检测Unix ELF 32二进制文件或UNIX共享C库对象是否受此限制。

感谢。

1 个答案:

答案 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,