0day 第10章--10.4节:攻击异常处理突破GS(2)

文章目录

    • **实验原理:**
    • 实验环境:
    • 源程序:

实验原理:

传入参数过长,直到覆盖掉SEH句柄。将SHE句柄覆盖为shellcode地址即可。

实验环境:

Winxp sp3 vs2010
Release版本、禁用优化、多了后面2个“否”(这样编译的程序就出现strcpy和strcat函数了,便于分析)
仅仅是这两个否,之后的程序分析就和书中一样了!
0day 第10章--10.4节:攻击异常处理突破GS(2)_第1张图片
传说中的关闭safeseh的方法。。。
0day 第10章--10.4节:攻击异常处理突破GS(2)_第2张图片

源程序:

用200个’\x90’进行测试
0day 第10章--10.4节:攻击异常处理突破GS(2)_第3张图片
OD载入程序,在调用test()函数之前,记录下此时的返回地址00141071和EBP为 0012FF7C
0day 第10章--10.4节:攻击异常处理突破GS(2)_第4张图片
进入,首先单步看到security_cookie的值:0xAAA8d089
在这里插入图片描述
出现strcpy和strcat函数了。strcpy(buf,input)的的input地址是0x00403000,buf地址是0x0012FEA0
0day 第10章--10.4节:攻击异常处理突破GS(2)_第5张图片
此时仔细观察右下角堆栈窗口,发现input的地址在0x0012FF78处,这样当接下来调用strcat时,如果shellcode过长就会覆盖strcat(buf,input)的地址,就会导致异常!
0day 第10章--10.4节:攻击异常处理突破GS(2)_第6张图片
F7单步,果然,strcat()从0x0012FF78处调用取input的地址了!
0day 第10章--10.4节:攻击异常处理突破GS(2)_第7张图片
F7单步继续,strcat(buf,input)buf的地址正确,
0day 第10章--10.4节:攻击异常处理突破GS(2)_第8张图片
F8执行完strcat函数,发现程序直接调到ntdll.dll模块了。这时观察堆栈窗口,发现SHE句柄竟然被覆盖成0x90909090了!这是怎么回事呀?
0day 第10章--10.4节:攻击异常处理突破GS(2)_第9张图片
仔细想一下……噢~明白了,原来刚strcat(buf,input)取地址的时候两个地址都是正确的,自然就将input的内容复制到buf的后面了,因为我们输入的input有200个字节长,因此当他们连接时,自然就覆盖了SEH句柄了,因为SHE句柄和buf末尾只相差了76个字节呀!
程序一会肯定会报错!
单步继续,果然由于90909090不可读导致出错了!
0day 第10章--10.4节:攻击异常处理突破GS(2)_第10张图片
这下分析完了导致异常的原因,那我们就构造200+76个字节的shellcode,然后跟上shellcode的地址让其覆盖掉SHE句柄,观察是否能shellcode成功!
0day 第10章--10.4节:攻击异常处理突破GS(2)_第11张图片
啊噢,运行直接报缓冲区溢出错误。。。。
0day 第10章--10.4节:攻击异常处理突破GS(2)_第12张图片
查资料发现原来winxp sp2及后续版本中加入了对SHE的校验,因此失败了。
这就没办法了。
#end

你可能感兴趣的:(0day)