ZERO DAY ATTACK(持续更新目前完成25%)

ZERO DAY ATTACK
1.现代攻击的精髓是
2.Bug和漏洞的区别是什么
3.什么是PoC
4.什么是Exp
5.什么是补丁比较漏洞分析方法
6.什么是CVE、CETR
7.Black Tuesday是什么0day、1day、5day是指
8.#pragma data_seg()的作用是什么
9.r3内存和r0内存的区别
10.什么是硬盘内存
11.文件偏移地址、装载基址、虚拟内存地址、相对虚拟地址分别是什么
12.磁盘数据存放标准和内存数据标准存放的基本单位分别是多少
13.请写出文件偏移地址与虚拟地址之间的换算公式
14.代码区、数据区、堆区、栈区的作用
15.高级语言写出的程序经过编译链接后是,被装装载后是
16.调用方式之间的差异、与调用约定
17.内存数据和数值数据的区别是什么
18.什么是缓冲区溢出
19.如何利用缓冲区溢出修改变量
20.如何利用缓冲区溢出植入代码获取程序控制权
21.Shellcode和exploit是什么关系
22.Mestasploit平台是什么
23.栈帧跳板技术是什么
24.缓冲区攻击是由那三部分组成的
25.什么是shellcode header
26.Esp升栈保护是什么
27.当缓冲区较大时,将shellcode布置在缓冲区内有什么好处
28.什么是Heap Spray技术
29.通用shellcode定位API原理
30.什么是shellcode编码技术为什么需要他
31.shellcode加壳需要注意什么
32.什么是MSF平台
33.漏洞利用技术过程
34.MetaSploit Console简单使用
35.堆的特点
36.堆管理的基本特点
37.什么是堆块和堆表
38.重要的堆表有几种分别是什么
39.空表和快表的区别是什么它们是如何进行组织的
40.什么是堆块分配、堆块释放、堆块合并
答案在下面
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
1.现代攻击的精髓
现在攻击技术的精髓是混淆数据和代码的界限,让系统错误地把数据当做代码去执行(缓冲区溢出攻击)。
2.漏洞分为:
(1)功能性逻辑漏洞(bug)影响软件的正常功能,例如,执行结果错误,图标显示错误等。
(2)安全性逻辑缺(漏洞)通常情况下不影响软件的正常功能,但被攻击者成功利用后,有可能引起软件去执行额外的恶意代码,常见的漏洞包括软件中的缓冲区溢出漏洞,网站中的跨脚本漏洞(XSS)、SQL注入漏洞等。
3.什么是PoC
Poc(全称:Proof of Concept),中文译作概念验证,在安全界,你可以理解成为漏洞验证程序,和一些应用程序相比,PoC是一段不完整的程序,仅仅是为了证明提出者的观点的一段代码。是一些代码片段。
4.什么是Exp
Exp(全称:Exploit),中文叫漏洞利用程序,就是一段可以发挥漏洞价值的程序,想想一下这样的场景,目标存在一个SQL注入漏洞,然后被你知道了,然后你编写了一个程序,通过这个SQL注入漏洞,拿到了目标的权限,那么这个程序就是所谓Exp了,当然如果你没有使用这个漏洞,那么这个漏洞对你来说可以认为是没有价值的。
5.什么是补丁比较分析方法
当无法获得POC时,就只有厂商提供的队漏洞的简单描述了,补丁比较方法,首先比较补丁程序(patch)前后文件都有哪些地方被修改,之后可以利用反汇编工具(IDA PRO)重点逆向分析这些地方。
6.CVE和CERT
(1)CVE(Common Vulnerabilities and Exposures),http://cve.mitre.org/,截止目前,这里收录了两万个漏洞,CVE会对每个公布的漏洞进行编号,审查、CVE编号通常也是引用漏洞的标准方式。
(2)CERT(Computer Emergency Response Team),http://www.cert.org/,计算机应急响应组往往会在第一时间跟进当前的严重漏洞,包括描述信息,POC的发布链接,厂商的安全响应进度、用户应该采取的临时防御性措施。
7.Black Tuesday
微软安全中心所公布的漏洞是所有安全工作者和黑客们最感兴趣的地方,微软每个月第二周的星期二发布补丁,这一天通常被称为“Black Tuesday”因为会有许多的攻击者通宵达旦地研究这些补丁,patch了那些漏洞,并写出exploit,因为在补丁刚刚发布的一段时间内,并非所有用户都能及时修复,故这种新公布的漏洞也有一定的利用价值,有时把攻击这种刚刚被patch过的漏洞称为1day攻击(patch 发布后的一天,叫做1day,5天叫做5day)没有发布的patch叫做0day。
8.#pragma data_seg()
可以吧代码中任意部分编译到PE的任意节中,节名也可以自己定义。
9.r3内存和r0内存的区别
r3内存是用户态内存,如果是32位的系统,Windows会让所有进程都相信自己拥有独立的4GB空间,实际上计算机中实际内存只有512MB,这是通过虚拟内存(VA)管理器做到的,r3操控的是虚拟内存(VA),通过虚拟内存(VA)管理器在控制,r0是内核态内存它可以直接使用物理地址,也就是说r0内核态可以随意操控虚拟内存(VA)管理器控制映射的进程的物理地址,但是因为保护模式r3用户态无法篡改0x7ffffffff向上r0的内核态的物理地址。
10.什么是硬盘内存
硬盘内存是指物理内存不够时,有时操作系统会把“部分硬盘空间”当做内存使用从而使程序得到装载运行的现象。
11.文件偏移地址、装载基址、虚拟内存地址、相对虚拟地址
文件偏移地址(File Offset)
数据在PE文件中的地址叫做文件偏移地址,个人认为叫做文件地址更加准确,这是文件在磁盘上存放时相对文件开头的偏移。
装载基址(Image Base)
PE装入内存时的基地址,默认情况下,EXE文件在内存中的基地址是0x00400000,DLL文件是0x10000000,这些位置可以通过修改编译选项更改。
虚拟内存地址(Virtual Address VA)
相对虚拟地址是内存地址相对于映射地址的偏移量。
虚拟内存地址、映射基址、相对虚拟内存地址三者之间关系:
VA=Image Base+RVA
12.磁盘数据存放标准和内存数据标准存放的基本单位分别是多少
硬盘数据标准
(1)PE文件中的数据按照磁盘数据标准存放,以0x200字节为基本单位进行组织,当一个数据节(section)不足0x200字节时,不足的地方将被0x00填充,当一个数据节超过0x200字节时,下一个0x200块将分配给这个节使用,因此PE数据节大小永远是0x200的整数倍。
内存数据标准
(2)当代码装入内存后,将按照内存数据标准存放,并以0x1000字节为基本单位进行组织,类似的,不足将被补全,超出将分配下一个0x1000为其所用,因此,内存中的节总是0x1000的整数倍。
(3)文件偏移地址和RVA之间的对应关系
节(section) 相对虚拟偏移量RVA 文件偏移量
.text 0x00001000 0x0400
.rdata 0x00007000 0x6200
.data 0x00009000 0x7400
.rsrc 0x0002D000 0x7800
13.文件偏移与虚拟地址的换算公式
文件偏移地址=虚拟内存地址(VA)-装载基址(Image Base)-节偏移=RVA-节偏移
例子:(参考12关系图)
文件中的偏移=0x00404141-0x00400000-(0x1000-0x400)=0x3541
14.代码区、数据区、栈区、堆区
代码区:
这个区域存储着被装入执行的二进制机器代码,处理器会到这个区域取指并执行。
数据区:
用于存储全局变量
堆区:
进程可以在堆区动态请求一定大小的内存,并在用完之后归还给堆区,动态分配和回收是堆区的特点。
栈区:
用于动态存储函数之间的调用关系,以保证被函数在返回时恢复到母函数中执行。
15.高级语言写出的程序经过编译过后的文件是PE文件,当PE文件被装载运行后,就成了所谓的进程。
16.调用方式之间的差异与函数调用约定
调用方式差异:
参数入栈顺序 恢复栈平衡操作的位置
C 右→左 母函数
SysCall 右→左 子函数
StdCall 右→左 子函数
BASIC 左←右 子函数
FORTRAN 左←右 子函数
PASCAL 左←右 子函数
函数调用约定:
调用约定声明 参数入栈顺序 恢复栈平衡位置
_cdecl 右→左 母函数
_fastcall 右→左 子函数
_stdcall 右→左 子函数
17.内存数据和数值数据的区别
内存由低到高分布,可以简单吧这种情况理解成Win32系统在内存中由低向高位存储一个DWORD,但是作为数值的应用的时候,却是按照由高位字节向低位字节存储,这样内存数据中的DWORD内容就是按字节逆序。
内存数据为大端显示、数据数值为小端显示(以小端为准)
18.什么时候缓冲区溢出
缓冲区溢出就是输入的数据大于分配的堆栈空间导致数据覆盖堆栈。
19.如何利用缓冲区溢出修改堆栈
缓冲区溢出会因为数据大于栈分配的空间导致栈空间数据被缓冲区数据覆盖假设一个数组是4字节,在这个栈数组的下面有一个变量int i 值为10如果没有审查导致输入了一个8字节的数据就会覆盖int i的栈数据导致缓冲区溢出修改变量。
20.如何利用缓冲区溢出植入代码获取程序控制权
从18、19问题可以得出缓冲区溢出实际上就是覆盖栈信息,而ret指令弹栈的的位置也是保存在栈中的,也就是说可以利用缓冲区溢出写一段shellCode机器码指令之后覆盖ret弹栈位置为shellCode栈地址的起始位置,那么ip寄存器就会指向这个地址,将溢出的数据当做指令来运行,这样就是利用缓冲区溢出来执行任意代码。
21.ShellCode和exploit的关系
ShellCode是汇编编写的转换为二进制的机器码主要是利用缓冲区溢出写入到栈中是执行的指令,可以将他理解为导弹的弹头。
Exploit是植入ShellCode的大量调试工作,比如弄清楚程序的几个输入点,这些输入将最终会当做那个函数的第几个参数读入到内存的哪一个区域,哪一输入会造成栈的溢出,在复制到栈区的时候对这些数据有没有额外的限制等,调试之后还要计算函数返回地址距离缓冲区的偏移并淹没,选择指令的地址,最终制作出一个有攻击效果承载着ShellCode弹头的,的武器,代码植入的过程就是漏洞利用也就是exploit。
22.Mestasploit平台是什么
Mestasploit就是采取用了模块化、封装化、代码重用等思路的漏洞技术平台,如果将ShellCode比喻成弹头,exploit比喻成推进器和标准系统,那么Metasploit就是将这些技术细节封装起来,将利用漏洞封装成易用的模块,大大减少了exploit开发过程的重复工作。
23.栈帧跳板技术
栈帧跳板实际上还是通过缓冲区溢出ret弹栈位实现的,因为操作系统和版本不同ebp以上的堆栈写入shellcode在ret弹栈执行的时候可能会在错误的地址执行shellcode所以需要使用栈帧跳板技术,将shellcode写入esp栈顶下面shellcode总是会以正确的地址执行,但是溢出只能是向下溢出,要如何才能溢出栈顶?首先需要知道的是弹栈的基本方式有2中一种是stdcall一种是cdecl,一个是子函数自身弹栈,一个是母函数弹栈,已stdcall调用弹栈为例子ret 0x100指令执行之后会在将esp位置降低到0x100个字节ebp这个时候是高于esp的也就是说栈底变栈顶,ret之后执行0x100位置的地址为ip地址当做代码来执行,这个时候将只要将ret弹栈位置改为栈帧的shellcode就可以执行了,但是需要注意的是cdecl是母函数弹栈,这样一来不就无法执行shellcode了吗,因为ret 指令不落esp栈顶了,但是这个时候你可以用栈帧跳板找到一个是ret 0x100这种的位置的指令地址将ret弹栈的地址改为ret 0x100的指令地址不就实现了弹栈方式改变吗,将cdecl变成stdcall这种调用方式了吗,从而esp栈顶低于栈底从而可以执行shellcode,至于为什么这种方式shellcode一定可以在正确的位置执行那是因为弹栈的位置是固定的。
24.缓冲区的组成
(1)填充物
可以是任何值,但一般用NOP指令对应的0x90填充缓冲区,并把shellcode布置于其后,这样即使不能准确地跳转到shellcode的开始,只要跳进填充区,处理器最终也能顺利的执行到shellcode。
(2)淹没返回地址的数据
可以是跳转指令的地址,shellcode起始地址,甚至是一个近似的shellcode地址。
(3)Shellcode
在缓冲区中怎样摆放shellcode对exploit的成功至关重要,shellcode是要执行的机器指令。
25.什么是shellcode header
Shellcode header是一段引导指令,本质上也是一段shellcode但是的目的主要是引导处理器执行shellcode真正的缓冲区地址处执行。
26.esp升栈保护
以stdcall调用为例,ret 0x10弹栈后栈顶低于栈底如果这个时候有push等指令入栈可能会导致覆盖esp向上的shellcode指令,因为这个时候的esp低于栈底,push入栈视为栈顶上的数据无效会进行随意的覆盖操作,因此有可能会覆盖shellcode指令导致失效,因此需要执行esp升栈使栈顶提高保证push入栈操作不会修改shellcode指令。
27.缓冲区较大时,将shellcode布置在缓冲区中有什么好处
(1)合理利用缓冲区,使攻击串的总长度减少,对于远程攻击,有时所有数据必须包含在一个数据包中。
(2)对程序破坏小,比较稳定,溢出基本发生在当前栈帧,不会大规模破坏前栈帧。
28.Heap Spray技术是什么
在某些特别苛刻的环境下可能不能使用esp定位shellcode位置而静态的shellcode覆盖有不太准确导致shellcode无法正常运行所以就需要使用Heap Spray技术他的本质实际上是一种shellcode的编写方式,通过在关键shellcode运行执行通过0x90指令即nop覆盖大量的内存区域,就像靶子无比大乱枪也可以打中,也就是Heap Spray。

