p;};
}
inline bool UMul(size_t a, size_t b, size_t *r) {
__asm {
mov eax,dword ptr [a]
mul dword ptr [b]
mov ecx,dword ptr [r]
mov dword ptr [ecx],eax
jc short j1
mov al,1
jmp short j2
j1:
#ifdef _DEBUG
int 3
#endif
xor al,al
j2:
};
}
inline bool UMulAdd(size_t mul1, size_t mul2, size_t add, size_t *r) {
size_t t = 0;
if (UMul(mul1,mul2,&t))
return UAdd(t,add,r);
return false;
}
#else
# error "This code compiles only on 32-bit x86
#endif // _X86_
#endif // _INC_INTOVERFLOW_
请查看这个文件,它包括解释这些函数的简单文档。
返回页首
发现安全漏洞
虽然花了一点时间,但是许多人都找到了漏洞。当通过比较字符串来做出安全决策时,这种比较就应该是区域性不变的比较或字节方式的比较。在这个例子中,我编写的代码可能允许访问土耳其语的敏感数据,因为在土耳其语中,字母“I”有四个实例,两个小写字母,两个大写字母。您可以在 http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemstringclasscomparetopic5.
asp 上阅读这方面的内容。
现在,让我们转到本月的错误。这段代码有什么问题?
void func(char *p) {
char buf[10+1];
memset(buf,0,sizeof(buf));
// limit string to 10 chars
sprintf(buf,"%10s",p);
printf("Hello, %s\n",buf);
}
返回页首
一个小智力游戏
这个智力游戏实际上与安全性毫无关系,但是当我想到人们为整数溢出检测代码所困扰时,我就把它从我记忆的深处拉了出来。这段代码有什么用呢?
int a = 0x42;
int b = 0x69;
a ^= b;
b ^= a;
a ^= b;
这个游戏的规则非常简单,您无法编译或解释这段代码。试着仅仅通过观察来确定它有什么用。
Michael Howard 是 Microsoft Secure Windows Initiative 组的高级安全
程序经理,是 Writing Secure Code 的合著者之一,该书的第二版现已发行。他还是 Designing Secure Web-based Applications for Windows 2000 的主要作者。他致力于确保人们所设计、构建、测试和记录的系统符合安全要求。他最喜欢的一句话是“一人之工具,他人之凶器。”