有关memfrob功能的设计和使用的问题

时间:2014-11-29 22:18:28

标签: c memory encryption gnu

来自man page of memfrob

void *memfrob(void *s, size_t n);
     

memfrob ()函数   通过异或来加密存储区 s 的第一个 n 字节   每个字符的编号为42.可以通过使用来反转该效果   加密内存区域上的 memfrob ()。

     

请注意,此功能不是XOR的正确加密例程   常量是固定的,仅适用于隐藏字符串。

我对memfrob功能有以下问题:

  1. 为什么XORing用数字42完成?
  2. 为什么XOR常数被修复以及为什么memfrob的设计者没有将常数选择留给用户?
  3. 在什么意义上它适合隐藏字符串?由于它可以反转,因此不应该用于加密很重要的应用程序,它在实践中用于什么?

2 个答案:

答案 0 :(得分:4)

memfrob()的目的(如果你想称之为目的)是隐藏字符串,这样当你运行strings时就不会看到它们。当您的二进制文件包含明文密码并且您希望阻止爱管闲事的人找出这些密码时,这可能很有用。当然,不容易破解XOR-by-42,但它总比没有好。

XOR with的数字可以是任意的,但它需要在glibc的连续版本中保持不变,因此依赖于数字42的代码不会中断。

有些人认为memfrob()是一个笑话功能,但我不确定是不是真的如此。尽管如此,你不应该使用它,因为它不是标准函数(因此在非glibc平台上不可用),并且因为混淆不能代替正确的安全性。

它的笑话是it is the meaning of Life。它与rot-13类似,因为它是一个最简单的加密,并再次运行它会恢复字符串。 Rot-13对明文中的空格没有任何作用,而memfrob有交换空格和换行的奇怪结果:

space = 100000 (32), 42 = 101010, 32^42 = 001010 (10 = LF, and 10^42 back to 32)

虽然这些混淆,但它们的加密性很差,因为只有通过查看结果才能识别它们:很多r和n然后它就会腐烂13;很多CR,\和^然后memfrob。

答案 1 :(得分:0)

使用memfrob()在内存中加密/解密密码并不是很好。如上所述,该功能在系统的存储器中被处理。例如,当使用像gdb这样的简单调试器并在memfrob()函数上放置断点时,可以轻松读取值。