29.通用shellcode定位API原理
(1)为什么需要定位API
不同版本的操作系统版本windows2000、windowsXp、win7、win10等会影响动态链接库的加载基址,不同版本的补丁版本也有可能修改这些动态链接库的函数,使得不同版本补丁对应的动态链接库的内容有所不同,包括动态修改链接库文件的大小和导出函数的偏移位置。
(2)基本原理
Windows的API是通过动态链接库中的导出函数来实现的,例如内容操作等函数在kernel32.dll中实现,大量的图形界面相关的API则在user32.dll中实现,win32平台下的shellcode使用最广泛的方法,就是通过从进程环境块中找到动态链接库的导出函数,并搜索出所需要的的API地址,然后逐一调用。
过程:
(2.1)首先通过段选择字FS在内存中找到当前的线程环境块TEB。
(2.2)线程环境偏移位置为0X30的地方存放着指向进程环境块PEB的指针。
(2.3)进程环境块中偏移位置为0x0C的地方存放着指向PEB_LDR_DATA的结构体的指针,其中存放着已经被装载的动态链接库的信息。
(2.4)PEB_LDR_DATA结构偏移位置为0X1C的地方存放着指向模块初始化链表的头指针InItiaializationOrderModuleList。
(2.5)模块初始化链表InInitializationOrderModuleList中按顺序存放着PE装入运行时初始化模块的信息,第一个链表节点是ntdll.dll第二个链表结点就是kernel32.dll。
(2.6)找到属于kernel32.dll的结点后,在其基础上在偏移0x08就是kernel32.dll在内存中加载基地址。
(2.7)从kernel32.dll的记载基地址算起,偏移0x3C的地址就是其PE头。
(2.8)PE头偏移0x78的地方存放着指向函数导出表的指针。
(2.9)至此,我们可以按如下方法在函数导出表中算出所有函数的入口函地址。
(2.9.1)0导出表偏移0x1C处的指针指向存储导出函数偏移地址(RVA)的列表。
(2.9.2)导出表偏移0x20处的指针指向存储导出函数函数名的列表。
(2.9.3)函数的RVA地址和名字按照顺序存放在上述两个列表中,我们可以在名称列表中定位到所需要的函数是第几个,然后在地址列表中找到对应的RVA。
(2.9.4)获得RVA后,在加上前边已经得到的动态链接库的加载基地址,就获得了所需要API此刻在内存中的虚拟地址,这个地址就是我们最终shellcode中调用时需要的地址。
30.什么是shellcode编码技术为什么需要他
(1)什么是shellcode编码技术
Shellcode编码技术就是将shellcode进行乔装打扮,精心构造十几个字节的解码程序,放在shellcode开始执行的地方,当exploit成功时,shellcode顶端的解码程序首先运行,它会在内存中将真正的shellcode还原成原来的样子,然后执行,这种对shellcode编码的方式和软件的加壳原理非常相似。
(2)为什么需要shellcode编码技术
在很多漏洞利用的场景中,shellcode的内容会受到限制,首先所有字符串的函数都会对NULL字节(byte、ASCII函数)或(word、Unicode函数)。
其次,有些函数还会要求shellcode必须为可见字符的ASCII或Unicode的值,在这种限制较多的情况下,如果仍然通过挑选指令的办法控制shellcode值的话,将会给开发代码很大困难,毕竟用汇编指令写程序已经不容易了,除了上述提到的软件自身的限制之外,在进行网络攻击时,基于特征码的IDS系统往往也会对常见的shellcode进行拦截,而需要突破重重防御就需要shellcode编码。
31.编写变形shellcode需要注意什么
用于异或的特定数据相遇加密算法的密钥,因为对应的解码过程也同样简单,我们可以编写程序对shellcode的每个字节用特定的数据进行异或运算,使得整个shellcode内容达到要求。
(1)用于异或运算的特定数据相遇加密算法的密钥,在选取是不可与shellcode已有字节相同,否则编码后会产生NULL字节。
(2)可以选用多个密钥分别对shellcode的不同区域进行编码,但是会增加解码的操作复杂性。
(3)可以对shellcode进行很多轮的编码运算。
32.什么是MSF平台
MSF(MetaSploit Frame work)是漏洞测试平台,在软件工业中面相对象、封装等概念的提出对漏洞的利用、漏洞的测试、等领域也有深远的影响,就像软件开发中的MFC架构.net架构一样,安全技术领域的开发也有自己独特的Frame Work用于写出exploit的快速开发,通用化的漏洞测试平台就是MSF。
33.漏洞利用技术过程
(1)触发漏洞
缓冲区有多大,第几个字节可以淹没返回地址,用什么样的方法植入代码。
(2)选取shellcode
执行什么样子的shellcode决定了漏洞利用的特质,例如是作为安全检测而弹出一个消息框,还是用于入侵端口绑定、木马上传等。
(3)重要参数的设置
目标主机的IP地址、bindshell中需要绑定的端口号、消息框所显示的内容、跳转指令的地址等经常需要shellcode中进行修改。
(4)选用编码、解码算法
实际应用中的shellcode往往需要经过编码(加密)才能安全的送入特定缓冲区,执行时,位于shellcode顶部的若干条解码指令会首先还原出shellcode然后执行。
漏洞利用和导弹类比
漏洞利用 导弹发射
漏洞触发、栈溢出、堆溢出 引爆装置、碰撞引爆、定时引爆、热引爆
选取shellcode 选取弹头
设置重要参数、端口号、IP地址 为导弹设定目标
选用编码、解码算法 加上躲避雷达等措施、确保不会被拦截
34.MetaSploit Console简单使用
(1)show exploits 显示MetaSploit目前所有能够测试的所有漏洞以及相关表述
(2)Use windows/smb/ms06_040_netapi 选择MS06-040进行测试
(3)Info显示当前所选漏洞的描述信息
(4)Show target 显示当前所选漏洞能够影响的操作系统
(5)Set targets 0 设置target为0 即自动识别windows 2000和windows xp系统。
(6)Show payloads 显示可适用于当前所选漏洞的shellcode
(7)set payload windows/adduser 选用adduser为shellcode
(8)Show options 显示当前所选漏洞和shellcode需要配置的选项
(9)Set RHOST 192.168.88.137 按照show options的提示设置目标主机地址
(10)Set PASS 123456 按照show option的提示设置账号密码
(11)Set USER failwest 按照show options的提示设置用户名
(12)Exploit
35.堆的特点
(1)堆是一种程序在运行时动态分配的内存,所谓动态内存是指所需内存的大小和在程序设计时不能预先决定,需要在程序运行时参考用户的反馈。
(2)堆在使用时需要程序员用专用的函数进行申请,如C语言的malloc函数、c++的new函数等都是常见的分配堆内存的函数,堆内存申请有可能成功,也有可能失败,这与申请内存的大小、机器性能和当前环境有关。
(3)一般用一个堆指针使用申请得到的内存,读、写、释放都是通过这个指针来完成。
(4)使用完毕后需要把堆指针传给释放函数回收这片内存,否则会造成内存的泄露,典型的释放函数包括free、delete等。
36.堆管理的基本特点
(1)“杂乱”是指当前堆区经过反复申请、释放等操作,原本大片连续的空闲内存区可能呈现出大小不等且空闲块、占用块相间隔的凌乱状态。
(2)“辨别”是指堆管理程序必须能够正确地识别哪些内存区域是正在被程序使用的占用的块,哪些区域是可以返回给当前请求的空闲块。
(3)“恰当”是指堆管理程序必须能够比较“经济”地分配空闲内存块,如果用户申请使用8个字节,而返回给用户一片512字节的连续内存区域并将标记成占用状态,这将操作大量的内存浪费,以至出现了明明有内存却无法满足申请,请求的情况出现。
37.什么是堆块和堆表
(1)堆块
出于性能的考虑,堆区的内存按不同大小组织成块,以堆块为单位进行标识,而不是传统的按字节标识,一个堆块包括两部分:块首和块身,块首是一个堆块头部的几个字节,用来标识这个堆块自身的信息,例如,本块的大小、本块空闲还是占用等信息,块身是紧跟在块首后面的部分,也是最终分配给用户使用的数据区。
(2)堆表
堆表一般位于堆区的起始位置,用于索引堆区中所有堆块的重要信息,包括堆块的位置,堆块的大小,空闲还是占用等,堆表的数据结构决定了整个堆区的组织方式,是快速检索空闲块,保证堆分配效率是关键,堆表在设置时可能会考虑采用平衡二叉树等高级数据结构用于优化查找效率,现在操作系统的堆表往往不止一种数据结构。
38.重要的堆表
(1)空闲双向链表FreeList简称空表
(2)快速单向链表Lookaside简称快表

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

虚构之人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值