用过C#的朋友可能认为它是一种十分安全的语言,其实C#也可以做到经典的缓冲区溢出。

本文章将用一个实例来描述C#究竟是如何发生缓冲区溢出的!

首先建立一个C# Console工程,并开启工程的“允许不安全代码”选项

键入代码:

[csharp] view plaincopy print?
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. namespace ConsoleTest
  6. {
  7. class Program
  8. {
  9. static void Main(string[] args)
  10. {
  11. char ori = 'A';
  12. StackOverflow();
  13. Console.WriteLine(ori);
  14. Console.ReadLine();
  15. }
  16. static unsafe void StackOverflow()
  17. {
  18. int* p = stackalloc int[1]; //声明一个int数组指针
  19. int i = sizeof(int); //指针增量
  20. while (*p != (int)'A') //找到Main函数中的ori变量
  21. {
  22. p += i;
  23. Console.ForegroundColor = ConsoleColor.Yellow;
  24. Console.WriteLine("Address: {0}", (int)p); //输出当前指针所指向的地址
  25. Console.ForegroundColor = ConsoleColor.Gray;
  26. try
  27. {
  28. Console.WriteLine("Value: {0}", *p);
  29. }
  30. catch
  31. {
  32. Console.WriteLine("We can't reach the system area"); //触及系统变量,无权限访问跳出
  33. break;
  34. }
  35. Console.WriteLine();
  36. };
  37. }
  38. }
  39. }

大家可以先运行一下:

程序在找到‘A’的ASCII码后跳出循环。

其实程序的原理是:

p指针指向int数组的第一个元素,指针每次增加一个int的内存空间,由于数组的大小为1,所以两次循环后就溢出并指向在其前面的内存变量。最终找到ori所在的内存地址。

下面我们尝试修改ori的值,将其从‘A’修改为‘!’,there we Go:

这样修改代码:

经过这样的修改,再次运行:

可以看到ori被彻底修改为‘!’了。如果用这种方式将函数的地址进行修改就可以达到执行远程代码的目的了。

用过C#的朋友可能认为它是一种十分安全的语言,其实C#也可以做到经典的缓冲区溢出。 本文章将用一个实例来描述C#究竟是如何发生缓冲区溢出的! 首先建立一个C# Console工程,并开启工程的“允许相关推荐

  1. 写java线程导致电脑内存不足_如何写出让java虚拟机发生内存溢出异常OutOfMemoryError的代码...

    程序小白在写代码的过程中,经常会不经意间写出发生内存溢出异常的代码.很多时候这类异常如何产生的都傻傻弄不清楚,如果能故意写出让jvm发生内存溢出的代码,有时候看来也并非一件容易的事.最近通过学习< ...

  2. MSSQL sum()计算expression转化为数据类型int时发生算术溢出错误解决

    SQL Server sum()函数计算某一列的值的合时 select sum(pdfsize)/1024/1024 as totalsize,count(*) as cnt,sum(pdfsize) ...

  3. jvm性能调优实战 - 44Metaspace区域是如何因为类太多而发生内存溢出OOM

    文章目录 Pre Metaspace区域是如何触发内存溢出的? 到底什么情况下会发生Metaspace内存溢出? Metaspace OOM 模拟 CGLIB动态生成类的代码示例 限制Metaspac ...

  4. 【C语言函数】 - 库函数、自定义函数、函数参数、函数调用、嵌套调用链式访问、递归与迭代、缓冲区

    目录 一.函数是什么 二.C语言中函数的分类 1.如何学会使用库函数 1.1.strcpy 1.2.memset 2.自定义函数 2.1.与库函数的区别 2.2.写一个函数可以找出两个整数的最大值 2 ...

  5. java运行内存溢出指什么内存溢出_项目正常启动,但是在访问页面的时候java报内存溢出错误。。小感悟...

    先说一下背景,前两天由于本地的oracle数据库问题,导致项目启动数据库获取连接池错误,不能正常启动,折腾了一段时间,本地数据库整好了,想在本地把项目跑起来试试,把项目部署在tomcat正常启动,但是 ...

  6. 64位系统下一个32位的程序究竟可以申请到多少内存?

    64位系统下一个32位的程序究竟可以申请到多少内存? cpu的位是指一次性可处理的数据量是多少,1字节=8位,32位处理器可以一次性处理4个字节的数据量,依次类推.32位操作系统针对的32位的CPU设 ...

  7. request:fail 发生了 SSL 错误无法建立与该服务器的安全连接——openssl报漏洞该升级了

    一.场景: 接口发布服务器环境为CentOS Linux release 7.5.1804 (Core),OpenSSL 版本OpenSSL 1.0.2k-fips  26 Jan 2017,前端是u ...

  8. 大话西游2同一个账号同一个服务器,大话西游2:一个服务器的火爆程度究竟是由什么决定...

    原标题:大话西游2:一个服务器的火爆程度究竟是由什么决定 由于现在大话西游2玩家人数不如曾经数量那么多,再加上每隔一段时间就会开放新的服务器. 于是不少玩家最在乎的就是某个服务器是否火爆,但是这个问题 ...

  9. android 点赞手型,在朋友圈,你是哪种点赞型人格?

    原标题:在朋友圈,你是哪种点赞型人格? 信息化越发达的时代,人们越是小心翼翼,就连在微信里发个朋友圈也是各种殚精竭虑.身边有许多朋友拍完照后发朋友圈时,苦思冥想了两个小时的"文案" ...

最新文章

  1. Nginx的File not found 错误解决
  2. Oracle数据库ORA-12516:“listener could not find available handler with matching protocol stack!“问题解决方法
  3. android 如何实现无限列表,在Android中解析和创建无限/无限级别的List /子列表中的XML...
  4. DCMTK:父元素处理的测试程序
  5. Message,MessageQueue,Looper,Handler详解+实例
  6. 福禄克FI-3000光纤监测显微仪使用MPO检查摄像头?
  7. react java_独眼巨人React组织了Java 8库的寒武纪爆发
  8. python循环指令_Python循环
  9. Error: Loading chunk * failed,Vue Router懒加载报错问题解决方案
  10. mysql忘记密码找回密码_MySQL忘记密码找回 重置MySQL root用户密码
  11. Hadoop Hive基础sql语法
  12. HDU 4597 Play Game (记忆化搜索博弈DP)
  13. 云南省人口密度格网数据
  14. 基于multisim的zcs电路仿真
  15. python参数估计(一个总体均值)
  16. mysql导vertica_vertica从其他表迁移数据到新表(insertinto语句用法实例)
  17. 运算放大器基本原理与参数解读
  18. 最不伤耳朵的耳机有哪些,分享五款不伤耳的骨传导耳机
  19. igxe本地机器人怎么用_IGXE自售机器人第四批申请开启
  20. 国内优秀的IC设计公司主要分布在哪些城市?

热门文章

  1. java线程“生产/消费”模型2
  2. 找出数组中前K大的值
  3. linux虚拟机ip修改无效
  4. getseconds补0_Java Duration类| getSeconds()方法与示例
  5. Java文件类字符串getAbsolutePath()方法(带示例)
  6. 带有Python示例的math.sin()方法
  7. 黑色背景下,将照片内封闭空心图案的空心区域染成Cyan并保存
  8. linux服务器指示灯,【转】明明白白你的Linux服务器——故障篇 | 旺旺知识库
  9. uva 11995——I Can Guess the Data Structure!
  10. C++ 有参构造 无参构造 拷贝构造 以及参数化列表 成员对象之间的执行关系