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

实验一 Linux下缓冲区溢出

通过缓冲区溢出漏洞执行自己的代码

【实验代码】

【实验目的】

通过缓冲区溢出,使其执行not_called函数。

【实验原理及结果】

(1)编译程序(关闭掉栈保护):

(2)gdb调试程序

查看vulnerable_function函数汇编代码

我们可以看到该函数开辟了一个0x6c大小的缓冲区

| argument |

| return address |

| old %ebp> | <= %ebp

| 0x6c bytes of |

| … |

| buffer> |

| argument |

| address of buffer> | <= %esp

因此构造的buffer如下所示:

| not_called>的地址 |

| BBBB |

| 0x41414141 … |

| … (0x6c bytes of ‘A’s) |

| … 0x41414141 |

查看not_called函数的地址

因此,如下所示:

我们构造的缓冲区结构如下:

“A”*0x6c + “BBBB” + “\x44\x84\x04\x08”

缓冲区溢出漏洞改进版(1)

【实验代码】

实验代码同上

【实验目的】

第一次实验是通过缓冲区溢出执行自己的其他代码,这次主要是通过缓冲区溢出执行system函数,例如执行system(“/bin/sh”);

【实验原理及结果】

执行system函数,很明显要找到函数system以及字符串”/bin/sh”

(1) 找到system函数,函数地址如下所示:0x8048360

(2) 找到字符串/bin/sh

首先在main函数入口处设断点

找到system的地址

根据system找到字符串”/bin/sh”的地址

(3) 构造buffer

| 0x40197fb8 “/bin/sh” |

| 0x43434343 fake return address> |

| 0x8048360 address of [email protected]> |

| 0x42424242 fake old %ebp> |

| 0x41414141 … |

| … (0x6c bytes of ‘A’s) |

| … 0x41414141 |

【运行结果】

缓冲区溢出漏洞(方法2)—利用pop-pop-return指令

【原理分析】

在这里我们使用pop-pop-return指令来执行代码

栈构造的格式如下:

| address of mov %eax, (%ecx)> |

| value to write> |

| address to write to> |

| address of pop %ecx; pop %eax; ret> |

【实验代码】

【实验目的】

本次试验的目的是先去call add_bin函数然后call add_sh函数,最后call exec_string函数

当我们call add_bin函数时,栈的结构如下:

| argument> |

| return address> |

首先我们要先构造参数0xdeadbeef返回地址是pop;ret。这样的话,函数就会从栈中弹出oxdeadbeef然后返回到下一个地址中。

| 0xdeadbeef |

| address of pop; ret> |

| address of add_bin> |

Add_sh函数需要两个参数,我们使用指令pop;pop;ret

| 0x0badf00d |

| 0xcafebabe |

| address of pop; pop; ret> |

| address of add_sh> |

因此我们总体构造的栈的结构是:

| address of exec_string> |

| 0x0badf00d |

| 0xcafebabe |

| address of pop; pop; ret> |

| address of add_sh> |

| 0xdeadbeef |

| address of pop; ret> |

| address of add_bin> |

| 0x42424242 (fake saved %ebp) |

| 0x41414141 … |

| … (0x6c bytes of ‘A’s) |

| … 0x41414141 |

【实验步骤】

1.查看pop;ret pop;pop;ret 以及三个函数的地址

Pop;ret的地址0x80484b7

Pop;pop;ret的地址为0x80484b6

函数add_bin:0x8048428

函数add_sh的地址0x804846e

函数exec_string的地址为0x8048414

(2)构造shellcode

实验二windows缓冲区溢出绕过ASLR

【原理】

加载程序不再使用固定的基址加载,从而干扰 shellcode 定位的一种保护机制

在 VS 2008 中启用里链接/dynmicbase 链接选项可以开启 ASLR 保护,如图为 vs 中 ASLR 的编 译选项:

ASLR 保护措施:

1. 映像随机化:

在 PE 文件映射到内存中时,对其加载的虚拟地址进行随机化处理,这个地址在系统启动 时确定,系统重启后这个地址会变化。但是虽然模块的加载基址变化了,但是各模块的入口点地址的低两位是不变的,也就是说映像随机化只是对加载基址的前两个字节做了随机处理。两次开机重启之后 PE 文件映射到内存中位置是不同的。

2.堆栈随机化

