Brainhive,
我正在寻找一种方法来确保我的代码没有被改变,最初的想法是找到.text部分的起始地址及其大小,运行md5sum(或其他散列)并与常量进行比较。
我的代码被编译为静态库,我不想散列整个二进制文件,只有我的库。
我如何能?它是否有助于添加带有保留标签的ld脚本?
系统是arm64,我正在使用GNU arm编译器(linaro实现)。
我正在寻找一种方法来确保我的代码没有被改变,最初的想法是找到.text部分的起始地址及其大小,运行md5sum(或其他散列)并与常量进行比较。
您的请求可能被误导的原因有多种:
/* 0xabcd1234 is the precomputed checksum over the library. */
if (checksum_over_my_code() != 0xabcd1234) abort();
攻击者可以使用一系列NOP
指令轻松替换整个代码,然后继续使用修改后的库。foo.o
和bar.o
,并且最终用户将您的库与他自己的代码链接在main.o
和baz.o
中,则生成的可执行文件的.text
部分很可能由来自.text
的main.o
组成,然后来自.text
的foo.o
,然后来自.text
的baz.o
,最后来自.text
的bar.o
。CALL foo
指令。你的.text
部分中的实际字节将类似于0xE9 0x00 0x00 0x00 0x00
(有一个重定位记录,表明0xE9
之后的字节应该用foo
的最终地址最终更新)。
链接完成后,假设foo
在地址0x08010203
结束,可执行文件的.text
中的字节将不再是0。相反,他们将是0xE9 0x03 0x02 0x01 0x08
(他们实际上不会出于与此无关的原因,但他们肯定不会全是0)。
因此,在归档库的实际.text
部分计算校验和是完全没有意义的。有些工具允许您转储ELF部分。 elfcat让它变得非常容易,(elfcat --section-name=test the_file.o
)但它也应该与objdump
一起使用。一旦您转储了该部分,问题就减少为调整大小和散列文件。