文件信息
样本来自2016年Seccon ctf的一道pwn题–cheer_msg,同时这道题目也给了libc文件,减少了漏洞利用难度。
检查样本信息:
32位小端程序,开启了栈溢出保护和NX保护。
漏洞定位
整个程序还是比较易懂的,主体逻辑存在于main和message两个函数。上图展示了main函数的伪C代码,要求输入一个长度,然后按照长度进行相应计算后使用alloca在栈上分配空间。这道题目比价新颖的是使用了alloca函数,该函数不同于一般的堆内存分配函数,它会将内存分配到栈中,因此该内存分配函数在实际编程中用的比较少。
接着,我们看一下message函数,伪C代码截图如上,第一个getnline调用将n个字节存入到a1变量所在的地址中,该变量即是main中的v7变量,这里考虑到n是我们输入的值,所以猜想这里可能存在栈溢出。然后接着往下看,第二个getnline调用将64字节存到v3中,随后打印了v3和a1内存位置的值,初步分析这里由于读取限制了长度且栈上空间足够大,所以没有明显的溢出漏洞。