whctf2017 pwn题wp
今天做题的时候无意做了一道buu上的whctf2017 stackoverflow,做完之后发现另外几道whctf2017的题目也很不错,就打算全做了都学习一下,题目全部在buu上都可以找到
总结
简单总结一下这四道题,它们分别考察了如下的知识点:
第一题考察了scanf函数最终的输入是在内部的count = _IO_SYSREAD(fp, fp->_IO_buf_base, fp->_IO_buf_end - fp->_IO_buf_base);
这行代码,只要能控制这几个字段并且对其他一些字段进行绕过,就可以实现IO的任意地址写
第二题考察了条件竞争漏洞,在多线程的操作中访问同一个全局变量没有加锁,在delete函数中让全局指针被减到了位于got表的位置,从而malloc申请堆块的地址写入了got表里,没有开NX导致堆可执行,从而劫持got表跳转到堆的shellcode上
第三题考察的是snprintf执行中的格式化字符串漏洞,snprintf是一个字符一个字符来处理的,可能是采取了一种循环遍历的方式,所以即使最初调用snprintf的时候format是%s,但后续的操作中format被改变了,然后再取格式化字符的时候触发了漏洞。snprintf拷贝字符的时候可能存在溢出
第四题考察的是未初始化漏洞,在打印之前,没有对操作的指针进行初始化,从而使用了栈里的残留数据,泄露出了canary,配合gets的栈溢出漏洞,ret2libc获取shell