阶段:简单栈溢出

  1. 分析栈溢出原理
  2. 寻找溢出点,了解pattern_create和pattern_offset计算溢出点的原理
  3. 寻找JMP ESP跳板,分析利用JMP ESP跳板劫持程序流的原理
  4. 编写漏洞利用脚本,自动化攻击

阶段:利用SEH绕过GS保护

  1. 了解GS编译选项,SHE异常处理机制
  2. 分析利用SHE异常处理机制绕过GS的原理
  3. 寻找溢出点
  4. 寻找PPR,解释为何利用PPR
  5. 编写漏洞利用脚本,自动化攻击

 

阶段:利用ROP绕过DEP保护

  1. 了解DEP保护
  2. 理解构造ROP链从而绕过DEP的原理,重点理解利用VirtualProtect
  3. 计算偏移量
  4. 利用mona创建ROP链
  5. 编写漏洞利用脚本,自动化攻击

 

第四阶段:

  1. 对关闭了DEP的vulnserver.exe进行攻击
  2. 对开启了DEP的bof—server.exe进行攻

阶段:简单栈溢出攻击

  1. 分析栈溢出原理

 

压栈时由高地址到低地址。调用函数时先从右到左传递参数,然后保存返回地址,然后保存EBP,然后为局部变量保存空间。局部变量低地址开始填充,如果不做边界检查,就有可能向上覆盖掉返回地址,函数返回时就会跳转到覆盖的地址,从而实现劫持。

简单测试

修改启动脚本,关闭DEP   AlwaysOff

制bof-server到Xp的LQ目录下,方便在shell操作。

执行,开启端口1000

Ipconfig查看服务器ip 192.168.67.133

用Kali连接,输入1024个A到bof

A用python产生

可见现在offset是41414141

2.确定溢出点位置

生成字符序列确定溢出点位置。

首先msfconsole。

利用metasploit-framework 生成有序序列用来确定溢出位置、

Offset72413372

计算偏移量 520   (72413372是ascii码,转换成字母后再刚刚的有序序列排到的就是520位)

3.寻找jmp esp 跳板

在windows,用Immunity Debugger,Attach bof-server。用mona查看。

Mona为如下目录下的python file

!Mona modules 查看server加载了哪些模块

采用ws2_32.dll

将dll复制到kali,用msfbinscan查找jmp esp指令的地址  0x71a22b53

4.自动化攻击

编写脚本

Rb文件不能直接paste到kali桌面,手动拖到home文件夹

Exploit

将脚本paste到指定目录下

复制完文件后reload,因为路径改变了,但是它还是原来的缓存

执行脚本

注意set rport

成功

阶段:利用SEH绕过GS保护

  1. 了解GS编译选项,SHE异常处理机制

GS编译选项:

1.1堆栈的变化

GS编译选项的原理就是在堆栈上插入一个安全cookie,以测试堆栈上的返回地址是否被修改过。安全cookie为4个字节,在堆栈上的位置如下。
调用参数
返回地址
EBP上层函数堆栈基址
安全cookie
异常处理代码入口地址
(如果函数设置异常处理)
局部变量

那么,如果是堆栈的局部变量发生缓存溢出的错误而导致返回地址被覆盖的话,由于安全cookie所在的位置,它也一定会被覆盖。

1.2函数的入口和出口代码

GS编译选项,对函数的入口和出口代码都添加了针对安全cookie操作的指令。

test函数的入口指令:

GSTest1!test:
 
00401020 55               push    ebp           ;保存上层函数堆栈基址
00401021 8bec             mov     ebp,esp       ;设置当前函数堆栈基址
00401023 83ec10           sub     esp,0x10
00401026 a130704000       mov     eax,[GSTest1!__security_cookie (00407030)]
0040102b 8945fc           mov     [ebp-0x4],eax
 
首先,堆栈的空间分配从0x0c变化为0x10,是因为需要多分配4字节的安全cookie。增加的另外两条指令是为了将GSTest1!__security_cookie的值放入堆栈的安全cookie的指定位置。

这时候的堆栈结构如下:

0:000> dd esp
0013fec0  0013fee0 004013e8 0013fed0 6a915791 
0013fed0  0013fee4 00401016 0000000a 004050ec
 
0x6a915791就是安全cookie,它存放在返回地址0x00401016前。

test函数的出口指令则变为:

0040103d 83c40c           add     esp,0xc
00401040 33c0             xor     eax,eax
00401042 8b4dfc           mov     ecx,[ebp-0x4]
00401045 e85b010000       call    GSTest1!__security_check_cookie (004011a5)
0040104a 8be5             mov     esp,ebp
0040104c 5d               pop     ebp
0040104d c3               ret
 
也增加了两条指令。首先将堆栈上的安全cookie的值放入ecx,然后调用__security_check_cookie函数来检查其值是否被修改过。

