Есть ли способ обнаружить, что двоичный файл ELF сломан / подделан или нет? - PullRequest
1 голос
/ 09 января 2011

Как программно определить, является ли двоичный файл ELF подделанным или сломанным?

Например, если я удаляю вторую половину двоичного файла ELF (или разделяемого объекта библиотеки) и вставляю произвольный текст, это повредит его и не будет работать после. Я хочу определить, подвергается ли это двоичный объект Unix ELF 32 или объект общей библиотеки C UNIX.

Спасибо.

1 Ответ

1 голос
/ 10 января 2011

Я не уверен, о чем вы думаете, но «правильный способ» проверки двоичного файла ELF - это использование HASH, такого как SHA-1, MD5 и т. Д.

Когда вы создаете файл 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

Здесь у вас есть больше примеров на испанском Где MD5 в Solaris и как его использовать

Если хеширование не является решением, вы можете использовать (в 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

...