青少年CTF论坛»论坛 CTF Pwn 查看内容

0 评论

0 收藏

分享

关于Pwn出题的缓冲区刷新问题

起因
    今天学妹们在出一道Pwn题目的时候遇到了一些问题,问题大概如下:nc到已经编译好的环境时,返回空白,也能正常链接,但是无内容返回。当输入正确的内容后,一次性返回了内容。
65de2dcc61b85.png
65de2db638b85.png
     代码如下:
65de2defc1d31.png
设想
       学妹想的是,我这里正常的给出了输出,在终端就正常,nc之后就会导致这个问题,为什么会导致这个结果呢,结果大晚上两点多给我打了个电话。

        那我只好大晚上爬起来辅导一下学妹啦。

解决方案
        这个问题的原因,要强调一下程序的缓冲、缓冲区问题。当程序在终端中运行的时候,stdout通常是行缓冲的,这也就意味着每当输出中包含换行符的时候,缓冲区的内容就会发送到终端。但是,当stdout被重定向之后(比如NC时),它通常会变成全缓冲,这也就意味着缓冲区会在满的时候才会被刷新,或者需要显示的调用fflush(stdout)来刷新缓冲区。

        所以,nc连接时发现printf的输出没有立即显示,这是因为stdout的缓冲区还没有被刷新,我们需要在包含scanf之前的代码中添加如下内容:
[C] 纯文本查看 复制代码
fflush(stdout);

        这样就可以正常解决这个问题了, 解决效果如下:
65de2e3404fed.png
结语
        去年打比赛的时候,也有很多pwn出题人因为这个问题导致某些题目的质量、方式方法有些问题,详参如上文章,希望未来CTF环境越来越好!


回复

举报 使用道具

全部回复
暂无回帖,快来参与回复吧
Moxin
管理员
主题 50
回复 29
粉丝 0
快速回复 返回顶部 返回列表