今天老师给了一到程序,让我们分析分析原理,关于strcpy缓存溢出原理的,反汇编一遍遍调试,终于看明白了,记录一下
C程序:

#include "string.h"
#include "stdio.h"
char *shellcode="\x64\x65\x66\x67\x68\x69\x70\x71\x05\x10\x40\x00";
void fun1(int a, int b)
{printf("fun1 run!para a=%d,b=%d\n",a,b);
}
void fun2(int a)
{printf("fun2 run! para a=%d\n",a);
}
void fun3(int a,int b,int c)
{printf("fun3 run! para a=%d,b=%d,c=%d\n",a,b,c);
}
int main(int argc, char* argv[])
{printf("begin\n");char a[4]={0};strcpy(a,shellcode);fun1(2,3);fun2(4);fun3(4,5,6);return 0;
}

运行结果:

可以看出,按照正常的C的话,fun2函数应该只会执行一次,但执行了两次,事出反常必有妖,让我们来分析一下,反汇编:

当程序执行strcpy前,a的值是0x0019ff2c,这个是地址,存放的是0000000,在这里我们要特别注意0019ff30和0019ff34地址里面的值,后面执行fun2会用到

执行完strcpy后,a内容是地址为0x0019ff2c存放的值,我们可以看到0019ff30和0019ff34地址存放的内容发生了改变,这个时候我们再看C程序中shellcode数组的值:

char *shellcode="\x64\x65\x66\x67\x68\x69\x70\x71\x05\x10\x40\x00";

发现0x0019ff2c到0019ff34存放的数据就是这些值,而且0019ff30和0019ff34存放的数据被这些覆盖了。a数组大小为4,shellcode是12,a的数组存放不了shellcode的值,而strcpy函数不会检查要复制的内容的大小,只管把要复制的内容复制过来,内存不够,覆盖内存中其他数据。

当执行完fun3是,按说应该程序结束,来让我们看看,为什么fun2还会执行

当执行到pop ebp是,当前esp的值为0019ff30,内容为68697071,执行完后ebp的值就是68697071,ebp的值原本不是这个,因为使用strcpy把原本的内容覆盖了


当执行到ret时,这个时候我们就要注意了,因为执行完这条语句就会去执行fun2函数,ret指令相当于执行:

pop eip

这个时候esp的值为0019ff34,内容为00401005,执行ret后eip=00401005

我们来看看fun2函数地址,是00401005,这就是为什么执行完fun3回去执行fun2

总结:

  1. strcpy 函数不对数组边界进行检查,只管把要复制的内容复制过来,内存不够,覆盖内存中其他数据,很容易造成缓冲区溢出的漏洞
  2. shellcode数组里的值一共12位,最后ret语句会把最后4位赋值给eip,我们可以利用这个跳转到我们想要执行的代码处
  3. 向缓冲区内填充数据,如果数据的长度很长,超过了缓冲区本身的容量,那么数据就会溢出存储空间,而这些溢出的数据还会覆盖在合法的数据上,这就是缓冲区和缓冲区溢出的道理。

参考

https://blog.csdn.net/yahohi/article/details/7724669
https://blog.csdn.net/xiaoyuai1234/article/details/52121588

C和混编混合编程----strcpy缓存溢出原理相关推荐

  1. C和汇编混合编程---do while

    环境:VC++ do while 会先执行do里面的循环体,执行完去执行while的条件判断,如果为真,继续执行do里面的循环体,如果为假,则结束循环 C程序: #include "stdi ...

  2. wpf matlab混编,WPF(C#)与MATLAB混合编程

    WPF(C#)与MATLAB混合编程 WPF可以为开发者提供便捷地构建用户交互界面的解决方法,而matlab则在科学计算方面有着无与伦比的优势,因此在一些需要将科学算法转换为应用软件的项目中,需要应用 ...

  3. python与c混合编程 版本_python与C、C++混编的四种方式(小结)

    混编的含义有两种, 一种是在python里面写C 一种是C里面写python 本文主要是进行简化,方便使用. ############################################# ...

  4. c 与matlab混编,谈谈Matlab与C/C++或C#的互调用(混合编程)

    记得当初一个师姐问我知不知道如何在Matlab里调用C++的程序,还真把我问住了.因为我以前就知道C++调用Matlab的方法,这方面网上资料一大堆.没想到现在自己突发奇想又遇到另外一个问题,Matl ...

  5. python和c语言混合编程-python和C语言混编的几种方式

    版权申明:本文为博主窗户(Colin Cai)原创,欢迎转帖.如要转贴,必须注明原文网址 http://www.cnblogs.com/Colin-Cai/p/7594551.html 作者:窗户 Q ...

  6. c 与matlab混编,C与MATLAB混合编程之调用MATLAB引擎

    Visual Studio调用MATLAB需要的配置已经在<Visual Studio调用MATLAB的配置>一文中给出了详细的步骤,本文将介绍混合编程的示例. 在C中调用MATLAB,据 ...

  7. android ios 混合编程,React Native与原生(Android、iOS)混编,三端痛点解析

    在做RN混编项目的时候或者面试的时候经常会遇到一些问题,总结起来有以下几种: 1.过多的注册RN组件( AppRegistry.registerComponent() ); 2.从原生跳转指定的RN页 ...

  8. python与c语言混合编程_python和C语言混编的几种方式

    Python这些年风头一直很盛,占据了很多领域的位置,Web.大数据.人工智能.运维均有它的身影,甚至图形界面做的也很顺,乃至full-stack这个词语刚出来的时候,似乎就是为了描述它. Pytho ...

  9. python fortran混编 ctypes_Python调用C/Fortran混合的动态链接库--上篇

    内容描述: 在32位或64位的windows或GNU/Linux系统下利用Python的ctypes和numpy模块调用C/Fortran混合编程的有限元数值计算程序 操作系统及编译环境: 32bit ...

最新文章

  1. python 常见的元字符(\d,\w ,^ ,$ 等) 的使用
  2. 《Redis实战》一第一部分 入门
  3. linux使用nginx负载udp
  4. C++:new分配内存
  5. 小程序开发之图片转Base64(C#、.Net)
  6. 记录一下树莓派开机启动失败 进入紧急模式 原因
  7. java怎么运行_java怎么运行
  8. 如何做一个本地漫画党:了解漫画+下载漫画+漫画APP推荐
  9. ftp服务器复制文件命令,FTP服务器的Copy命令的使用
  10. web登录框,div半透明
  11. 抢票软件不靠谱?不如看看用AI怎么玩转12306
  12. 斑马条码打印机常见故障大盘点
  13. 鼠标悬停帮助图标显示文字提示框代码
  14. Liunx磁盘管理——LVM
  15. 阿里云安装部署Oracle11g 图文流程
  16. TeaTalk·Online 大数据+云原生,再度风云起
  17. 中文分词算法python_python实现中文分词FMM算法实例
  18. 深度学习在人脸识别中的应用 ——优图祖母模型的“进化”
  19. 基于51单片机的8×8点阵屏demo
  20. 如何让 keil MDK v5 支持 ARM7/9 设备

热门文章

  1. js基础---数组方法
  2. function——函数声明头的提升和预解析
  3. Springboot + Mybatis + Ehcache
  4. (7)MySQL的事务
  5. springcloud 入门 10 (eureka高可用)
  6. class-感知机Perception
  7. NOIP2017年11月9日赛前模拟
  8. 带分页功能的SSH整合,DAO层经典封装
  9. awk 多文件操作2种实现方法
  10. python文件的读取与写入_python中文件的读取与写入以及os模块