根据我组成员(@一夕思醉,@2018/7/11)的热烈讨论,我们对该题目有了一个大致的了解。
题目要求:
对于Linux下给定的ELF可执行程序、自行开发签名工具对程序的代码段(Load Segment)首先进行散列,然后对散列值进行签名,签名数据应作为单独的节(Section)附加到原ELF可执行程序的尾部。同时,应开发验证软件并加入操作系统,在运行任何ELF可执行程序前对ELF文件进行验证,若ELF可执行程序没有被签名或者签名验证失败则应停止运行本程序,若签名验证成功则可以正常运行。
签名后的ELF可执行程序可正常运行在带有签名验证的Linux操作系统上,以及不带有签名验证机制的Linux操作系统上;
签名后的ELF可执行程序中的签名数据节应可通过readelf与objdump等程序解析得到正确的值;
运行ELF可执行程序的方式应保持不变,不得通过其他程序运行ELF可执行程序的方式验证签名;
签名验证所需要的公钥、证书以及验证程序可以预先设置在操作系统中;
本题不考察选手对加密算法的实现,因此选手可以选择开源的加密软件库进行加密,但是对应强度应不低于RSA2048;
实现程序主要涉及对ELF可执行格式的理解、Linux操作系统下程序运行的机制的理解,以及对加密算法的运用。
分析:分为几个步骤。第一步要做的是环境配置,这道题目对环境的要求还是比较严苛的,限定使用C语言和UOS系统。
第二步:实现对elf文件的程序解析和散列。
第三步:加入签名程序,对散列值按照一定的规律进行记录,并将签名数据作为单独的节加入到程序末尾
第四步:加入验证程序,通过各种方法对签名进行验证,证明程序合法且未被篡改。
第五步:对判断结果进行处理,若判断结果为通过,运行,若判断结果为不通过,则停止运行
大致可以分为这么五个部分
对涉及到的陌生词汇进行解读:RSA2048(rsa为加密方式,2048为加密程度)
ELF文件:
在计算机科学中,是一种用于二进制文件、可执行文件、目标代码、共享库和核心转储格式文件
散列:
Hash,一般翻译做散列、杂凑,或音译为哈希,是把任意长度的输入通过散列算法变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,所以不可能从散列值来确定唯一的输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。
现在面临的问题:1.没有环境2.C语言掌握程度并不是很好 3.签名与验证系统的信息匹配较难实现。4.对ELF程序的识别以及散列存在技术问题。
来源:https://www.cnblogs.com/zhangzhongkun/p/12759529.html