如何使用格式字符串攻击覆盖变量

时间:2015-11-15 09:15:21

标签: c string security printf format-string

我试图使用格式字符串攻击覆盖c程序中的变量。 这是安全课的家庭作业,我不是要求你为我做作业。然而,我正在努力让这个工作,我不明白为什么。此外,我了解到有关于此主题的其他问题,但这些帖子都没有能够帮助我。

我正在研究我教授为我设置的虚拟机。易受攻击的代码是由他构建的,因此我不确定他是如何做到的,操作系统是Linux 3.13.0-65-generic i686,ASLR应该被教授禁用。我们没有收到关于设置环境以允许此攻击成功的任何指示,因为环境是由教授完全设置的。此外,我没有在VM上使用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所做的任何见解都会很棒。

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:-1)

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

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

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

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