zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    进程和线程
    分治算法
    MySQL-IN和Exists区别
    Java-悲观锁和乐观锁
    Spring如何解析Dubbo标签
    Java平台标准版本
    java常用的框架
    状态码
    算法
    java.c++.c#.c的区别
  • 原文地址:https://www.cnblogs.com/luoleqi/p/13488989.html
Copyright © 2011-2022 走看看