Memcpy()在安全编程中?

Tim*_*Tim 15 c security memcpy

我最近偶然发现了一篇声称微软memcpy()在其安全编程商店禁止该功能的文章.我理解该功能固有的漏洞,但是有必要完全禁止它的使用吗?

我写的程序是应该memcpy()完全避免,还是只是确保它安全使用?有哪些替代品可以提供类似但更安全的功能?

Tho*_*day 29

Microsoft提供了验证其参数的memcpy和wmemcpy的替代方法.

memcpy_s说,"嗯,在我从这个地址读取之前,让我自己验证它不是空指针;在我写入这个地址之前,我将再次执行该测试.我还将比较字节数我已被要求复制到所声称的目的地大小;当且仅当电话通过所有这些测试时,我才能执行复制."

memcpy说"将目的地填入寄存器,将源填入寄存器,将计数填入寄存器,执行MOVSB或MOVSW." (关于地理位置的例子,这个世界不长:http://www.geocities.com/siliconvalley/park/3230/x86asm/asml1013.html)

编辑:对于memcpy 的Your Wish Is My Command方法的例子,考虑OpenSolaris,其中memcpy(对于某些配置)是根据bcopy定义的,而bcopy(对于某些配置)是......

void
     33 bcopy(from, to, count)
     34 #ifdef vax
     35     unsigned char *from, *to;
     36     int count;
     37 {
     38 
     39     asm("   movc3   12(ap),*4(ap),*8(ap)");
     40 }
     41 #else
     42 #ifdef u3b      /* movblkb only works with register args */
     43     unsigned char *from, *to;
     44     int count;
     45 {
     46     asm("   movblkb %r6, %r8, %r7");
     47 }
     48 #else
     49     unsigned char *from, *to;
     50     int count;
     51 {
     52     while ((count--) > 0)
     53         *to++ = *from++;
     54 }
     55 #endif
Run Code Online (Sandbox Code Playgroud)

编辑:谢谢,米莉史密斯!以下是我在上面链接的地理位置页面上的内容:

MOVS

指令movs用于将源字符串复制到目标(是,复制,不移动).该指令有两个变体:movsb和movsw.movsb("移动字符串字节")一次移动一个字节,而movsw一次移动两个字节.

由于我们希望一次移动几个字节,因此这些movs指令是使用rep前缀批量完成的.移动次数由CX寄存器指定.请参阅以下示例:

:
lds   si, [src]
les   di, [dest]
cld
mov   cx, 100
rep   movsb
:
Run Code Online (Sandbox Code Playgroud)

此示例将从src复制100个字节到dest.如果用movsw替换movsb,则复制200个字节.如果删除rep前缀,则CX寄存器将不起作用.您将移动一个字节(如果它是movsb,或者如果它是movsw则移动2个字节).

  • 将老式的x86组件带入此+1 (4认同)
  • 我们不要忘记任何好的memcpy实现都会将内存对齐计算在内. (3认同)

MSa*_*ers 9

不要打扰.微软的替代方案并没有那么好.主要价值在于这些导致您的代码无法移植到Linux.微软在他们向你的客户销售的操作系统上赚的钱远远超过你购买的Visual C++副本.


0x6*_*015 8

如果使用得当,电锯是安全的.与memcpy()相同的事情.但在这两种情况下,如果你钉了一个钉子,它会飞,并伤害你.

简而言之,memcpy()是低级计算所必需的,不会消失,但对于高级编程,您不需要它.Python中没有memcpy().

  • 在memcpy()和memcpy_s()之间进行比较时,Python完全偏离主题 (5认同)
  • 请记住,这并不一定会使Python变得更好.我喜欢Python,但有时我只想要一个结构,或者投射指针.这同样适用于另一个方向. (2认同)

Tra*_*Man 6

文章本身描述了一个更安全的替代方法:memcpy_s,它要求您指定目标的最大长度.如果提供的数字与要复制的字节数无关,则它可以作为防止缓冲区溢出的屏障.当然,您可以通过向两者提供相同的数字来滥用它.

  • 重要的是要知道使用MS提供的安全功能会损害跨平台兼容性. (8认同)
  • 便携式替代方案称为`memcpy(dest,src,MIN(destsize,count))`.但是,我不知道这有什么用处.MS刚刚破解. (5认同)
  • 是否有与memcpy_s和wmemcpy_s跨平台兼容的等效项? (2认同)