实例分析
源程序
链接:https://pan.baidu.com/s/1ovTSgXf5sGBsNMEUiIQ5JA 密码:zt4k
一、IDA分析
分析过程
首先关注mian函数可以看到程序流程
设置定时器
打印输出Welcometo RCTF\n
清空_bss_start数据流
读取用户输入到buff(1024字节)中去
调用echo函数,参数为buff
然后看子函数echo流程如下
将用户输入的buff逐字节地拷贝到s2(16字节)中,如果遇到\x00截断
于是我们找到了漏洞所在处
我们要做的工作就是覆盖返回地址并且构造rop链。
程序逻辑
整个程序逻辑是这样的,main函数中,用户可以输入1024个字节,并通过echo函数将输入复制到自身栈空间,但该栈空间很小,这使得栈溢出成为可能。由于复制过程中,以“\x00”作为字符串终止符,故如果我们的payload中存在这个字符,则不会复制成功;但实际情况是,因为要用到上面提到的通用gadget来为write函数传参,我们会在payload里面指定gadget的地址,而64位的地址中肯定含0x00,故肯定会在payload中包含“\x00”字符。
但是由于echo函数的栈空间很小,与main函数栈中的输入字符串之间只间隔32字节(64位下:16字节s2+8字节rbp+8字节ret_addr)。下面是调用echo函数但是还没有进