在静态库的.text部分上运行运行时md5sum的最简单方法

问题描述 投票:0回答:2

Brainhive,

我正在寻找一种方法来确保我的代码没有被改变,最初的想法是找到.text部分的起始地址及其大小,运行md5sum(或其他散列)并与常量进行比较。

我的代码被编译为静态库,我不想散列整个二进制文件,只有我的库。

我如何能?它是否有助于添加带有保留标签的ld脚本?

系统是arm64,我正在使用GNU arm编译器(linaro实现)。

gcc compilation linker static-libraries sections
2个回答
3
投票

我正在寻找一种方法来确保我的代码没有被改变,最初的想法是找到.text部分的起始地址及其大小,运行md5sum(或其他散列)并与常量进行比较。

您的请求可能被误导的原因有多种:

  1. 任何愿意修改已编译代码的人也愿意修改您将在运行时进行比较的校验和。也就是说,您似乎想要执行以下操作: /* 0xabcd1234 is the precomputed checksum over the library. */ if (checksum_over_my_code() != 0xabcd1234) abort(); 攻击者可以使用一系列NOP指令轻松替换整个代码,然后继续使用修改后的库。
  2. 您的静态库(通常)不会以最终二进制文件中的字节序列结束。如果您的库中有foo.obar.o,并且最终用户将您的库与他自己的代码链接在main.obaz.o中,则生成的可执行文件的.text部分很可能由来自.textmain.o组成,然后来自.textfoo.o,然后来自.textbaz.o,最后来自.textbar.o
  3. 链接最终可执行文件时,库中的指令将更新(重新定位)。也就是说,假设您的原始代码具有CALL foo指令。你的.text部分中的实际字节将类似于0xE9 0x00 0x00 0x00 0x00(有一个重定位记录,表明0xE9之后的字节应该用foo的最终地址最终更新)。 链接完成后,假设foo在地址0x08010203结束,可执行文件的.text中的字节将不再是0。相反,他们将是0xE9 0x03 0x02 0x01 0x08(他们实际上不会出于与此无关的原因,但他们肯定不会全是0)。 因此,在归档库的实际.text部分计算校验和是完全没有意义的。

0
投票

有些工具允许您转储ELF部分。 elfcat让它变得非常容易,(elfcat --section-name=test the_file.o)但它也应该与objdump一起使用。一旦您转储了该部分,问题就减少为调整大小和散列文件。

© www.soinside.com 2019 - 2024. All rights reserved.