烫烫烫烫烫的来源

在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 
#include 

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也写了……

你可能感兴趣的:(Disassembly,and,Reverse)