网站导航 | 隐私政策 | 法律声明 | 加入收藏 | 设为首页 
 
关于我们
课程体系
我要报名
最新动态
教学视频
人才招聘
技术交流
访客留言
联系我们
 
在线咨询
余老师: 科锐教育在线咨询
袁老师: 科锐教育在线咨询
钱老师: 科锐教育在线咨询
方老师: 科锐教育在线咨询
李老师: 科锐教育在线咨询
 
友情链接
加密与解密-看雪学院 NE365论坛
安全365网站 第八军团
   
   
   
 
  测试你的C语言功底?

1、如何在下面的test函数里加入代码可以使程序运行起来输入和输出的相等?

(环境是vc6Debug方式下)
#include<stdio.h>
void test()
{
  int t;
  scanf("%d",&t);
  在这里加入代码
 }
main()
{
  int m;
  test();
  printf("m=%d",m);
}
例题一解答

这一题需要去了解在函数体中栈内存的分配情况。
#include<stdio.h>
void test()
{
//
当程序流程进入test函数入口的时候也会对变量作一些寄存器的保护和预留空间
//  push  ebp
//  mov  ebp,esp
//  sub  esp,48h
//  push  ebx
//  push  esi
//  push  edi
//  lea  edi,[ebp-48h]
//  mov  ecx,12h
//  mov  eax,0CCCCCCCCh
//  rep stos  dword ptr [edi]
//  
预留了0x12*sizeof(DWORD)个字节空间
//  
变量t的地址为ebp-4
  int t;
  scanf("%d",&t);//?
请在以下添加代码,使用main函数中的变量m输出值等test函数中的变量t;
//
计算变量t在内存中的位置和上一层函数中变量m在内存中位置的差
//
先写到这一句用反汇编看一下
//
变量tm都在预留空间的最下端(堆栈是向上长的,变量是按定义先后也是从下向上放的)
//push  edi(main)...............................0x1
//push  esi(main)...............................0x2
//push  ebx(main)...............................0x3
//push  ebp(
自己)...............................0x4
//
返回地址............................................0x5
//0x10*sizeof(DWORD)
的空间............................0x15
//
空间最下面的DWORD字节存放变量m......................0x16
//
我们把t向下偏移0x16的位置(存放着变量m)上把t的内容写进去即可。
//
也可以看一下OD里图:

  *( &t + 0x16) = t;
//
这样整型指针pos就指到了变量m我们把t的值直接赋给*p(就是m)即可。
}
int main()
{
//
当程序进入main函数的时候,会对一些局部变量作一些预留空间
//  push  ebp
//  mov  ebp,esp
//  sub  esp,44h
//  push  ebx
//  push  esi
//  push  edi
//  lea  edi,[ebp-44h]
//  mov  ecx,11h
//  mov  eax,0CCCCCCCCh
//  rep stos  dword ptr [edi]
//  
预留了0x11*sizeof(DWORD)个字节空间
//  m
的变量地址是ebp-4

  int m;
  test();
  printf("m=%d",m);
  return 0;
}

返回...
 
 
  科锐软件©2007.Copyright. All Rights Reserved
  办公地址:武汉市洪山区街道口埠华大厦1412B05