介绍
闲着无聊,换了新博客,写点东西。还是MCTF的一道pwn题,和之前网鼎杯那道GUESS基本一样。
分析程序
逻辑和漏洞都很简单,fork四次,每次都有一个gets的任意长度读。其中flag已经读到了stack上。
漏洞利用
保护如下,有Canary,所以栈溢出就没啥办法了。
1 | Arch: amd64-64-little |
利用之前学到的一个技巧,恶意触发Canary的保护,在___stack_chk_fail()
函数中,就会执行到__libc_message (2, "*** %s ***: %s terminated\n", msg, __libc_argv[0] ?: "<unknown>")
,我们只需要覆盖了argv[0]就可以得到一个任意地址的读了。
首先,利用got表,leak libc的地址。
其次,libc上有一个environ变量,保存着栈上的一个地址,也就leak了stack的地址。
最后,gdb看一下flag的offset,直接leak出来就可以了。
脚本
1 | #!/usr/bin/env python2 |
参考资料:
Canary: http://veritas501.space/2017/04/28/%E8%AE%BAcanary%E7%9A%84%E5%87%A0%E7%A7%8D%E7%8E%A9%E6%B3%95/
environ: https://github.com/Naetw/CTF-pwn-tips#leak-stack-address