【问题标题】:Understanding Format String Exploits了解格式字符串漏洞
【发布时间】:2014-11-22 15:33:24
【问题描述】:

我正在学习各种漏洞利用,但我无法完全理解 Format String 漏洞利用。我在允许漏洞利用的环境中设置了一个相当简单的程序。

int woah(char *arg){
char buf[200];
snprintf(buf, sizeof buf, arg);
return 0;
}

我能够控制传递给函数的 arg,这将是攻击将如何发生,程序运行我的 shellcode 并给我 root 的最终结果。让程序崩溃很容易,只需输入“%s%s”,它就会出现段错误。我们想做的还不止这些,所以我们给它输入“AAAA%x%x%x%x%x%x%x”之类的东西。查看 gdb 中的程序,我们查看 snprinf 之后的缓冲区,我们可以看到:

"AAAA849541414141353934....blah blah blah"

这很好!我们可以看到堆栈上的 A 以及十六进制 A 的 41。但是接下来会发生什么?我知道这里的一般想法是用四个字节覆盖指令指针,方法是将地址放在我们输入的字符串的开头......然后在我们让它指向我们的 shellcode 的地方。

如何找到要覆盖的 seip/返回地址的地址?

【问题讨论】:

  • 您看到的 A 不在堆栈中。它们正在打印,因为您的格式字符串是这样说的。 41 是... 指向哪个方向的指南?问题是什么?
  • 为清晰起见进行了编辑。我认为这个漏洞利用的下一步是找到指令指针,这样我就可以用指向我缓冲区的地址覆盖它。我如何找到这两个地址?

标签: c string-formatting exploit


【解决方案1】:

当调用 snprintf() 时,会创建一个堆栈帧 - 内存区域 - 以执行它的函数语句。然而,在这发生之前,编译器需要知道函数的前一个调用者——返回点地址。该地址包含在堆栈帧中,因此当堆栈帧展开时,即函数正在完成其工作,它会返回该地址,以便程序可以继续运行。你要做的是用你的 shellcode 地址覆盖这个地址。更多地研究堆栈帧、ESP、EBP、EIP 以获得这个想法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-31
    • 1970-01-01
    • 1970-01-01
    • 2020-10-26
    相关资源
    最近更新 更多