本节通过一个例子来说明怎样使用Python的API将可执行文件转变为共享库文件。
可执行文件跟共享库文件头信息中的file_type是一样的,值都是E_TYPE.DYNAMIC,主要区别在于符号的导出。共享库的目的是公开函数,以便可执行文件可以链接并使用这些函数,而可执行文件则一般不公开函数。将可执行文件中的原始函数地址转换为与符号关联的导出函数,可公开可执行文件的内部函数。一旦目标函数被导出后,就可以像共享库函数那样链接并使用导出的目标函数。例如,在模糊测试的环境下,可以使用AFL(American Fuzzy Lop,一种基于覆盖引导的模糊测试工具)生成的数据对该函数进行测试。
本节的可执行文件源码如Listing 3.5所示。
Listing 3.5 位置无关的可执行文件源码crackme101.c
(1)转换脚本文件bin2lib.py如Listing 3.6所示。
Listing 3.6 基于LIEF的二进制文件到库文件的转换脚本文件bin2lib.py
脚本文件的运行命令如下:
其中,0x72A是可执行文件crackme101.bin中的check_found()函数的反汇编起始地址。
(2)生成的共享库文件为libcrackme101.so,其测试源码如Listing 3.7所示。
Listing 3.7 共享库文件libcrackme101.so的测试源码