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

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


大家可以先运行一下:

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

其实程序的原理是:

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


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

这样修改代码:


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



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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/387588.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

COOKIE伪造登录网站后台

1.关于XSS(跨站脚本攻击)和CSRF(跨站请求伪造)的知识,xss表示Cross Site Scripting(跨站脚本攻击),它与SQL注入攻击类似,SQL注入攻击中以SQL语句作为用户输入,从而达到查询/修改/删除…

Spring Cloud 学习 (五) Zuul

Zuul 作为路由网关组件,在微服务架构中有着非常重要的作用,主要体现在以下 6 个方面: Zuul, Ribbon 以及 Eureka 相结合,可以实现智能路由和负载均衡的功能,Zuul 能够将请求流量按某种策略分发到集群状态的多个服务实例…

如何利用445端口进行入侵渗透 445端口入侵原因详细解析。大家在进行入侵渗透个人电脑的时候,经常会碰到各种各样的端口,比如135,1433,445,3306等端口,现在小编就给大家讲解下445端口如

如何利用445端口进行入侵渗透 445端口入侵原因详细解析。大家在进行入侵渗透个人电脑的时候,经常会碰到各种各样的端口,比如135,1433,445,3306等端口,现在小编就给大家讲解下445端口如何入侵。 445端口入侵…

项目复盘

前言 最近一年半多一直在做一个CMS项目,做了快两年了也没有上线,而且开发还走了不少,其中有不少原因是因为开发中频繁改动需求导致开发人员失去耐心,但是其中还有一个重要的原因就是架构设计的不好,导致很多服务的边界…

父、子页面之间页面元素的获取,方法的调用

一、在iframe页面上调取父级页面元素 1.在父页面上获取iframe页面元素(在父页面修改子页面div的背景色为红色) js代码如下&#xff1a; 1 <script type"text/javascript"> 2 window.onload function(){ 3 var iframe document.getElementById(iframeId)…

fiddler,他和其他抓包软件有什么区别,如何使用fiddler进行抓包

前言&#xff1a;本文章是搭配《批量获取微信公众号》一文&#xff0c;介于群里朋友很热情&#xff0c;我就趁着上班测完bug 来撰写该文章&#xff0c;那么读完本文&#xff0c;你会学习到什么呢&#xff1f; 什么是fiddler&#xff0c;他和其他抓包软件有什么区别&#xff0c…

Vue导入非模块化的第三方插件功能无效解决方案

一、问题&#xff1a; 最近在写vue项目时&#xff0c;想引入某些非模块化的第三方插件时&#xff0c;总是发现会有报错。且在与本地运行插件测试对比时发现插件根本没有注入到jQuery中&#xff08;console.log($.fn)查看当前jq有哪些方法&#xff09;&#xff0c;例如&#xff…

ES6笔记 -- 字符串拓展

字符串拓展 Unicode 相关 JS 允许使用/uxxxx的Unicode方式显示字符, 但是只限于码点在/u0000~/uFFFF之间, 超过该范围的码点必须用双字节形式表示ES6 中, 将码点放入大括号内, 就可以解读JS 不能处理4个字节的字符, 字符串长度会被误判为2ES6 提供了codePointAt方法, 能够正确处…

android 转发短信

通过这些代码也可以对远程手机实现短信控制。有兴趣的可以自己改一下&#xff0c;说一下简单的原理&#xff0c;要实现控制的话&#xff0c;必须得走一个固定的号码&#xff0c;固定的格式&#xff0c;然后通过得到此号码的内容&#xff0c;然后通过固定的内容&#xff0c;就可…

[Noi2016]区间

传送门 Code /* 线段树 尺取法 */ #include<bits/stdc.h> #define ll long long #define max(a,b) ((a)>(b)?(a):(b)) #define min(a,b) ((a)>(b)?(b):(a)) #define reg register inline int read() {int x0,f1;char chgetchar();while(ch<0||ch>9){if(…

