在VC中特别是缓冲区溢出后,常常会出现一堆烫烫烫烫烫,它们是从哪来的呢?
原来,VC在Debug模式下会使用CCh来填充堆栈来方便调试(CCh是int 3h的机器码)。
0040101C lea edi,[ebp-140h]
00401022 mov ecx,50h
00401027 mov eax,0CCCCCCCCh
0040102C rep stos dword ptr [edi]
9: char s[256];
10: puts(s);
0040102E lea eax,[ebp-100h]
00401034 push eax
00401035 call puts (0040d930)
0040103A add esp,4
首先找到可用栈空间的首地址,然后用rep stos对栈空间进行填充。
VCDebug模式还会把堆空间填充为CDh,两个CDh放到一起也就是著名的“屯”。
#include "stdafx.h"
#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[], char *env[])
{
char *s = (char *)malloc(256);
puts(s);
printf("%x", ((int*)s)[0]);
return 0;
}
不太容易追踪到是在哪里填充的……
需要先把s强制转换为int *才能用%x正常输出,不然会因为传给printf只有一字节而自动填充前3字节为ff。
以下是内存中的内容:
00032C70 CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD 屯屯屯屯屯屯屯屯屯屯屯屯屯屯.
顺便说我才知道原来VC中的main有三个参数,其实MSDN也写了……