今天做题的时候无意做了一道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

阅读全文 »

总结:

1、这道题md5加密这个点,其实蛮重要的,个人感觉想判断出来的话,只能是靠经验的积累。下回只要遇见了这种奇奇怪怪的函数,还给了类似于密文这种东西,就去考虑加密。

2、能够输入的字节很少的时候,执行某个函数,可以尝试写call的这个地址,这样即可以执行函数,又可以控制执行流(只要我们可以把控好选取的call地址即可)

3、后期调试的话,多按自己的思路思考(不要被网上其他师傅写的wp所局限了)。

阅读全文 »

gdb 是一款 linux 下常用的程序调试器,有时可能我们会根据自己的需求来尝试写一些自定义的 gdb 命令,而通过 python 语言来编写的话,是再好不过了,下面记录一下如何用 python 语言编写自己的 gdb 命令

阅读全文 »

总结:

通过这道题的学习与收获有:

1、第一次尝试用爆破的方式来对抗PIE保护

2、重新温习了下猜数游戏这种类型的题目(思路就是想办法覆盖种子,自己跑个脚本)

3、%s顺带打印出来canary并且泄露栈中数据(权当复习了)

4、做题没思路的时候,就先写个半成品脚本,动态调试一下,总能得到一些有用的信息。

5、格式化字符串这道题考察了一个payload里面,同时写和同时读。

阅读全文 »