netcatから出力を取得してデコードし、出力を返します。

netcatから出力を取得してデコードし、出力を返します。

netcatから出力を取得し、デコードして返す必要があります。

入力後:

nc cs2107.spro.ink 9000

私が得た結果は次のとおりです。

Welcome to the Proof of work challenge!  
Rules: i will provide hex encoded byte strings to you.  
Your task is to decode it and calculate the md5 hash in hex encoded format and return it back to me. You will need to do this 500 times!

Ready? Go!

cdde140fffda1da2bc3f

MD5:

したがって、16進数でエンコードされた文字列を取得してデコードしてから再度出力する必要があります。これを500回繰り返す必要があります。

何をすべきかはわかりますが、Unixでコーディングする方法がわかりません。 .shファイルが必要だと思いますか?しかし、よくわかりません。

  1. nc cs2107.spro.ink 9000から開始

  2. NC出力で16進文字列を検索する

  3. md5ハッシュ値のデコードと計算

  4. 最後に送ってください。

編集する:

私は次のようにしてncの出力を保存できることを知っています。

nc cs2107.spro.ink 9000 > somefile.txt  

それでは、16進文字列を具体的に検索するにはどうすればよいですか?
16進文字列をどのようにデコードしますか?
最後に、結果を端末に返す方法は?

edit2: したがって、Python を使用してこれを行うことができます。いくつかのヒントは、サブプロセスモジュールまたはソケットモジュールを使用することです。読んでいるときに子プロセスとして試してください。

subprocess.Popen

バックグラウンドでのコマンド実行の維持

現在、この問題で悩んでいます。

import subprocess
p = subprocess.Popen('nc cs2107.spro.ink 9000', shell = True, stdin = subprocess.PIPE, stdout = subprocess.PIPE)
a = subprocess.Popen('grep ^[0-9a-f] | xxd -r | md5sum | awk "{print $1}" ', stdin = p.stdout, stdout = subprocess.PIPE)

これで a を p に戻そうとすると、詰まっています。

答え1

これは部分的な解決策です。 netcatスクリプトの入力が発生して残念です。

  1. それでは、16進文字列を具体的に検索するにはどうすればよいですか?

簡単な方法は次のとおりです。

$nc -d cs2107.spro.ink 9000 > file

Welcome to the Proof of Work Challenge.
Rules: I will provide hex encoded byte strings to you.
Your task is to decode it and calculate the md5 hash.
Return the md5 hash in hex encoded format back to me.
You will need to do this 500 times.
Ready? Go!
eeb105fb2f5e24216bd2
MD5:

ここでは最初にsed特定の行#7を選択するコマンドがありますが、最初の16進数でエンコードされたバイト文字列を解決した直後に、次の出力が表示されます。だから私は16進文字に一致する正規表現に変更しました。

$cat file.txt | grep '^[a-f0-9]'

eeb105fb2f5e24216bd2
  1. 16進文字列をどのようにデコードしますか?

$cat file.txt | grep '^[a-f0-9]' | xxd -r -p | md5

92b34e4055a92b9ec32b15f89cc22389

そのため、手動で実行できる確認を受けました。

Welcome to the Proof of Work Challenge.
Rules: I will provide hex encoded byte strings to you.
Your task is to decode it and calculate the md5 hash.
Return the md5 hash in hex encoded format back to me.
You will need to do this 500 times.
Ready? Go!
eeb105fb2f5e24216bd2
MD5: 92b34e4055a92b9ec32b15f89cc22389
Correct.
9ecbc2b8d14ae903dce5
  1. 最後に、結果を端末に返す方法は?

最後の質問は本当に最大の質問です。私はそれを動作させることはできません。複数のスクリプトを作成しましたが、問題は解決されませんでした。次の質問ザイルズ言及されているのは、データを読み取ってまだ開いているプログラムにフィードバックするのに十分な長さの接続を開いておく必要があるということです。これは、上記のように、シェルでパイプされたコマンドを使用する一般的な方法を妨げます。

シェルスクリプトからすぐに取得できなかった擬似コードは次のとおりです。

  1. forループは500回繰り返されます。働く
  2. cs2107.spro.ink 9000への接続を開いておきます。進行中です。
  3. サーバーから送信されたビットを読み取ります。働く
  4. 16進文字列をデコードします。働く
  5. md5 ハッシュ値を計算します。働く
  6. 接続を開くには入力を送信します。進行中。
  7. 手順3〜6を繰り返します。
  8. 終わり。

