nx中的提升命令如何理解:NX机制以及绕过策略
nx中的提升命令如何理解:NX机制以及绕过策略知道目前位置,漏洞程序已经准备完成,我们先了解一下ret2libc。这是一个控制程序流执行libc中的函数的方法。通常是将栈中的返回地址覆盖为指向libc当中的函数地址。这样的话,我们就可以在libc当中去执行Shellcode。常见我们选择的函数是system(“/bin/sh”)。下面我们进行构造一下布局。编译完成之后,产生了pwnme文件,我们执行发现程序可以正常执行。如下图:如附件如下图:首先我们来看一下源码,该代码中我们可以发现,主函数main当中调用了一个自定义函数vul。该函数的作用是将接收到的值放入大小为64的数组当中。那么我们发现,在主函数main当中传入的值定然是大于64。这种情况一定会产生溢出漏洞。接下来,我们使用如下编译方式,将源码编译成可执行文件。如下图:
NX机制以及绕过策略一;什么是NX机制NX机制可以使数据区域,堆栈区,堆段等区域不可执行,代码段不可以写入。
二;绕过策略因为NX机制的存在,所以如果我们在不可执行的内存位置插入Shellcode依旧是没有办法执行的,那么如果一个不可执行的内存区域出现一个溢出漏洞,我们就没有办法利用了嘛?其实也不尽然。接下来我们就介绍一下ret2libc方法绕过这个问题。
2.1;测试环境操作系统:
GCC版本:
如附件
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字
首先计算出函数的基址:
接下来找到偏移地址,这里我们使用IDA工具。打开libc.so.6文件。
那么在内存中system函数的地址为:0xf7dc4000 00045830
那么,接下来,system参数的地址:0xf7dc4000 00192352。
执行Shellcode。可以成功执行命令