如果一旦发现安全cookie的值被改动,那么就会转入异常处理,终止程序运行。这样,即使存在缓存溢出的错误,GS选项也能阻止恶意代码通过覆盖函数的返回地址这种攻击方式。

SHE异常处理机制:

2. 分析利用SHE异常处理机制绕过GS的原理

seh通常利用的是pop pop ret 一旦进入异常处理,就会把Pointer to next SEH的这个地址压入栈中进行系统处理,通过pop pop然后这个地址ret到我们的eip中,因为Pointer to Next..是可控的所以我们控制这个地址来控制eip,然后就是可以通过mona来找pop pop ret 来覆盖Se handler。

3. 寻找溢出点

生成溢出字符序列:

生成的文件在Home

用vim编辑C.Txt,16进制观察,删除多余的0x0aA

增加文件头HEAD

结果:

SEH链

启动EFSW,Immunity Debugger attach

注意要在运行态

Kali链接,发送溢出的字符串

也可以采用python脚本发送

注意buff为pattern_create.rb生成的序列

View SEHchain

计算偏移量

4.寻找PPR,解释为何利用PPR

为什么要用PPR?

POP POP RET是创建SEH(Structured Exception Handler,结构化异常处理程序)漏洞所需的指令序列。弹出值所对应的寄存器对于攻击成功不重要,重要的是ESP向更高地址移动两次,然后执行RET。因此,POP EAX,POP EBX,RET或POP ECX,POP ECX,RET或POP EDX,POP EAX,RET(等等)都可以。每次发生POP <寄存器>时,ESP向较高地址移动一个位置(对于32位架构来说是4字节)。每次发生RET时,地址ESP中的内容被放入EIP中执行(ESP也会移动,但这在这里不重要)。为了创建成功的SEH漏洞,必须找到POP POP RET序列的地址使攻击者两次将ESP移向更高地址,然后在ESP指向的地址处执行指令。

缓冲区溢出之前,内存看起来像这样。

缓冲区驻留在低于00 00 60 40的地址中。攻击者将溢出缓冲区,以便适当地设置堆栈。 另外,请注意带有POP POP RET指令序列的模块驻留在存储器的另一部分中。缓冲区溢出之后,内存看起来像这样。

攻击者已经把shellcode放置在从00 00 60 48开始的地方,还修改了下一个SEH记录的地址,以包含6字节跳转到shellcode的操作码(EB 06是汇编指令JMP 06的操作码)。 并且,攻击者也改变了SEH Handler的地址以指向POP POP RET指令序列。现在将引发异常,然后内存看起来像这样。

因为系统试图处理引发的异常,它会在堆栈上设置EXCEPTION_DISPOSITION Handler结构体。此结构体的Establisher Frame指针指向第一个handler的记录。第一个handler的记录从00 00 60 40开始,包含下一个SEH记录的地址和SEH handler的地址。系统以这样的方式设置堆栈:ESP指向EXCEPTION_DISPOSITION结构体的开始,这里是00 00 50 00。从该图中,很容易理解攻击者对POP POP RET指令序列的需求。缓冲区溢出后,将引发异常,因此程序从SEH handler的地址开始执行。缓冲区溢出将SEH handler的地址设置为POP POP RET序列的地址,在我们的示例中为10 20 30 40。因此,程序从地址10 20 30 40处开始执行。
第一个POP执行前,ESP指向00 00 50 00。
第一个POP执行后,ESP指向00 00 50 04。
第二个POP执行后,ESP指向00 00 50 08。
RET执行后,EIP指向00 00 60 40,它们是地址00 00 50 08 ESP指向的内容。所以,程序在00 00 60 40继续执行。程序执行指令EB 06,这是到00 00 60 48的6字节跳转,也就是shellcode的开始。很明显,如果攻击者可以用任何希望的值覆盖SEH handler,可以直接用shellcode的地址覆盖它。但是由于SafeSEH保护措施,这是不可能的,所以SEH handler被指向POP POP RET序列。
https://dkalemis.wordpress.com/2010/10/27/the-need-for-a-pop-pop-ret-instruction-sequence/

寻找POP POP RET

!Mona modules 找到服务器加载的模块

!mona seh 找到Imageload.dll

在kali找到PPR

5.编写漏洞利用脚本,自动化攻击

注意offset采用的是下一条SEH记录偏移量

阶段:利用ROP绕过DEP保护

  1. 了解DEP保护

DEP - 数据执行保护的缩写,Data Execution Prevention。 他是一套软硬件技术,能够在内存上执行额外检查以帮助防止在系统上运行恶意代码。其基本原理是将数据所在内存页标识为不可执行,当程序溢出成功转入shellcode时,程序会尝试在数据页面上执行指令,此时CPU就会抛出异常,而不是去执行恶意指令。如图所示

效果;

