Skip to content

Game

本题主要考查 pwntools 库中 recvsend 的使用

解法一

在 5 秒时间内,只能输入小于等于 10 的数,使这些数字相加大于 999.

所以手动输入就不可能了(当然也可以搞个宏什么的?)。

写 Python 脚本即可。

python
from pwn import *

p = remote("ip", port)
for i in range(112):
    p.sendlineafter(b': ', b'9')

p.interactive()

解法二

另一种解法,可以利用 scanf 函数的 %d 格式解析特性。

scanf 在解析 %d 遇到非数字的时候,会停止解析,但不会抛出异常,会直接返回目前的结果。

比如下面这个语句:

c
scanf("%d", &value);

假设 value 原本是 10,如果输入 1a,那么会解析到 1 的输入,而忽略后面的a,这时候 value 会被变成 1.

如果不输入数字,直接输入 a,这时候,scanf 什么数字也解析不到,也就无法对 value 做修改。是的,这时候 value 的值没有变!并且由于这个解析的异常,会导致输入缓冲区无法被刷新,也就是说下一次调用的时候,下一个 scanf 会从 a 开始解析

这么一想,那么我只需要输入寥寥几个字符,比如: 10a,第一次调用 scanf 会解析出 10,并且给结果加上 10. 后面每次循环,scanf 会从剩下的 a 的位置进行解析,但是由于不是数字会被忽略,所以这个多出来的 a 就一直在!并且 value 的值没有变,保留上一次的 10. 因此,scanf 永远无法跳过这个 a 字符,最终就导致一直加 10,知道结果大于 999.