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

实验原理:

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

实验环境:

Winxp sp3 vs2010
Release版本、禁用优化、多了后面2个“否”(这样编译的程序就出现strcpy和strcat函数了,便于分析)
仅仅是这两个否,之后的程序分析就和书中一样了!
在这里插入图片描述
传说中的关闭safeseh的方法。。。
在这里插入图片描述

源程序:

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值