2.理解构造ROP链从而绕过DEP的原理,重点理解利用VirtualProtect

如果函数返回地址并不直接指向数据段,而是指向一个已存在的系统函数的入口地址,由于系统函数所在的页面权限是可执行的,这样就不会触发DEP

也就是说,可以在代码区找到替代指令实现shellcode的功能

但是可供利用的替代指令往往有限,无法完整的实现shellcode的功能

于是产生了一个折中方法:通过替代指令关闭DEP,再转入执行shellcode

ROP技术前提:

  • 小部件(gadget):内存中一个个以ret为结尾的指令序列(非常形象),我们像捡破烂一样收集它们。
  • ret指令:ret指令实际上相当于pop EIP,也就是将EIP设置为栈顶(esp指向)的值,也就是跳转到栈顶的值所指向的地址。

ROP,Retrun-oriented Programmming(面向返回的编程),技术原理:
将一个个小部件在栈上进行有序的排列,每个小部件末尾的ret指令会使这些小部件依次得到执行。

VirtualProtect 
Win32API

BOOL VirtualProtect{

LPVOID lpAddress,

DWORD dwsize,

DWORD flNewProtect,

PDWORD lpflOldProtect

}

lpAddress:内存起始地址

dwsize:内存区域大小

flNewProtect:内存属性,PAGE_EXECUTE_READWRITE(0x40)

lpflOldProtect:内存原始属性保存地址

通过VirtualProtect绕过DEP:

在内存中查找替代指令,填入合适的参数,调用VirtualProtect将shellcode的内存属性设置为可读可写可执行,然后跳到shellcode继续执行

3.计算偏移量

对象vulnserver.exe

查看源码漏洞

首先

Attach后再kali构造溢出字符串,发送到server,计算偏移量

构造方法:

'TRUN .' + make_nops(target['Offset'])

选项Pattern_create -l 3000

之后过程与阶段二类似,不再赘述

脚本

与第二阶段类似,只是修改了send的内容 //10000>3000,故用10000个字符也可以

发送。注意xp在启动了DEP保护的情况下发送。

结果

结果:  偏移2006

4.利用mona创建ROP链

开启监听

Immunity debugger attach

点击run

生成rop_chains.txt

5.编写漏洞利用脚本,自动化攻击

修改offset

修改rop

攻击:

第四阶段:练习

  1. 对关闭了DEP的vulnserver.exe进行攻击

1.1 确定偏移量

2006

1.2 寻找jmp esp跳板

利用msvcrt.dll

1.3自动化攻击

参考阶段一代码和阶段三代码,观察payload和exploit的区别。对offset,ret,以及exploit部分都做了修改

2.对开启了DEP的bof—server.exe进行攻击

2.1 计算偏移量

520

2.2 构建ROP链

2.3自动化攻击

参考阶段一阶段三代码,修改了offset,去掉了offset,修改了exploit

遇到的问题:

测试后发现是因为msfconsole前先改变了metasploit-framework文件夹下的文件。解决办法是开启msfconsole后,再添加,然后reload_all

最新文章

  1. git学习教程
  2. Apache代理Tomcat实现session共享构建网上商城系统
  3. InteliJ IDEA15 安装jrebel破解文件
  4. while练习:输入一个班级的人数,然后依次输入学员成绩,计算班级学员的平均成绩和总成绩。
  5. jQuery框架的简单使用(H5)
  6. extjs4 与 kindeditor
  7. Python练习题 028:求3*3矩阵对角线数字之和
  8. Oracle中的 UPDATE FROM 解决方法
  9. POJ3264 Balanced Lineup 线段树区间最大值 最小值
  10. python入门基础
  11. (NO.00001)iOS游戏SpeedBoy Lite成形记(二十二)
  12. 怎样把linux客户端用户禁止用 su命令来切换用户
  13. Beta项目展示
  14. Adapter中用不了getWindowManager()
  15. 修复webpack自动刷新页面慢的问题
  16. profibus 的DPV0 和DPV1
  17. Vue 小组件input keyup.enter绑定
  18. Shell学习笔记:&lt;&lt;EOF子命令
  19. 在NGUI中高效优化UIScrollView之UIWrapContent的简介以及使用
  20. Tomcat常用设置

热门文章

  1. LightOJ - 1234 LightOJ - 1245 Harmonic Number(欧拉系数+调和级数)
  2. 判断ip地址是否为内网ip或局域网ip
  3. javascript中的scroll事件
  4. php如何判断文件是否存在,包括本地和远程文件
  5. [Swift]Xcode实际操作
  6. 爬虫之scapy
  7. 关于Struts漏洞工具的使用
  8. 前端编码规范,个人感觉bootstrap总结的不错,拿出来给大家分享
  9. Maven对坐标的管理 自动导入传递依赖 坐标和传递依赖分级显示
  10. Linux操作学习笔记1