PS:不是原创,见到好的就通通共享上来了,资源区都快发满了,有朋友有意见了,所以暂时转移。
下面是正题:
结构化异常断点法
首先使用这个方法的前提条件是,我们再入夹克程序的时候前面几句代码大致如下:
并且我们在OD的调试设置里面需要设置一下,非法访问内存前面的勾要去掉。
0044B968 > B8 CCE15600 mov eax,NSPACK2_.0056E1CC ; hadler,发生异常后到这个地址执行 向堆栈中压入当前异常处理回调函数地址hander(底下发生内存访问异常,将会调用这个函数)
0044B96D 50 push eax
0044B96E 64:FF35 0000000>push dword ptr fs:[0]
0044B975 64:8925 0000000>mov dword ptr fs:[0],esp ; 构造一个ERR结构
0044B97C 33C0 xor eax,eax
0044B97E 8908 mov dword ptr ds:[eax],ecx ; 这里发生异常,非法访问内存,//来到这里的时候,就走不动了,然后观察最下边的提示:
也就是我们说的非法访问内存。因为在NT架构下,0—FFFFh,这个地址空间是禁止进入的,就像我们平时生活,有时候走到危险地段,或者军事要地,秘密地段,也会有一个牌子提示禁止入内,如果你非要闯进去,当你被逮着的时候,保安或者警察就会说,你这是违反法律法规,或者规章制度,当然你是初犯,他们会给你一个改过自新的机会,放你走。
由上面的代码知,bp 0056E1CC(这个地址是第一句mov的地址) ,shift+F9运行到该断点
0056E1CC B8 D3CF56F0 mov eax,F056CFD3
0056E1D1 8D88 1C120010 lea ecx,dword ptr ds:[eax+1000121C]
0056E1D7 8941 01 mov dword ptr ds:[ecx+1],eax
0056E1DA 8B5424 04 mov edx,dword ptr ss:[esp+4]
0056E1DE 8B52 0C mov edx,dword ptr ds:[edx+C]
0056E1E1 C602 E9 mov byte ptr ds:[edx],0E9
0056E1E4 83C2 05 add edx,5
0056E1E7 2BCA sub ecx,edx
0056E1E9 894A FC mov dword ptr ds:[edx-4],ecx
0056E1EC 33C0 xor eax,eax
0056E1EE C3 retn //我们运行到这里,然后对这句代码下一句代码下断点
0056E1EF B8 78563412 mov eax,12345678 //F2下端点。
0056E1F4 64:8F05 0000000>pop dword ptr fs:[0]
0056E1FB 83C4 04 add esp,4
这段代码就是处理这个异常的代码,处理完成之后他会返回到系统领空,所以我们需要对retn下一句代码下端点,SHIFT+f9,运行到这里,然后取消断点,在这里大家可能会问,你怎么知道在retn下一句代码下端点呢???告诉你,因为结构化异常处理代码(也就是retn上面的几句代码,你分析一下就知道要对这句代码下断点了,因为那几句代码已经把要跳到那里继续执行的地址显示出来了)
为了照顾大部分人,我还是把分析贴出来:
0056E1CC B8 D3CF56F0 mov eax,F056CFD3 ; eax=F056CFD3
0056E1D1 8D88 1C120010 lea ecx,dword ptr ds:[eax+1000121C] ; ecx=0056e1ef(这一个地址就是我们需要下断点的地址了)
0056E1D7 8941 01 mov dword ptr ds:[ecx+1],eax ; 改写我们需要下断点的地址处的操作数,注意我们将要下断点处的操作数变化
0056E1DA 8B5424 04 mov edx,dword ptr ss:[esp+4]
0056E1DE 8B52 0C mov edx,dword ptr ds:[edx+C]
0056E1E1 C602 E9 mov byte ptr ds:[edx],0E9 ; 将我们发生异常处的指令改成jmp
0056E1E4 83C2 05 add edx,5
0056E1E7 2BCA sub ecx,edx
0056E1E9 894A FC mov dword ptr ds:[edx-4],ecx
0056E1EC 33C0 xor eax,eax
0056E1EE C3 retn
那么我们继续对刚才得到的地址下端点,然后运行到此处
0056E1EF B8 D3CF56F0 mov eax,F056CFD3 //来到这里
0056E1F4 64:8F05 0000000>pop dword ptr fs:[0]
0056E1FB 83C4 04 add esp,4
0056E1FE 55 push ebp
0056E1FF 53 push ebx
0056E200 51 push ecx
0056E201 57 push edi
0056E202 56 push esi
0056E203 52 push edx
0056E204 8D98 D5110010 lea ebx,dword ptr ds:[eax+100011D5]
0056E20A 8B53 18 mov edx,dword ptr ds:[ebx+18]
0056E20D 52 push edx
0056E20E 8BE8 mov ebp,eax
0056E210 6A 40 push 40
0056E212 68 00100000 push 1000
0056E217 FF73 04 push dword ptr ds:[ebx+4]
0056E21A 6A 00 push 0
0056E21C 8B4B 10 mov ecx,dword ptr ds:[ebx+10]
0056E21F 03CA add ecx,edx
0056E221 8B01 mov eax,dword ptr ds:[ecx]
0056E223 FFD0 call eax
0056E225 5A pop edx
0056E226 8BF8 mov edi,eax
0056E228 50 push eax
0056E229 52 push edx
0056E22A 8B33 mov esi,dword ptr ds:[ebx]
0056E22C 8B43 20 mov eax,dword ptr ds:[ebx+20]
0056E22F 03C2 add eax,edx
0056E231 8B08 mov ecx,dword ptr ds:[eax]
0056E233 894B 20 mov dword ptr ds:[ebx+20],ecx
0056E236 8B43 1C mov eax,dword ptr ds:[ebx+1C]
0056E239 03C2 add eax,edx
0056E23B 8B08 mov ecx,dword ptr ds:[eax]
0056E23D 894B 1C mov dword ptr ds:[ebx+1C],ecx
0056E240 03F2 add esi,edx
0056E242 8B4B 0C mov ecx,dword ptr ds:[ebx+C]
0056E245 03CA add ecx,edx
0056E247 8D43 1C lea eax,dword ptr ds:[ebx+1C]
0056E24A 50 push eax
0056E24B 57 push edi
0056E24C 56 push esi
0056E24D FFD1 call ecx
0056E24F 5A pop edx
0056E250 58 pop eax
0056E251 0343 08 add eax,dword ptr ds:[ebx+8]
0056E254 8BF8 mov edi,eax
0056E256 52 push edx
0056E257 8BF0 mov esi,eax
0056E259 8B46 FC mov eax,dword ptr ds:[esi-4]
0056E25C 83C0 04 add eax,4
0056E25F 2BF0 sub esi,eax
0056E261 8956 08 mov dword ptr ds:[esi+8],edx
0056E264 8B4B 10 mov ecx,dword ptr ds:[ebx+10]
0056E267 894E 24 mov dword ptr ds:[esi+24],ecx
0056E26A 8B4B 14 mov ecx,dword ptr ds:[ebx+14]
0056E26D 51 push ecx
0056E26E 894E 28 mov dword ptr ds:[esi+28],ecx
0056E271 8B4B 0C mov ecx,dword ptr ds:[ebx+C]
0056E274 894E 14 mov dword ptr ds:[esi+14],ecx
0056E277 FFD7 call edi
0056E279 8985 C8120010 mov dword ptr ss:[ebp+100012C8],eax
0056E27F 8BF0 mov esi,eax
0056E281 59 pop ecx
0056E282 5A pop edx
0056E283 EB 0C jmp short NSPACK2_.0056E291
0056E285 03CA add ecx,edx
0056E287 68 00800000 push 8000
0056E28C 6A 00 push 0
0056E28E 57 push edi
0056E28F FF11 call dword ptr ds:[ecx]
0056E291 8BC6 mov eax,esi
0056E293 5A pop edx
0056E294 5E pop esi
0056E295 5F pop edi
0056E296 59 pop ecx
0056E297 5B pop ebx
0056E298 5D pop ebp
0056E299 FFE0 jmp eax
F8单步向下走,我们会看到三个call 寄存器的,不管他,继续走,直到看到一个jmp eax,这里就是跳向OEP了
相关附件下载地址:http://115.com/file/bejji7wf#
[课程]Linux pwn 探索篇!