跟随教程https://sploitfun.wordpress.com/2015/

此次实验参考https://sploitfun.wordpress.com/2015/05/08/bypassing-nx-bit-using-return-to-libc/

又看到一个好的博客,也是栈溢出系列:https://www.ret2rop.com/2018/08/return-to-libc.html

NX保护机制

​ NX保护机制原则为可写与可执行互斥,这就导致我们之前在栈上的shellcode不可以被执行,因此我们采用return2libc进行攻击

实验环境

​ Ubuntu12.04

漏洞代码:

 //vuln.c
#include <stdio.h>
#include <string.h>int main(int argc, char* argv[]) {char buf[256]; /* [1] */ strcpy(buf,argv[1]); /* [2] */printf("%s\n",buf); /* [3] */fflush(stdout);  /* [4] */return 0;
}

较于之前的漏洞代码,增加了fflush函数的调用,主要是为了向我们提供sh字符串。

编译命令

#echo 0 > /proc/sys/kernel/randomize_va_space
$gcc -g -fno-stack-protector -o vuln vuln.c

去除了-z execstack这一编译命令,表示开启NX保护机制。

我们可以用一下命令来查看栈上代码是否可执行

$ readelf -l vuln
...
Program Headers:Type      Offset   VirtAddr   PhysAddr   FileSiz MemSiz  Flg AlignPHDR      0x000034 0x08048034 0x08048034 0x00120 0x00120 R E 0x4INTERP    0x000154 0x08048154 0x08048154 0x00013 0x00013 R 0x1[Requesting program interpreter: /lib/ld-linux.so.2]LOAD      0x000000 0x08048000 0x08048000 0x00678 0x00678 R E 0x1000LOAD      0x000f14 0x08049f14 0x08049f14 0x00108 0x00118 RW 0x1000DYNAMIC   0x000f28 0x08049f28 0x08049f28 0x000c8 0x000c8 RW 0x4NOTE      0x000168 0x08048168 0x08048168 0x00044 0x00044 R 0x4...GNU_STACK 0x000000 0x00000000 0x00000000 0x00000 0x00000 RW 0x4GNU_RELRO 0x000f14 0x08049f14 0x08049f14 0x000ec 0x000ec R 0x1
$

可以看到GNU_STACK权限字段没有X(X表示可执行)。如果安装了gdb peda插件,我们可以用checksec命令查看该代码的保护机制:

Return2Libc思想

​ 为了绕过NX保护机制,我们此次采用Return2Libc技术,主要思想就是之前的return address改成我们shellcode的起始地址,但那个是属于栈地址,现在我们找一个可执行的函数,把他的地址放在return address那里,如果需要的话,再给他传个参数,通常这个函数我们用libc里面的函数,如system、execv等,此次我们通过调用system(’/bin/sh’)函数来获取shell权限。

​ 本次攻击需要以下三步: