第一、准备环节-增加内核调试辅助语句:
首先,为了更好的查看关键因素的变化:稍微做了两处修改:
第一处:splice前后,增加getchar和puts;
第二处:prepare
pipe过程中,增加getchar和puts;
修改后代码执行结果如下:
下面内容重点关注程序运行启动之后,该漏洞利用的两个关键要素:prepare_pipe函数、splice函数的内核态分析,此外对只读的suid文件的写入进行分析。
第二、关键因素-prepare_pipe函数的内核调试
这里的prepare_pipe函数有两个环节:第一个环节是write循环,第二个环节是read循环。
在第一个环节中,当程序执行到prepare_pipe函数中write循环,这里的内核态重点是关注flag信息,此时执行状态如下:
对应的内核态执行内容:
一步一步的调试,查看flags数值变化:
结合如下的代码