烫烫烫烫烫的来源

在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也写了……
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值