欢迎来到 嗅灵易学

零基础也能上手的脚本技术课,一对一答疑带你入门

关于指针和堆栈溢出。。

关于指针和堆栈溢出。。

首先,我的程序是:
#include<stdio.h>
#include<stdlib.h>
int _tmain(int argc, _TCHAR* argv[])
{
  int column[] = {0};
  int** p=NULL;
  int i ,j, row ;
  printf("输入数组的行值:") ;
  scanf("%d",&row) ;
  p =(int**)malloc(sizeof(int*)*row) ;
  for(i=0;i<row;i++)
  {
    printf("请输入第%d行的元素个数:\n",i+1) ;
    scanf("%d",&column[i]) ;
    p[i] = (int*)malloc(sizeof(int)*column[i]) ;
  }
  for(i=0;i<row;i++)
  {
    for(j=0;j<column[i];j++)
    {
      *(p[i]+j) = 1;
    }
  }
  for(i=0;i<row;i++)
  {
    for(j=0;j<column[i];j++)
    {
      printf("%d",*(p[i]+j)) ;
    }
    printf("\n");
  }
  return 0;
}
刚开始,对_tmain开始处设断。
转到反汇编窗口,找到调用_wmain处,_wmain的下一条指令地址0x00411BD8。
 另外堆栈寄存器窗口,ESP=0x0012FF6C
 而内存0x0012FF6C处内容:为0x00411BD8。
 说明调用_wmain后 ,把调用_wmain处的下一条指令地址入栈。
 经过调试知道 column的值为0x0012ff60。
在 程序末尾下断。 相应的内容后
这个时候 看内存:
这个时候0x12FF6C 被覆盖了。。也就是返回地址被篡改了。 另外ebp也改变了。
其实。一开始 我就认为int column[] = {0};这样定义是不正确的,但是编译器通过了。所以我认为 这样定义的是一个指针。即int *column = NULL;
通过后面的赋值 ,各种覆盖。。
PS:第一次写这样的文章,各位多多包涵。虽然没有技术含量。。呵呵。
详细见附件。。

上传的附件 关于指针和堆栈溢出.doc

注意:上传附件及图片大小不得大于30M。

⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途。
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。

0 0 0 举报
复制成功