能力值:
( LV2,RANK:10 )
|
-
-
2 楼
int zero = 0; // 这里初始化为0
__asm int 3;
__try
{
strcpy(buf, input);
zero = 4 / zero; // 这里在除以0,解决得编译器会怎么处理???
}
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
??什么意思?没看懂........
|
能力值:
( LV4,RANK:50 )
|
-
-
4 楼
被优化掉了,禁止优化试试
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
能详细点吗?禁止哪些优化?
此外,我自己并没手动设置任何优化选项......
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
项目设置里 或者 #progma optimize("",off)
|
能力值:
( LV9,RANK:610 )
|
-
-
7 楼
其实很想跟楼主说一句,你如果是跟着书学习,最好是按书里的编译环境和运行环境来,熟悉了原理之后再来研究在新的系统新的编译器下是怎么回事,这样可以少走弯路
|
能力值:
( LV2,RANK:10 )
|
-
-
8 楼
....................
|
能力值:
( LV2,RANK:10 )
|
-
-
9 楼
楼上,
我其实有建立书上的环境,也已调试出书里的结果。但现实是几乎没人(很少)使用win2000了,至少都是 win7。但win7下书里的代码就是不能出结果(跟作者无关,书里已明确运行环境),而我很想知道原因........
|
能力值:
( LV9,RANK:610 )
|
-
-
10 楼
那你至少该了解一下新的系统里面增加了哪些安全机制,DEP、ASLR、SafeSEH、SEHOP、CFG这些你都了解过了吗? 知道它们是怎么回事,有什么影响吗? 这些影响是如何导致你的测试程序没法达到预期效果的?
另外,即使有前人探路,突破这些安全机制也并不是太容易,你没搞定也不是什么丢人的事儿,重在搞清原理。如果你能在自己探索的过程中独立搞定这些问题,那你在这个论坛里也算顶尖的存在了
|
能力值:
( 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 不完整。
|
|
|