US-CERT Vulnerability Note VU#162289
Robert C. Seacord
rcs@cert.org
Tue Apr 8 20:53:00 GMT 2008
Dave,
I made at least one change you suggested:
#include <stdio.h>
void f(char *buf) {
unsigned int len = 0xFFFFFF00u;
if (buf+len < buf) puts("true");
}
int main(void) {
char buffer[100];
printf("buffer addr = %p.\n", buffer);
f(buffer);
return 0;
}
And compiled with flags:
/O2 /GL /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_UNICODE" /D "UNICODE"
/FD /EHsc /MD /Fo"Release\\" /Fd"Release\vc80.pdb" /W4 /nologo /c /Wp64
/Zi /TC /errorReport:prompt
The output of this program is:
buffer addr = 0012FF18.
true
The reason the len is so high is to force an overflow when added to
0x0012FF18.
BTW, I also tried compiling this as a C++ program under visual studio
and got the same result.
rCs
> Robert C. Seacord wrote on :
>
>
>> Specifically with regards to MSVC 2005, I thought Chad had already
>> checked this and found that it did not exhibit this behavior. I just
>> tested the following program.
>>
>> #include <stdio.h>
>>
>> void f(char *buf) {
>> unsigned int len = len = 0xFFFFFF00;
>>
>
> I'm sure you didn't mean to do that, but I doubt it affects the results.
>
> BTW, that's a very different number from (1 << 30). How about trying again
> with a 'u' suffix? Or with something that doesn't have the sign bit set?
>
> cheers,
> DaveK
>
More information about the Gcc
mailing list