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번 반복되어야 합니다.

무엇을 해야 하는지는 알 것 같은데, 유닉스에서 코딩하는 방법을 모르겠습니다. .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 클라이언트가 될 수 있습니다. 예를 들어, 다음은 서버에서 행을 읽고 이를 하나씩 에코하는 스크립트입니다.

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

16진수 문자열을 디코딩하려면 를 찾아 xxd데이터 처리 논리를 알아보세요.

관련 정보