0

我正在尝试使用格式字符串攻击覆盖 ac 程序中的变量。这是安全课的家庭作业,我并不是要你为我做作业。但是我正在努力让它发挥作用,我不明白为什么。另外,我知道还有关于这个主题的其他问题,但这些帖子都无法帮助我。

我正在使用我的教授为我设置的虚拟机。易受攻击的代码是由他构建的,所以我不确定他是如何做到的,操作系统是 Linux 3.13.0-65-generic i686,ASLR 应该已被教授禁用。我们没有收到任何有关设置环境以使这次攻击成功的指令,因为环境完全由教授设置。此外,我没有虚拟机上的 sudo 权限来自己做这些事情。

这是我的攻击针对的易受攻击的应用程序的代码:

#include <stdio.h>

#ifndef MAGICNUM
#define MAGICNUM 0x41424344
#endif

int x = 0;

void vuln() {
  int y = 1;
  char buf[128];

  printf("This is vuln() \tx = %08x \ty = %08x\n", x, y);
  printf("Enter your input: ");
  scanf("%127s", buf);
  printf("You entered: ");
  printf(buf);
  printf("\n\n");
  printf("Now x = %08x and y = %08x\n", x, y);

  if(x==MAGICNUM) {
    printf("Success!\n");
    system("/bin/sh");
  }
  else {
    puts("Sorry, try again.");
  }

  return;
}

int main(int argc, char* argv[])
{
  vuln();
  return 0;
}

再一次,我的目标是使用格式字符串攻击覆盖变量 x。家庭作业要我用 MAGICNUM 覆盖它,但现在我只是想给 x 分配任意值。

使用 GDB 我能够发现 x 的地址是0x0804a030.

我知道我需要使用%n格式说明符,这些是我迄今为止尝试过的一些输入字符串示例:

"\x30\xa0\x04\x08%08x.%08x.%08x.%08x%n"
"\x30\xa0\x04\x08%8s%n"
"\x30\xa0\x04\x08%.8%n"

所有这些输入字符串都会触发分段错误,我无法弄清楚它们为什么不起作用。

任何关于我可以做些什么来成功覆盖 x 的见解都会很棒。

4

2 回答 2

0

我认为您需要溢出他分配的缓冲区大小。看变量buf[128]。谷歌关于堆栈缓冲区溢出并尝试确定如果您将超过 127 个字符的参数传递给程序会发生什么。

于 2017-09-26T22:36:52.507 回答
-1

以我的拙见,我认为这是不可能的。

x位于全局地址空间 ( .data) 中,所有其他变量位于堆栈空间中。在缓冲区溢出攻击中,您设法覆盖缓冲区附近的内存。但是这里的缓冲区和变量可能相距数英里。您无法对它们的距离做出任何假设,因此您无法确定要覆盖多少溢出x

此外,没有可能导致溢出的指令或过程调用。scanf很好地屏蔽了最多 127 个字符,并且语句printf打印到标准输出,因此不会导致溢出。

如果您的教授为您提供了一个可以覆盖的解决方案x,我会非常有兴趣听到它。

于 2015-11-15T15:22:25.753 回答