wdb2018_guess stack smashing

简介

之前有了解过这个技术,简单记录一下思路,具体分析可以参考wdb2018_guess stack smashing

stack smashing

在程序加了 carry 保护后,如果我们的输入覆盖了 carry ,程序就会报错,而报错代码如下:

void __attribute__ ((noreturn)) __stack_chk_fail (void)
{
  __fortify_fail ("stack smashing detected");
}
void __attribute__ ((noreturn)) internal_function __fortify_fail (const char *msg)
{
  /* The loop is added only to keep gcc happy.  */
  while (1)
    __libc_message (2, "*** %s ***: %s terminated
",
                    msg, __libc_argv[0] ?: "<unknown>");
}

程序会执行 __stack_chk_fail 函数来打印 __libc_argv[0] 指针所指向的字符串,所以我们只要覆盖 __libc_argv[0] 为我们想要泄漏的地址,就能泄露对应的内容。

思路

  1. 首先计算输入与 __libc_argv[0] 的偏移,通过栈溢出覆盖 __libc_argv[0] 为 put_got 地址,这样就能泄露 libc 地址。
  2. 通过 libc 地址计算 enviorn 地址(enviorn 是环境变量表,里面包含栈地址),将 __libc_argv[0] 覆盖为 enviorn 地址即可泄露栈地址。
  3. flag 是存储在栈上,计算 enviorn 与 flag 的偏移,将 __libc_argv[0] 覆盖为 flag 的地址即可泄露 flag 。

内容来源

wdb2018_guess stack smashing
CTF Wiki ROP Tricks

原文地址:https://www.cnblogs.com/luoleqi/p/13488989.html