我不是 bash 专家,所以提前抱歉。对于我的高中 CTF 比赛,我必须读取 3 个数字,对它们执行一些算术,然后将值输出回服务器。
在伪代码中这是:
connect to service
receive 17 bytes
parse 3 nums out of bytes
solution = num1 * num2 / num3
send solution
receive secret_message (if fast enough)
然而,在我连接的那一刻,计时器就会启动,然后我有 0.1 秒的时间发送解决方案。
我第一次尝试使用 python 脚本让我很接近:
import socket
from timeit import default_timer
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(("services.cyberprotection.agency", 9999))
t = default_timer()
data = s.recv(17)
print(data)
l = data.split(b"\n")
solution = int(int(l[0]) * int(l[1]) / int(l[2]))
s.sendall(bytes(solution) + b"\n")
t2 = default_timer() - t
print("Too slow by ", round(t2 - 0.1, 4), "seconds")
secret_message = s.recv(128)
print(secret_message)
$ python3 connect.py
b'66044\n50899\n49665\n'
Too slow by 0.0239 seconds
我怀疑有某种方法可以通过 shell 脚本来做到这一点,它的速度足以满足我的需要。
我如何将 netcat 输出传输到脚本,然后返回到 netcat?
我不确定如何将 netcat 的输出通过管道传送到另一个脚本,然后将其传送回 netcat。
netcat services.cyberprotection.agency 9999 > out.txt
netcat services.cyberprotection.agency 9999 | somemagic | somehow_back_to_netcat
我已经使用以下方式连接:
- 网猫
- 数控
- 远程登录
所以这些工具中的任何一个都可以工作。
这个 SE 链接似乎很有用,但我如何将其返回?如何将从 netcat 接收到的数据作为参数传递给另一个脚本?
exec 3<>/dev/tcp/services.cyberprotection.agency/9999
start=`date +%s.%N`
out="$(head -3 <&3)"
out2="$out"
array=($out2)
var=$((array[0]*array[1]/array[2]))
echo $var >&3
end=`date +%s.%N`
slowtime=$( echo "$end - $start - 0.1" | bc -l )
echo "$slowtime too slow"
是答案,但是还是太慢了。
答案1
事实证明,限制因素是我的互联网,而不是计算机。
exec 3<>/dev/tcp/services.cyberprotection.agency/9999
out="$(head -3 <&3)"
out2="$out"
array=($out2)
var=$((array[0]*array[1]/array[2]))
echo $var >&3
# Now get secret message
cat <&3