最近在看0 day这本书,虽然这本书很老了,但是里面的技术还是可以学习一下的,不时的学习新技术,也要学习曾经的老技术,这本书中大部分的环境都是windows XP下,使用的VC++ 6.0编辑器,我是觉得那个编辑真难用,可能使用惯了VS 2015了,因为觉得难用,所以书中大部分的实验我都没有尝试去实验,就是看懂了就算过去了,这次我对这个攻击C++虚函数的这个比较感兴趣,就决定动手试试,原理看懂了之后还是比较有意思的。
环境:windows 7 X64、VS 2015
先说下原理吧,就把书中的内容摘抄下来,先理解下虚函数和虚表
(1)C++类的成员函数在声明时,若使用关键字 virtual 进行修饰,则被称为虚函数。
(2)一个类中可能有很多个虚函数。
(3)虚函数的入口地址被统一保存在虚表(Vtable)中。
(4)对象在使用虚函数时,先通过虚表指针找到虚表,然后从虚表中取出最终的函数入口地址进行调用。
(5)虚表指针保存在对象的内存空间中,紧接着虚表指针的是其他成员变量。
(6)虚函数只有通过对象指针的引用才能显示出其动态调用的特性。
原理:
修改对象中的虚表指针或修改虚表中的虚函数指针,那么在程序调用虚函数时就会跑去执行 shellcode。
代码:
编译时需要关闭GS、DEP选项。
#include "stdafx.h"
#include "iostream"
//shellcode是使用kali系统下的msfvenom