前言
记录一下自己在做pwn的过程当中学到的一些东西,以前不知道的东西等等,碰到的坑也会记录在
这里,主要目的是帮助自己记录一下经验。
其实每一道题基本上能学到的新东西是有限的,记录下来避免什么时候想不起来。
顺序比较乱,基本上根据我做题的顺序定的,比较随意。
pwn
other place(not from ctf)
- 多用gdb调试,有思路可以先写出来调试一下看看效果再说
- 遇见pie考虑写malloc_hook,free_hook等,这些与malloc_state相关,也就是需要main_arena
- smallbin, largebin等非fastbin在链表为空时指向自己,也就是指向main_arena中,可以用来泄漏main_arena,从而得到libc
hitcon-2016
babyheap
- ubuntu 16.04后scanf的缓冲区会使用heap,超过大小的就会放入heap,接下来的scanf会从刚才
heap中的缓冲区取 - 使用read而不是readline的时候很容易因为读取的内容不够(比如最多本来可以读100个,但是我这边
只发了20个字节的时候)导致后面的内容被接上去,也就是两次send在远程只进行了一次read,而本来
想要的是两次read。方法是通过sleep或者raw_input使得不连起来发,隔开就可以了。 - 漏洞也可能位于输入输出函数
ichunqiu427-2017
smallest
- 使用srop可以用来更改寄存器的值,从而使得能够控制更多寄存器的值
- 环境变量位于栈顶,其中的字符串也位于栈中,可以用来获取大致的栈位置(比如需要可写地址的时候)
awd-pwn2
- awd先补再写exp
bctf-2017
boj
- system函数的参数如果可控,可以通过构造文件名来进行命令注入
babyuse
- choice等输入可能位于栈上,atoi的时候只需要使用空格隔开,可以通过后面的内容控制参数
njctf
vegas
- c语言的rand函数是可以预测的,只要和远程时间相同,1秒内同时开始rand的内容是一样的
0ctf-2017
EasiestPrintf
- IO结构体(stdin, stdout, stderr)在程序关闭的时候会调用一些奇怪的函数,虽然不知道是哪个,但是反正可以试出来。。
那么就是可以通过修改IO结构体的虚表,来控制执行流,可以作为能拿到那三个特殊IO结构体位置
的时候,面对PIE的时候的特殊方案。