缓冲区溢出攻击实验(三)

本文详细描述了如何利用缓冲区溢出漏洞进行攻击,通过一个存在漏洞的demo程序,解释了攻击过程,包括关闭ASLR以确定栈地址,使用nop滑块和shellcode来控制程序执行流程,最终获取shell。同时,文章讨论了实验中的思考和Linux对缓冲区溢出的保护策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        在缓冲区溢出攻击实验(一)(二)分别介绍了先关知识和shellcode机器码的获得,这一篇就阐述怎么利用别人程序中的缓冲区溢出漏洞实施攻击;

三、缓冲区溢出漏洞攻击

1.一个存在缓冲区溢出漏洞的demo

        下面的一个demo程序使用了strcpy()函数,而这个函数不是安全的,其并不对参数数组的越界进行检查;而且程序接受用户输入,这就成了经典的受攻击案例(velnerable.c);

#include<stdio.h>
#include<string.h>
/*unsigned long get_sp(){
	__asm__("movl %esp,%eax");
}*/
void main(int argc,char*argv[]){
	char buffer[512];
	if(argc>1){
		strcpy(buffer,argv[1]);
		printf("input buffer size:%d\n",strlen(argv[1]));
	}
}

2.怎么攻击上面那个demo

       根据前面的分析,上面的demo程序是存在缓冲区溢出漏洞的,其buffer数组接受用户输入,并且没有对数据的越界做检查,这样,只需要对buffer写入越界的数据,并设计好填充栈返回单元的地址,就可以利用demo获取shell了。还有个问题,也是前面提到的问题,我们shell的机器码数据应该存放在什么地方;当然是受攻击的demo程序中,demo程序中以为可以提供给我们写入数据的就是buffer数组了。好的,那就把机器码写入到demo程序的buffer数组中去。又有一个问题了来了,写入了buffer数组,怎么才能获得我们写入机器码的地址呢?看到《smashing the stack for fun and profit》中说,几乎所有的程序的栈起始地址都是一样的,这样就可以在我们的恶意程序中直接获得demo程序的栈起始地址了。

获取栈起始地址:sp.c

#include<stdio.h>
unsigned long get_sp(void){
	__asm__("movl %esp,%eax");
}

void main(){
	printf("0x%x\n",get_sp());
}
如果真是向上面说的那样,每次运行sp程序得到的结果应该是一样的,即栈的起始地址不会改变;但是,事实不是这样的&
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值