安装CentOS6.8并配置网络图文解说亲测全过程

安装环境&#xff1a; 本文是在win10系统安装上VMWare并配置Centos6.8虚拟机。 准备工作 1.安装VMWare虚拟机 1.1下载VMWare12资源链接&#xff1a;https://pan.baidu.com/s/1AhfMSDXLO-aA0eMqnuMWHg 提取码&#xff1a;iftd 1.2安装VMWare&#xff0c;在安装过程中需要输入密钥…

Paxos算法是莱斯利·兰伯特(Leslie Lamport)1990年提出的一种基于消息传递的一致性算法。

Paxos算法是莱斯利兰伯特(Leslie Lamport)1990年提出的一种基于消息传递的一致性算法。Paxos算法解决的问题是一个分布式系统如何就某个值&#xff08;决议&#xff09;达成一致。在工程实践意义上来说&#xff0c;就是可以通过Paxos实现多副本一致性&#xff0c;分布式锁&…

09、策略模式

2019独角兽企业重金招聘Python工程师标准>>> 策略模式与工厂模式最大的区别在于&#xff0c;策略模式注重的是对算法的维护&#xff0c;也可以理解为对算法的封装。而工厂模式&#xff0c;则只是负责创建类&#xff0c;在刚接触策略模式时候&#xff0c;往往与工厂模…

Linux创建、删除文件和文件夹命令

https://www.cnblogs.com/c-x-m/p/9794082.html转载于:https://www.cnblogs.com/sun-ldy/p/10279025.html

Java编写代理服务器(Burp拦截Demo)一

大家都知道大名鼎鼎的BurpSuite代理神器&#xff0c;对于抓取HTTP请求非常好用&#xff0c;偶然&#xff0c;一朋友问我Java应该如何去编写代理服务器&#xff08;因为他想做某些东西&#xff09;&#xff0c;有没有相关的API 去实现&#xff0c;我想说&#xff0c;差不多你能想…

mysql实战33 | 我查这么多数据,会不会把数据库内存打爆?

我经常会被问到这样一个问题&#xff1a;我的主机内存只有 100G&#xff0c;现在要对一个 200G 的大表做全表扫描&#xff0c;会不会把数据库主机的内存用光了&#xff1f;这个问题确实值得担心&#xff0c;被系统 OOM&#xff08;out of memory&#xff09;可不是闹着玩的。但…

[BZOJ2125]最短路

Description 给一个N个点M条边的连通无向图&#xff0c;满足每条边最多属于一个环&#xff0c;有Q组询问&#xff0c;每次询问两点之间的最短路径。 Input 输入的第一行包含三个整数&#xff0c;分别表示N和M和Q 下接M行&#xff0c;每行三个整数v&#xff0c;u&#xff0c;w表…

Rabbit MQ windows下安装

Rabbit MQ 是建立在强大的Erlang OTP平台上&#xff0c;因此安装Rabbit MQ的前提是安装Erlang。通过下面两个连接可以下载安装最新的版本&#xff1a; 下载并安装 Eralng OTP For Windows otp_win64_18.3.exe&#xff08;erlang的环境&#xff09;运行安装 Rabbit MQ Serve…

spark集群配置以及java操作spark小demo

spark 安装配置使用java来操作sparkspark 安装 tar -zxvf spark-2.4.0-bin-hadoop2.7.tgz rm spark-2.4.0-bin-hadoop2.7.tgz mv spark-2.4.0-bin-hadoop2.7 sparksudo vim /etc/profileexport SPARK_HOME/usr/local/stormexport PATH$PATH:$SPARK_HOME/binsource /etc/profile…

C++笔记(3)——string.h相关的一些小知识

strlen() 用于得到字符数组中第一个\0前的字符的个数&#xff0c;格式如下&#xff1a; strlen(数组); 例子&#xff1a; #include <stdio.h> #include <string.h>int main(){char str[10];gets(str);int len strlen(str);printf("%d\n", len);return 0…