美文网首页
通过socat搭建SSP题目的问题解决

通过socat搭建SSP题目的问题解决

作者: HAPPYers | 来源:发表于2019-12-05 15:13 被阅读0次

参见https://bbs.ichunqiu.com/thread-44069-1-1.html最后一题的分析

首先,SSP利用的是当canary检查失败时候,__stack_chk_fail中打印程序名时可以泄露内存信息。
而如果我们用socat开程序然后即使转发了stderr,远程打进来的时候也获取不到*** stack smashing detected ***...的信息。我们用socat把题目搭建起来,发现脚本失效,io.recv()读不到输出,输出只能在socat所在的服务器端显示

理论上这个信息应该在stderr中输出才对。


显然,我们需要继续挖掘__libc_message (2, "*** %s ***: %s terminated\n",msg, __libc_argv[0] ?: "<unknown>");这行代码。
我们查看__libc_message()这个函数的实现

void
__libc_message (int do_abort, const char *fmt, ...)
{
  va_list ap;
  va_list ap_copy;
  int fd = -1;

.......................//为节省篇幅省略部分无关代码,下同

  /* Open a descriptor for /dev/tty unless the user explicitly
     requests errors on standard error.  */
  const char *on_2 = __secure_getenv ("LIBC_FATAL_STDERR_");
  if (on_2 == NULL || *on_2 == '\0')
    fd = open_not_cancel_2 (_PATH_TTY, O_RDWR | O_NOCTTY | O_NDELAY);

  if (fd == -1)
fd = STDERR_FILENO;

...........................
}

这个函数在运行的时候会去搜索一个叫做LIBC_FATAL_STDERR_的环境变量,如果没有搜索到或者其值为\x00,则把输出的fd设置为TTY,否则才会把fd设置成STDERR_FILENO,即错误输出到stderr。所以我们部署的时候需要给shell设置环境变量


此时我们再用加了参数stderr的命令搭建题目,测试成功。

相关文章

网友评论

      本文标题:通过socat搭建SSP题目的问题解决

      本文链接:https://www.haomeiwen.com/subject/joergctx.html