c++ 烫烫烫烫烫烫烫烫烫

经过一段时间跟踪,终于发现原因了,定义个char数组,不赋值,直接打印,就会出现

char revBuf[1504];

printf("%s\n", revBuf);

网上一些其他的解释:

https://blog.csdn.net/laciqs/article/details/7716321

在VC中特别是缓冲区溢出后,常常会出现一堆烫烫烫烫烫,它们是从哪来的呢?

原来,VC在Debug模式下会使用CCh来填充堆栈来方便调试(CCh是int 3h的机器码)。

[plain]  view plain  copy
  1. 0040101C   lea         edi,[ebp-140h]  
  2. 00401022   mov         ecx,50h  
  3. 00401027   mov         eax,0CCCCCCCCh  
  4. 0040102C   rep stos    dword ptr [edi]  
  5. 9:        char s[256];  
  6. 10:       puts(s);  
  7. 0040102E   lea         eax,[ebp-100h]  
  8. 00401034   push        eax  
  9. 00401035   call        puts (0040d930)  
  10. 0040103A   add         esp,4  

首先找到可用栈空间的首地址,然后用rep stos对栈空间进行填充。

VCDebug模式还会把堆空间填充为CDh,两个CDh放到一起也就是著名的“屯”。

[cpp]  view plain  copy
  1. #include "stdafx.h"  
  2. #include <stdlib.h>  
  3. #include <string.h>  
  4.   
  5. int main(int argc, char *argv[], char *env[])  
  6. {  
  7.     char *s = (char *)malloc(256);  
  8.     puts(s);  
  9.     printf("%x", ((int*)s)[0]);  
  10.     return 0;  
  11. }  

不太容易追踪到是在哪里填充的……

需要先把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也写了……
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AI算法网奇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值