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

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

实验环境:
Winxp sp3 vs2010
Release版本、禁用优化
0day 第10章--10.4节:攻击异常处理突破GS(1)_第1张图片
根据网上把safeseh关闭了,但是没用。。。
0day 第10章--10.4节:攻击异常处理突破GS(1)_第2张图片
入的坑:(找到原因了,但是不知道怎么改正。。。)
思考原因:很有可能是因为系统开启了safeseh,没有关闭导致的!

书上说,溢出原理是shellcode过程导致覆盖了strcat(buf,input)中input的地址,导致产生异常,然后转入shellcode执行。
但是我用OD调试发现不是这样的。。。。而是buf和input连接的时候,将buf最后一个字节“\x00”当作buf后面一个字节起始位置了!
而且堆栈里buf后面并没有跟strcat(buf,input)中input的地址,上一个栈帧的EBP和返回地址??????WHY???

用到的数据:
Buf的地址也就是shellcode的地址是0x0013FEAC,SHE句柄位置是0x0013FFB4,因此中间需要填充264个字节。

源程序:
0day 第10章--10.4节:攻击异常处理突破GS(1)_第3张图片
OD载入程序,在strcpy完成后断下:
0day 第10章--10.4节:攻击异常处理突破GS(1)_第4张图片
0day 第10章--10.4节:攻击异常处理突破GS(1)_第5张图片
继续单步,程序开始调用strcat()函数。
首先调用一个循环,使eax指向input的末尾,然后用input末尾地址-input起始地址,得到长度。
然后再调用一个循环,使edi指向buf的末尾,但是注意!原本buf的末尾使0x0013ffb8,但是这里却是0x0013ffb7了!也就是说传入参数的最后的4字节地址的最后一个字节’\x00’没被算入!!这就是出错的原因!!
最后将input的第一个字节赋值给buf后面紧跟的最后一个字节(原本应该是0x0013ffb8的!)
0day 第10章--10.4节:攻击异常处理突破GS(1)_第6张图片
接着这个rep movs赋值的过程就会报错,调到ntdll.dll的异常处理程序中。。。
Rep movs执行之前:
0day 第10章--10.4节:攻击异常处理突破GS(1)_第7张图片
单步继续,执行到报错之前:
0day 第10章--10.4节:攻击异常处理突破GS(1)_第8张图片
F7单步,发现没有赋值成功,而且程序调到ntdll.dll模块,执行KiUserApcDispathcer函数。。
0day 第10章--10.4节:攻击异常处理突破GS(1)_第9张图片
接着F9,则弹出错误对话框:内存0xfc13ffac不可读
在这里插入图片描述
把SHE句柄改为0x00403018也不行,也是这个原因,会报0xfc403018不可读!

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