私が試したいくつかのリソースは次のとおりです。

  1. 入力/出力名前付きパイプを使用したTCP接続
  2. https://serverfault.com/questions/188936/writing-to-stdin-of-Background-process/297095#297095
  3. https://stackoverflow.com/questions/21130757/send-commands-to-socket-using-netcat
  4. https://superuser.com/questions/261900/how-can-i-pipe-commands-to-a-netcat-that-will-stay-alive
  5. https://stackoverflow.com/questions/2559076/how-do-i-redirect-output-to-a-variable-in-this-shell-function
  6. http://www.linuxquestions.org/questions/programming-9/dynamically-supply-input-to-netcat-in-a-script-793526/

解決策を見つけたら、解決策を知りたいです。後でもう一度やりましょう。

答え2

そうですね。サーバーと通信するにはソケットプログラミングが必要です。以前はPythonを使ったことがありましたが、最終的には既存のBashスクリプトを使用するようになりました。

まず、ここのチュートリアルに沿ってBashを使用してソケットを初期化する方法を学ぶことができます。http://hacktux.com/bash/socket

ステップ1:ソケットの初期化

execBashとUnixのリダイレクトを利用して、擬似<>パスにソケットを作成できます。パスの構文は次のとおりです。/dev/<protocol>/<host>/<port>

exec 3<>/dev/tcp/cs2107.spro.ink/9000;

ステップ2:サーバー出力を読む

サーバーの出力からエンコードされたバイトを読み取る必要があります。これはcommandを介して実行できますが、cat期待どおりに機能しません。これは、サーバーがクライアントからの入力を待っていてEOF文字がないためです。 (ストリーミングデータに関連しているようです。)これを防ぐために、サーバーの出力以上を読み取らないでください。つまり、7行目で停止する必要があります。

head -7 <&3

ステップ3:データのキャプチャと変換

egrep -o '^[0-9a-f]{20}' | xxd -r -p | md5sum

情報の塊を読み取った後、egrepを使用して16進バイトを検索できます。 hexdumpの長さは固定されているため、正規表現を使用して必要なデータを抽出できます。

xxd -r -phexdumpをバイナリにパイプしてプレーンテキストで出力します。md5sumその後、いくつかの汚れた作業を行い、私たちのために答えを計算します。

ステップ4:サーバーに書き換える

awk '{print $1}' >&3;

私の場合、md5sumは文字列の末尾に答えと追加の文字を出力するので、md5sumを使用してawk最初の列を印刷してサーバーに書き換えます。

ステップ5:499回以上繰り返す

サーバーは長い紹介テキストの代わりに後続の応答で「正しい」だけを出力するため、手順2を変更する必要があることを除いて、手順2〜4と同様です。head2行を読むように修正されました。私たちはこれを499回以上しなければなりません。

for i in {1..499}
do
    head -2 <&3 | egrep -o '^[0-9a-f]{20}' | xxd -r -p | md5sum | awk '{print $1}' >&3;
done

ステップ5:旗を奪う

500のすべての応答が完了したら、ソケットをキャプチャしてフラグを検索できます。

cat <&3

P / SIはOPと同じモジュールを使用して同じことをするので、ここで答えを共有する必要があると思いました。モジュールを終了し、偶然にこの記事を見つけました。

答え3

単にパイプを使用してください:

...
process_rcvd_msg() {
   while IFS= read -r msg && [[ -n $msg ]]; do
       ... do whatever you want with the message ...
       echo "Received: $msg"
   done
}

... more code ...
# Start listening to TCP requests and processing them
nc -k -vv -l 1234 | process_rcvd_msg
... few more code here ...

サーバーにデータを送信する方がはるかに簡単です。

...
send_msg() {
    local host="$1" ; shift
    local port="$1" ; shift
    local params="$*"

    exec 9<>/dev/tcp/$host/$port
    printf "%s" "$params" >&9
    exec 9<&-
}
... do something here ...
# Send the message to the server
send_msg localhost 1234 "Dumb message is here!!! Let's see what happens..."
... do year another thing ...

お役に立てば幸いです。乾杯!

答え4

呼び出しシェルを使用してこれを行うには、接続をnc開いたままにして接続からデータを取得ncし、そのデータを処理して同じインスタンスに再供給する必要があるため、困難ですnc。できますが難しいです。

同じ言語を使用してネットワークと対話してデータフローを制御できる場合は、はるかに簡単です。 bash、ksh、kshのいずれかのシェルを使用している場合は、対応するネットワーク機能を使用できます。これらのシェルはTCPクライアントにすることができます。たとえば、以下はサーバーから行を読み取り、それを1つずつエコーするスクリプトです。

{
  while IFS= read -r line <&3; do
    echo "$line" >&3
  done
} 3<>/dev/tcp/cs2107.spro.ink/9000

16進文字列をデコードするには、検索してxxdデータ処理ロジックを見つけます。

関連情報