基于BSS的缓冲区溢出

时间:2018-12-04 11:40:06

标签: c buffer-overflow

希望某人可以帮助我了解我正在大学学习的漏洞。

在c代码中,有一个未绑定的strcat

strcat(buffer, argv[1]);

目的是使此缓冲区溢出到保存的EIP中,并使其显示“魔术”字符串,该字符串在以下功能中调用。

if (geteuid() == 0) {

     printf("%s\n", magic);

} else {

     printf("Forget it. You do not have access to the magic string.\n");
     return (-1);
}

从缓冲区到保存的EIP的区别是52个字节,我的想法是使缓冲区溢出printf函数的地址,该函数将显示魔术字符串,但无法使其正常工作,但我却不断遇到内存地址存在段错误的情况与我输入的内容不同。

任何帮助都将不胜感激。

编辑:下面的完整代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>

enum { SIZE = 40 };

/* The magic string */
char *magic = "This is the magic string";

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

  if (argc != 2) {
    printf("Usage: %s name\n", argv[0]);
    return (-1);
  }

  snprintf(buffer, sizeof (buffer), "%s", "Hello ");

  strcat(buffer, argv[1]);

  printf("%s\n", buffer);

  if (geteuid() == 0) {

    printf("%s\n", magic);

  } else {

    printf("Access Denied \n");
    return (-1);

  }

  return (0);
}

1 个答案:

答案 0 :(得分:0)

有关不同术语的解释和示例,请参见this

查看您的代码:

  • magic存储在.data中。它指向存储在.rodata / .text或类似名称中的字符串文字。
  • buffer存储在.stack中。
  • geteuid()的结果存储在某个临时位置,CPU寄存器或堆栈中。

因此,这没有任何意义。最值得注意的是,程序中的任何地方都没有.bss分配,除了库函数内部的某些内部。我猜想有人对这个程序有一个迷惑的想法,那就是假设该程序可以用geteuid()附加的空终止符来覆盖strcat()的结果……但这也没有任何意义。