每个线程的堆栈基址都做了随机化处理,使得程序每次运行变量的地址都不相同。在程序运行时随机的选择堆栈的基址,与映像基址随机化不同的是堆栈的基址不是在程序启动 时候确定的,而是在打开程序的时候确定的,也就是说在同一个程序任意两次运行时的堆栈 基址都是不同的,进而各变量在内存中的位置也是不确定的。这种处理只能防止精准攻击, 但是由于跳板指令的使用使得程序不需要精准跳转,只需要跳到一个大概的位置即可。 如图,第一次运行程序时堆栈的位置如图:

两次运行该代码堆栈情况分别如下:

3.PEB 和 TEB 随机化

编写程序获取当前进程的 TEB 和 PEB,TEB 存放在 FS:0 和 FS:[0x18]处,PEB 放在 TEB

运行了几次,进程的 PEB,TEB 的地址没有什么变化,说明 ASLR 对 PEB(Process Environment Block,进程环境块)和 TEB(Thread Environment Block,线程环境块)的随机化并不好。

【攻击手段】

1.攻击未启用 ASLR 模块

在当前进程里面找到一个使用 ASLR 的模块,利用它里面的指令来做跳板,跳入到

shellcode 里面即可。

2.利用 Heap apray 技术定位内存地址

通过申请大量的内存,占领内存中的 0x0C0C0C0C 的位置,并在这些内存中放置 0x90 和

shellcode,最后控制程序转入 0x C0C0 C0C0 执行,在函数执行返回执行后就会转入我们申请 的内存空间中。

3.利用 Java applet heap spray 技术定位内存空间

4.用.NET 控件禁用 ASLR

5.利用部分覆盖进行定位内存地址 映像随机化只是对映像加载基址的强两个字节做随机化处理,我们可以选择覆盖这个地址的

最后一个字节;此外,ASLR 只是随机化了映像的加载基址,而没有对指令序列进行随机化,

也就是说指令的执行相对于基址的位置是相对不变的。

【利用部分覆盖进行定位内存地址】

3.1 实验环境

操作系统 Windows Vista SP0

DEP 状态 Option

编译器 Visual Studio 2008

优化选项 禁用优化选项

GS 选项 GS 关闭

DEP 选项 /NXCOMPAT.NO

Build 版本 Release 版本

3.2 实验代码

实验思路和代码的简要解释:

(1)为了直观地反映绕过 ASLR 的过程,本次编译的程序不启用 GS

(2)编译程序禁用 DEP

(3)Test 函数中存在典型的溢出漏洞,通过复制超长字符串可以覆盖函数返回地址。

(4)复制结束后,test 函数返回 tt 字符数组的首地址

(5)我们找到跳板指令 call eax,用它地址的后两个字节覆盖返回地址的后两个字节

3.3 实验步骤

(1)先将 she llcode 设置为 2 62 个字节的 0x90,并将 memcpy 函数中的复制长度设置为

262,用 od 加载,找到 call eax 对应的地址的后两个字节

(2)构造 shellcode

构造之后的 shellcode 代码如下:

3.4 运行之后实验结果:

【实验分析】

(1)main 函数,栈中的变化图下图所示:

发现 call eax 的地址的后两位为 141C

(2)Call test 单步进入 test 函数:

在 test 函数中,是一个典型的缓冲区溢出的代码,memcpy 将 26 2 字节的 shellcode 复制到 了栈中,由于栈开辟了 256 个字节的空间,这样的话,就会发生缓冲区溢出,多出来的 6 个字节就会淹没掉 ebp 以及返回地址的最后两个字节,这两个字节里面的内容如下。

很明显函数的返回地址就是 call eax 的地址。

所以在函数返回的时候代码会跳到 call eax 这条指令的地方,由于 eax 中存放的是 shellcode的首地址,这样我们就转到了 shellcode 里面并执行恶意代码,达到目的。

参考资料:

http://codearcana.com/posts/2013/05/28/introduction-to-return-oriented-programming-rop.html

时间: 2024-08-28 13:01:25

linux溢出总结+windows aslr地址随机化绕过的相关文章

linux桌面 远程windows系统

linux桌面远程windows系统 1.安装yum参考地址: http://lk886655.blog.51cto.com/7036409/1965548 2.安装rdesktop #yum install rdesktop 3.在命令行输入下面命令即可 #rdesktop -g 1024x768  -u username  -p password IP 例如:#rdesktop -g 1024x768  -u administrator -p password   192.168.10.11

