NX机制以及绕过策略

独行   ·   发表于 2020-12-29 13:20:58   ·   技术文章投稿区

NX机制以及绕过策略

一;什么是NX机制

NX机制可以使数据区域,堆栈区,堆段等区域不可执行,代码段不可以写入。

二;绕过策略

因为NX机制的存在,所以如果我们在不可执行的内存位置插入Shellcode依旧是没有办法执行的,那么如果一个不可执行的内存区域出现一个溢出漏洞,我们就没有办法利用了嘛?其实也不尽然。接下来我们就介绍一下ret2libc方法绕过这个问题。

2.1;测试环境

操作系统:

GCC版本:

2.2;测试软件

如附件

2.3;演示

如下图:首先我们来看一下源码,该代码中我们可以发现,主函数main当中调用了一个自定义函数vul。该函数的作用是将接收到的值放入大小为64的数组当中。那么我们发现,在主函数main当中传入的值定然是大于64。这种情况一定会产生溢出漏洞。

接下来,我们使用如下编译方式,将源码编译成可执行文件。如下图:

编译完成之后,产生了pwnme文件,我们执行发现程序可以正常执行。如下图:

知道目前位置,漏洞程序已经准备完成,我们先了解一下ret2libc。这是一个控制程序流执行libc中的函数的方法。通常是将栈中的返回地址覆盖为指向libc当中的函数地址。这样的话,我们就可以在libc当中去执行Shellcode。常见我们选择的函数是system(“/bin/sh”)。下面我们进行构造一下布局。

注意:为了测试方便,这里我关闭了系统的ASLR功能。详细如下图:

下面我们来构造一下栈中结构:我们利用vul的溢出漏洞将原本的返回地址覆盖为system()函数的地址,那么紧接着下面0xdeadbeef就是函数system()的返回地址,libc_/bin/sh_addr就是函数system()的参数。

下面,我们已经知道了该怎么操作了。那么我就确认一下几点,第一:我们需要知道输入多少数据产生溢出。第二:我们需要知道system函数的地址。第三:我们需要知道system函数参数的地址。

2.3.1;确定产生溢出数据大小

我们要知道放入多少数据会产生溢出,我们需要将数据填充到栈中的返回地址。那么我们就需要查看一下栈空间了。下面我们使用gdb来分析一下:
调试pwnme程序。如下图:

在函数vul位置下断点

打开汇编窗口:

执行程序:

单步执行至strcpy处。指令ni
我们首先查看到push edx。它是函数strcpy的保存buffer的起始地址。

查看edx寄存器的值:

接下来,我们单步执行到ret指令位置。得到函数的结束地址。这个时候我们只需要查看寄存器ESP当中的值,即可确定当前ret的地址了。

计算填充数据:填充数据 = 0xffffd3fc – 0xffffd3b0 = 0x4c = 76字

2.3.2;计算system的地址

首先计算出函数的基址:

接下来找到偏移地址,这里我们使用IDA工具。打开libc.so.6文件。

那么在内存中system函数的地址为:0xf7dc4000 + 00045830

2.3.3;计算system参数的地址


那么,接下来,system参数的地址:0xf7dc4000 + 00192352。

2.4;构造ShellCode

2.5;验证

执行Shellcode。可以成功执行命令

用户名金币积分时间理由
veek 60.00 0 2020-12-30 10:10:22 感谢分享~

打赏我,让我更有动力~

Attachment List

pwnme.zip   File Size:0.004M (Download Count:0)

0 Reply   |  Until 2020-12-29 | 395 View
LoginCan Publish Content
返回顶部 投诉反馈

© 2016 - 2022 掌控者 All Rights Reserved.