在上节写示例的过程中,我把要用到的POP+POP+RET指令写在了自己的一个DLL中。POP+POP+RET指令是很常见的指令,一般函数的末尾都是这种形式,因此,系统DLL中应该是有该指令的,比如ntdll.dll中就有: 
 
图73

我们把上节示例中的地址改成这个地址试试,没有弹出MessageBox,说明Shellcode失效了,在调试器中看看: 
 
图74

提示说无法处理异常,说明改了地址后的异常处理函数没有被运行。下面我们继续用我自己的DLL,但是重新编译它,这次在编译时加上“/SAFESEH”选项: 
 
图75

再来尝试一下(注意,重新编译后,指令地址发生变化),还是同样的提示。用Immunity Debugger的mona插件查看以下加载的模块: 
 
图76

只有exe不是SafeSEH,其它DLL都是,包括ntdll.dll。这就是本节的内容了。

为了防止基于SEH的栈溢出,Windows改进了SEH,称为SafeSEH。从前面我们至少看到一点,启用SafeSEH编译的模块,我们的Shellcode是无法利用的,系统并不会调用我们伪造的这个“异常处理函数”。

事实上,启用SafeSEH之后,模块中使用的异常处理函数都要提前注册,注册的地方就在加载配置目录(Load Config Directory)。前面我们接触过导出表,导入表,这个加载配置目录也类似,属于16中数据目录中的一种。这样的话,发生异常之后,调用异常处理函数前,系统会对异常处理函数地址进行检验,如果没有注册,说明这个异常处理函数有问题,就直接忽略该异常处理函数。就如我们前面所看到的,我们伪造的异常处理函数被忽略,后面的又被我们所覆盖,因此异常无法被处理。

怎么办呢?第一个办法如我前面所做的,如果程序中有模块没有启用SafeSEH,我们还是可以利用它来加载Shellcode。第二个办法就是SafeSEH有个例外,就是如果异常处理函数位于已加载模块地址范围之外,则异常处理函数依旧会被调用。这样机会就来了,即使程序中所有模块都启用了SafeSEH,或者虽然没有启用,但无法找到合适的指令块做跳板。我们还可以尝试其它不属于该进程的模块。

具体的做法在这篇文章中:https://www.corelan.be/index.php/2009/09/21/exploit-writing-tutorial-part-6-bypassing-stack-cookies-safeseh-hw-dep-and-aslr/。 
按他的做,很简单,这里就不重复了。

NLS,全称National Language Support,即本地语言支持。这个语言支持不只是文字,还有键盘,时间日期格式等,那么.nls后缀的文件就是相关的资源文件。这些资源文件使用的方式为内存映射,即读取其内存空间相当于读文件。进程结构PEB中有相应的成员: 
 
图77

这些成员指针在进程初始化的时候指向资源文件映射之后相应的地址。

需要注意的是,虽然我们在unicode.nls找到了需要的“指令”,但unicode.nls是数据,只不过是其中的数据正好和指令操作码相同。这与我们把Shellcode放在栈上执行时相同的。

栈溢出笔记1.11 SafeSEH相关推荐

  1. FreeRtos学习笔记(11)查找就绪任务中优先级最高任务原理刨析

    FreeRtos学习笔记(11)查找就绪任务中优先级最高任务原理刨析 怎么查找就绪任务中优先级最高的? tasks.c中声明了一个全局变量 uxTopReadyPriority,任务从其他状态进入就绪 ...

  2. ansible笔记(11):初识ansible playbook(二)

    ansible笔记(11):初识ansible playbook(二)有前文作为基础,如下示例是非常容易理解的:--- - hosts: test211remote_user: roottasks:- ...

  3. Linux第二周学习笔记(11)

    Linux第二周学习笔记(11) 2.17 隐藏权限lsattr_chattr chattr命令:是设置吟唱隐藏权限的命令,更改Linux文件系统上的文件属性. 参数说明: A:表示文件或目录的ati ...

  4. Android菜鸟的成长笔记(11)——Android中的事件处理

    原文: [置顶] Android菜鸟的成长笔记(11)--Android中的事件处理 Android提供了两种方式来处理事件,一个是基于回调的事件处理,另一个是基于监听的事件处理,举个例子: 基于回调 ...

  5. C# 学习笔记(11)蓝屏小工具

    C# 学习笔记(11)蓝屏小工具 加载界面参考 C# Winform 现代化扁平化启动界面设计https://www.bilibili.com/video/BV17E41147wM PS做一张图 70 ...

  6. 台湾国立大学郭彦甫Matlab教程笔记(11) advanced 2D plots 上

    台湾国立大学郭彦甫Matlab教程笔记(11) today: 1.advanced 2D plots 2.color space色彩使用 3.3D plots 图形概览,做研究的时候需要选择图形 sp ...

  7. Git笔记(11) 分支简介

    Git笔记(11) 分支简介 1. Git 分支 2. 简介 3. 创建 4. 查看当前分支 5. 切换 6. 分叉 1. Git 分支 使用分支可以把工作 从开发主线上分离 开来,以免影响开发主线 ...

  8. CAN笔记(11) 位时序

    CAN笔记(11) 位时序 1. 位速率 2. 位时序 3. 位的构成 1. 位速率 由 发送单元 在 非同步 的情况下发送的 每秒钟的位数称 为 位速率 可以看看 位速率 与 波特率1 的关系:位速 ...

  9. TensorFlow笔记(11) GoolgeNet

    TensorFlow笔记(11) GoolgeNet 1. Inception块 2. 数据读取 3. 构建模型 4. 训练模型 5. 评估模型 6. 模型预测 1. Inception块 根据 深度 ...

最新文章

  1. 青源 Forum | 人工智能的数理基础前沿系列报告 · 第 5 期
  2. 四路服务器芯片组,四路服务器主板配置
  3. JAVA代码实现多级树结构封装对象
  4. 干货|kafka最佳实践
  5. [pandas]方法总结
  6. miui通知栏要点两下_「MIUI玩机技巧56」小米应用商店 新增 通知栏快捷入口
  7. matlab在同一窗口中画多个三维图像
  8. 重磅!!Gradle 6.6 发布,大幅提升性能!
  9. 深入理解JavaScript (5) —— 闭包
  10. linux编辑复制多行命令,linux下文本编辑器vim的使用,复制-粘贴-替换-行号-撤销-多文件操作...
  11. bootstrap按钮组btn-group
  12. 人工智能对生活有哪些方面影响?
  13. 用计算机投屏图片,手机投屏Windows7电脑图文教程
  14. 电脑桌面图标变白恢复方法
  15. ajax连接服务器获取后台数据
  16. 云服务器密码登录异常的解决办法
  17. 森林防火综合解决方案
  18. NYOJ 495 少年 DXH
  19. python设置文件编码_python修改文件编码为utf-8格式
  20. 【linux】menuconfig详解

热门文章

  1. docker容器cpu高问题排查_干货详解:一文教你如何利用阿里开源工具,排查线上CPU居高问题...
  2. python visual studio pandas_pandas DataFrame索引行列的实现
  3. 带你走进和声搜索算法(Harmony search )的世界!
  4. Ubuntu删除和新建用户
  5. 尤其适合程序员使用的TextMate for Mac
  6. 1978:【18NOIP普及组】标题统计
  7. 适用所有服务器的全站301重定向跳转教程
  8. python列表输入10个数、并排序-我该如何对一百万个数字进行排序,并且仅在Python中打印前十个数字?...
  9. STM32H743+CubeMX-低功耗定时器LPTIM输出PWM波
  10. 移动端 H5 分屏页面适配问题--设计稿比例与设备宽高比例不同