0day 第10章--10.3:覆盖虚函数突破GS

实验环境:winxp sp3 vs2010
实验要求:程序要求禁用优化、release版本

实验原理:程序只有在函数返回时才检查Security Cookie,如果在函数检查之前劫持程序流程,就能实现缓冲区溢出了!因此可以利用C++中的虚函数!(为什么?见0day第6章攻击C++虚函数)

[C++虚函数原理]
{虚表指针->虚表->函数地址,call函数地址}

总结一下入的坑:
(1) 原理搞不懂
通过传参,覆盖的是虚表指针中的内容,即虚表,而不是将虚表中的内容覆盖成shellcode地址(第6章才是这样!),因此还需要经过一次调用。
实验数据:传入的参数地址:0x00402108;
buf的地址:0x0012FE9C;
虚表指针:0x0012FF78(0x004021D8)
虚表:0x004021D8(0x004010A0)
Call 0x004010A0
这里buf地址和虚表指针相差了0x0012FF78-0x0012FE9C=220个字节,因此我们需要填充220个字节;
将虚表指针中的内容,即虚表覆盖为参数地址。这样我们传入的参数地址前4个字节必须是指向shellcode;

这里我们没有直接将前4个字节覆盖为shellcode地址,而是用到了pop pop ret指令作为跳板!
① 为什么不用jmp esp作跳板地址?
因为所有的寄存器都不能调到0x00402108或者0x0012FE9C
0x00402108地址不在堆栈中,所以跳不过去

② 为什么不把前4个字节覆盖为shellcode地址?
因为shellcode地址有字符串“\x00”,会被截断!

执行完pop pop ret指令后,程序会直接跳转到0x0012FEC执行shellcode!
为什么???

(2) pop pop ret指令找不到
用网上编写的也就是书中第3章的查找指令的c代码,vs各种报错。。。
用Immunity Debugger的mona插件从ntdll.dll、kernel32.dll、user.dll等各种dll中查找依然找不到。。。
最后终于利用findjmp.exe在ntdll.dll中找到了!
但是一开始用的是pop esi pop ebp ret指令一直报错。。。网上查资料发现利用的pop pop ret不能影响程序的流程,而pop ebp会破坏堆栈导致平衡破坏,影响程序流程。
① 用错误的pop指令0x7C9333A1
在这里插入图片描述
在这里插入图片描述
果然是因为破坏了ebp吗?值得商榷?????????
7C99333A1指令和右面的FC一起被解析成mov eax,dword ptr ds:[0xfc7c9333]了,于是报访问内容错误!
在这里插入图片描述
在这里插入图片描述
②正确的分析在后面,此处略。

(3) 程序pop pop ret后会调到buf的初始位置,而不是buf中去掉跳板地址的后4个字节处
而这样就把pop pop ret跳板地址当作指令执行了,这样没关系吗??
事实证明没有关系!

分析程序:
最终程序:
在这里插入图片描述
OD载入运行,在字符串OK处下断,找到传入的参数地址0x00402108
在这里插入图片描述
F7进入,单步,运行到strcpy结束处,发现buf的地址为0x0012FE9C
在这里插入图片描述
此时观察右下角堆栈图,这时虚表指针为0x0012FF78,而我们已经将它的内容覆盖为参数地址0x00402108
在这里插入图片描述
F7继续,果然程序call [0x00402108中的内容]=0x7C973F65
在这里插入图片描述
继续单步进入,此时0x0012FE9C距离栈顶3个字节,因此2次pop后,将执行0x0012FE9C中的内容
在这里插入图片描述
单步继续,程序果然执行0x0012FF9C中的内容了!
在这里插入图片描述
F9运行,果然出现弹框了!
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值