虚函数突破GS

  1. 如何确定变量的内存布局

  2. 为什么不直接执行buff里面的shellcode,而要绕远
    • 因为虚表指针指向buff,buff的地址还要指向另一个地址,没有办法直接执行buff。这是由虚函数与虚表性质决定。

  3. 为什么执行完call还必须返回shellcode,call不就是call进shellcode吗?
    • call是必须的,见问题2.然后剩下的问题是怎么回到shellcode内,一是把shell地址作为call的地址,但是地址在不同电脑上加载的时候是不一样的,所以地址的方法不可行;二是通过跳板跳转实现。这样需要注意的是跳板在shellcode的一开头,当作为shell的时候要被执行到,需要尝试一个“poppopretn”的地址时不产生异常(乱指令比较容易产生异常,但是也会被编译器放过去,尝试的时候7c开头的5个不成,78开头的2个都成功了)。

虚函数突破GS

时间: 2024-10-29 18:47:48

虚函数突破GS的相关文章

覆盖虚函数突破GS (踩坑)

参考文章: https://bbs.pediy.com/thread-211315.htm https://www.52pojie.cn/thread-490768-1-1.html <0day安全软件漏洞分析技术> 10.3 节 环境: xp sp3 vs 2008 爬坑: 覆盖虚表指针跳转到 shellcode首地址 , 执行 pop pop ret ,运行 shellcode. 虚表指针指向的地址中存储的数据 就是要执行的地址. pop pop retn指令序列的地址不是随便选取的,它有

[转]什么是C++虚函数、虚函数的作用和使用方法

我们知道,在同一类中是不能定义两个名字相同.参数个数和类型都相同的函数的,否则就是“重复定义”.但是在类的继承层次结构中,在不同的层次中可以出现名字相同.参数个数和类型都相同而功能不同的函数.例如在例12.1(具体代码请查看:C++多态性的一个典型例子)程序中,在Circle类中定义了 area函数,在Circle类的派生类Cylinder中也定义了一个area函数.这两个函数不仅名字相同,而且参数个数相同(均为0),但功能不同,函数体是不同的.前者的作用是求圆面积,后者的作用是求圆柱体的表面积

什么是C++虚函数、虚函数的作用和使用方法

我们知道,在同一类中是不能定义两个名字相同.参数个数和类型都相同的函数的,否则就是“重复定义”.但是在类的继承层次结构中,在不同的层次中可以出现名字相同.参数个数和类型都相同而功能不同的函数.例如在例12.1(具体代码请查看:C++多态性的一个典型例子)程序中,在Circle类中定义了 area函数,在Circle类的派生类Cylinder中也定义了一个area函数.这两个函数不仅名字相同,而且参数个数相同(均为0),但功能不同,函数体是不同的.前者的作用是求圆面积,后者的作用是求圆柱体的表面积

栈溢出 利用虚函数

环境 win10 vs2017 Release   x86 突破GS 禁用DEP,ALSR 使用安全函数,不然会报错,要是禁用SDL,GS也会被禁掉.(反正我没搞定,不过好像也没啥影响,安全函数也阻止不了我写bug) 1.虚函数的调用 ①首先,虚函数的地址保存在虚函数表,虚函数表的地址保存在类对象前四个字节. vs中调试,监视对象,很明显. ②进入汇编层面,用od调试: 调用gsv函数前,有两个参数,一是shellcode地址,一是this指针 进入gsv函数: 很明显,虚函数表保存在ebp+0

虚函数列表: 取出方法 // 虚函数工作原理和(虚)继承类的内存占用大小计算 32位机器上 sizeof(void *) // 4byte

#include <iostream> using namespace std; class A { public: A(){} virtual void geta(){ cout << "A:A" <<endl; } virtual void getb(){ cout << "A:B" <<endl; } }; class B :public A{ public: B(){} virtual void g

读书笔记 effective c++ Item 35 考虑虚函数的替代者

1. 突破思维——不要将思维限定在面向对象方法上 你正在制作一个视频游戏,你正在为游戏中的人物设计一个类继承体系.你的游戏处在农耕时代,人类很容易受伤或者说健康度降低.因此你决定为其提供一个成员函数,healthValue,返回一个整型值来表明一个人物的健康度.因为不同的人物会用不同的方式来计算健康度,将healthValue声明为虚函数看上去是一个比较明显的设计方式: 1 class GameCharacter { 2 public: 3 4 virtual int healthValue()

C++虚函数:虚指针、虚表、虚函数入口地址

测试程序: //test.c #include"stdio.h" #include"string.h" class GSVirtual { public: void gsv(char *src) { char buf[200]; strcpy(buf,src); vir2(); } virtual void vir1() { printf("vir1"); } virtual void vir2() { printf("vir2&quo

c++中虚函数和多态性

1.直接看下列代码: #include <iostream> using namespace std; class base{ public: void who(){ cout<<"this is the class of base!"<<endl; } }; class derivel1:public base{ public: void who(){ //一般的重载函数 cout<<"this is the class of

C++中虚函数工作原理和(虚)继承类…

转载请标明出处,原文地址:http://blog.csdn.net/hackbuteer1/article/details/7883531 一.虚函数的工作原理 虚函数的实现要求对象携带额外的信息,这些信息用于在运行时确定该对象应该调用哪一个虚函数.典型情况下,这一信息具有一种被称为 vptr(virtual table pointer,虚函数表指针)的指针的形式.vptr 指向一个被称为 vtbl(virtual table,虚函数表)的函数指针数组,每一个包含虚函数的类都关联到 vtbl.当