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

起因

  今天学妹们在出一道Pwn题目的时候遇到了一些问题,问题大概如下:nc到已经编译好的环境时,返回空白,也能正常链接,但是无内容返回。当输入正确的内容后,一次性返回了内容。

        代码如下:

设想

        学妹想的是,我这里正常的给出了输出,在终端就正常,nc之后就会导致这个问题,为什么会导致这个结果呢,结果大晚上两点多给我打了个电话。

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

解决方案

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

        所以,nc连接时发现printf的输出没有立即显示,这是因为stdout的缓冲区还没有被刷新,我们需要在包含scanf之前的代码中添加如下内容:

fflush(stdout);

        这样就可以正常解决这个问题了, 解决效果如下:

结语

        去年打比赛的时候,也有很多pwn出题人因为这个问题导致某些题目的质量、方式方法有些问题,详参如上文章,希望未来CTF环境越来越好!

  • 9
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值