OD: ASLR

ASLR,Address Space Layout Randomization,通过加载程序的时候不再使用固定的基址,从而干扰 shellcode 定位的一种保护机制,包括映像随机化、堆栈随机化、PEB 与 TEB 随机化。ASLR 的实现也需要程序和操作系统的双重支持,但程序的支持不是必须的。

ASLR 在 XP 时代已经提出来了,但 XP 上的 ASLR 功能有限,只是对 PEB 和 TEB 进行简单的随机化处理。直到 Windows Vista 出现之后 ASLR 才真正发挥作用。

支持 ASLR 的程序会在 PE 头中设置 IMAGE_DLL_CHARACTERISTICS_DYNAMIC_BASE 标识。VS 2005 SP1 开始加入了 /dynamicbase 链接选项来支持 ASLR(Project - project Properties - Configuration Properties - Linker - Advanced - Randomized Base Address)。

映像随机化

对程序映像的虚拟地址进行随机处理,这个地址是在系统启动时确定的,重启后会变化。映像随机化可以通过注册表来设置:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management\MoveImages
DWORD: 0        Disabled
DWORD: -1       Force Enabled
DWORD: other    Normal 

映像随机化使得通过的跳板指令无效。但映像随机化只对加载基址的前两个字节做了随机处理,各模块入口点的低位 2 字节不变。

堆栈随机化

堆栈随机化中,其基址是在每次加载程序时确定的。

jmp esp 和 heap spray 的运用使得堆栈随机化对溢出利用的影响有限。

PEB、TEB 随机化

XP SP2 中引入 PEB、TEB 的随机化,在此之前固定基址: PEB:0x7FFDF000,TEB:0x7FFDE000,获取当前 PEB 和 TEB 的参考代码如下:

 1 #include "stdafx.h"
 2
 3 int _tmain(int argc, _TCHAR* argv[])
 4 {
 5     unsigned int teb;
 6     unsigned int peb;
 7     __asm{
 8         mov eax,FS:[0x18]
 9         mov teb,eax
10         mov eax,dword ptr[eax+0x30]
11         mov peb,eax
12     }
13     printf("peb: %#x\nteb: %#x\n",peb,teb);
14     getchar();
15     return 0;
16 }

PEB 和 TEB 随机化效果不是很好,而且溢出利用时还有其它方法获得这两个值。

时间: 2024-10-10 01:49:54

OD: ASLR的相关文章

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

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

linux溢出总结+windows aslr地址随机化绕过

实验一 Linux下缓冲区溢出 通过缓冲区溢出漏洞执行自己的代码 [实验代码] [实验目的] 通过缓冲区溢出,使其执行not_called函数. [实验原理及结果] (1)编译程序(关闭掉栈保护): (2)gdb调试程序 查看vulnerable_function函数汇编代码 我们可以看到该函数开辟了一个0x6c大小的缓冲区 | argument | | return address | | old %ebp> | <= %ebp | 0x6c bytes of | | - | | buffe

[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了