一
如果遇到这样的报错,不是因为你libc的库不全,而是你的payload有问题,可以print(io.recv())看看。
二
read函数并不会自动在字符串末尾添加'\x00',而puts和printf函数只有遇到'\x00'才会停止打印。你可以输入足够长的字符串来泄露canary或一些关键信息。
三
当没有思路的时候,可以关注汇编代码,可能把一些关键地址存入了寄存器中。
四,整数溢出解释
当初认为整数溢出只是一个很小的点,并没有在意,最近做到几道相关的题,记录一下。
此表来自ctfwiki,可知short类型占用2字节,int占用4字节,long占用8字节。并且分为unsigned与signed。在计算底层,整数和负数都是使用二进制补码的方式表示。
例如-1,以short类型为例,首先找到1的二进制是 0000 0000 0000 0001,然后取反,变为:
1111 1111 1111 1110,最后加1,就是 1111 1111 1111 1111,十六进制表示为0xffff。
在某些题中,会将unsigned类型与signed类型直接转换,造成漏洞,例如:
nbytes输入的时候为int类型,只用输入-1就可过掉第一个判断。read函数中直接转化为unsigned类型,nbytes就会直接变为一个极大的值。
综上,二字节signed类型就记住0x7fff是最大整数,0xffff是-1,0x8000是最大整数加1乘-1,其余字节类型也这么记就好了。
在short,int,long直接转化肯定也存在截断问题,等遇到了再记录。
其他记录
UFA的理解
将0x90的chunk free之后会被放入unsortedbin中,此时它的fd指针为unsortedbin头地址,这时候show,可以获得此地址,然后推算出libc的基址。用于劫持malloc_hook。
或者可以在特殊位置写入特殊数据。