虚拟Linux系统使用Windows系统oracle数据库

前提:本地oracle数据库能正常使用. 数据库:oracle 11g 虚拟机:VMware_workstation_full_12.5.2 本机系统:Windows 7 旗舰版 虚拟机系统:openSUSE LINUX 网络适配器 VMware Network Adapter VMnet8  的ip地址和虚拟机系统的ip地址在同一网段就可以相互ping通 VMnet8 ip:192.168.14.1 虚拟机ip:192.168.14.131 Windows ip:192.168.1.111 在

rsync (windows 服务端,linux客户端)将windows上的数据同步到linux服务器,反之也可

一:总体概述. 1.windows上面首先装CW_rsync_Server.4.1.0_installer,安装时要输入的用户名密码要记住哦!接下来就是找到rsyncd.conf进入配置细节 2.linux上面只需要装rsync工具即可(yum provides */rsync找到rsync包进行安装即可) 二:细节配置. 1.默认在C:\Program Files (x86)\ICW\下的rsyncd.conf是主配置文件,密码文件一般放在/etc/下rsyncd.secrets 2.rsyn

在linux下连接windows远程桌面

使用rdesktop连接Windows远程桌面 Windows 提供了一种远程桌面系统,可使用户远程登录进行系统管理或作为终端服务器运行各种应用软件.要连接Windows远程桌面,需在Windows客户端安装 相应的软件(tsclient).如果你是Windows服务器管理员肯定使用过该工具,因为远程桌面能大大方便系统管理员远程维护服务器.在Linux 系统中,我们也可通过rdesktop工具连接Windows远程桌面. debian:~# apt-get install rdesktop 使用

Linux主机与windows主机之间如何互传文件

一.概述 本文讲述了在Linux主机与windows主机之间如何互传文件的方法.因为有的时 候,linux主机中的一些文件可能会在windows环境下用到.例如在linux主机中抓了一些图片,想把它们传到windows主机上以作为 word文档的插图.又或者从Windows主机上网,下载了一些linux的软件包,想传到linux主机中安装.在这些情况下,都需要一种方法来进行 两者之间的互通. 本文采用ftp方式来传送文件,软件采用Serv-U.在widows主机下安装Serv-U,使其成为ftp

Windows Server服务器之Linux server与windows server的区别

Linux server与windows server的区别用linux做server,相对于windows server有什么优势? 首先,平均故障时间少,只要配置和使用得当,linux的平均故障(就是需要关机或者重启)的时间为一年多,每年重启维护一次不算过分吧?windows能做到一年只重启一次么?其次,类unix从文件系统起就有严谨的安全机制,最简单的例子,windows下你把任何文件扩展名改为exe就具有可执行权限,linux里需要用chmod加执行位的,没有执行位即使这个文件是可执行的

Linux中挂载Windows里共享目录

将Windows里的F:\sadoc文件夹右键点击设置为共享目录,共享用户为administrator # yum -y install cifs-utils    #安装mount.cifs软件包 # mkdir /windows         #创建挂载目录windows # mount.cifs //10.0.0.1/sadoc /windows/ -o user=administrator,pass=linux  #pass=linux为Windows里administrator用户的

Linux系统远程访问Windows系统

Linux系统远程访问Windows系统 首先在VMWare中打开两台虚拟机,一台为Linux系统虚拟机(名为rh6-1),一台为Windows系统虚拟机(名为Windows 7),用Linux去远程访问Windows,接下来开始实验: 首先用putty去远程连接rh6-1 若此时忘了你所配置的rh6-1的IP地址,则可以在VMWare中打开rh6-1界面,右击鼠标,选择"在终端打开",则会跳到如下界面,然后输入ifconfig,则会显示所有的网卡信息: 登录到putty: 将rh6-

linux远程登录windows服务器

linux远程登录到windows服务器,有两种比较常用的方法.一种是为windows装上一个名为VNC Server的软件,这样linux就可以通过VNC登录到windows服务器了.另一种方法就是借助linux下已有的客户端软件,直接通过RDP协议连接到windows服务器.下面来讲解使用第二种方法使用rdesktop连接windows服务器的方法.第一种方法暂时不做讲解.(1)首先,要远程登录windows服务器,得先确保windows服务器开启了远程登录功能.可以通过"计算机"