私は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
私のニーズに合わせて十分速いシェルスクリプトでこれを行う方法があると思います。
netcat出力をスクリプトにパイプしてからnetcatにパイプするにはどうすればよいですか?
netcatの出力を別のスクリプトにパイプしてから、netcatに再度パイプする方法がわかりません。
netcat services.cyberprotection.agency 9999 > out.txt
netcat services.cyberprotection.agency 9999 | somemagic | somehow_back_to_netcat
以下を使って接続しました。
- インターネット猫
- CNC
- リモートログイン
したがって、これらのツールはすべて機能します。
この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