내 명령이 끝날 때이 '&'는 어떻게 스크립트를 그렇게 빨리 만들었습니까?


18

일부 CTF 과제를 온라인으로 해결하는 동안 서버를 무차별 대입해야하는 상황이 발생했습니다. 이것은 내가 쓴 코드입니다.

#!/bin/bash

for i in {0..9}{0..9}{0..9}{0..9} 
    do
    echo "Now trying code.."
    echo $i
    echo "a fixed string" $i | nc localhost *port here* >> /tmp/me/dump.txt
    done

이것은 엄청나게 아 pain습니다 . 나는 1000에서 9999까지의 조합을 시도해야했고 10 회 시도마다 약 5 초가 걸렸습니다. 그런 다음 조언에 따라이 줄의 끝에 '&'를 넣습니다.

   echo "a fixed string" $i | nc localhost *port here* >> /tmp/me/dump.txt &

그리고 몇 초 안에 수백 가지의 조합을 시도했습니다. 나는 매우 놀랐다. 누군가 나에게 논리를 설명해 주시겠습니까? '&'는 무엇을 했습니까?


3
쉘 매뉴얼을 읽는 것이 좋습니다. &명령이 백그라운드에서 실행되도록합니다. 그것은 더 빠르거나 아무것도하지 않았습니다. 사용중인 쉘을 읽으십시오 (bash라고 가정합니다) 매뉴얼.
polemon

백그라운드에서 실행되었으므로 실제로 완료된 것으로 보입니다.
DisplayName

7
1000 이하에서 테스트하고 싶지 않습니까? 이용하십시오for i in {1000..9999}
Walter A

2
포트가 동시에 시간 초과되기 때문에 스크립트 실행 속도가 빨라질 수 있습니다. wait그러나 끝에는 포함시켜야합니다 .
Bratchley

봤어 nc -z localhost 1000-2000?
Walter A

답변:


30

추가 &하면 백그라운드 프로세스가 생성됩니다.

을 쓰면 a; bcommand a를 실행하고 완료 될 때까지 기다렸다가 command b를 차례로 실행 합니다.

를 쓰면 백그라운드 프로세스로 a & b생성 a됩니다. 완료 될 때까지 기다리지 않고 b즉시 실행을 시작 합니다. 한 번에 둘 다 실행됩니다.

셸에서 실험하여 수행하는 작업을 확인할 수 있습니다. X설치 한 경우 xterm어떻게되는지 확인하는 좋은 방법입니다.

$ xterm

다른 터미널 창이 열리고 첫 번째 터미널 창이 닫힐 때까지 기다립니다. 닫을 때만 껍질을 되 찾을 수 있습니다. 입력하면

$ xterm &

그런 다음 백그라운드에서 실행되고 쉘도 즉시 다시 가져오고 xterm창은 열린 상태로 유지됩니다.

그래서 당신이 쓰는 경우

echo "a fixed string" $i | nc localhost *port here* >> /tmp/me/dump.txt

연결하고 문자열을 보내고 파일에 나오는 것을 저장 한 다음 다음으로 이동합니다.

를 추가하면 &기다리지 않습니다. 10 만 개를 동시에 또는 거의 동시에 실행하게됩니다.

스크립트는 실제로 그 시간 안에 완료되지 않았기 때문에 더 빨리 "종료"하는 것 같습니다. 방금 10 만 건의 배경 작업을 한 다음 포 그라운드 작업을 끝냈습니다.

이것은 또한 귀하의 경우 한 번에 만 개 이상의 연결 을 열려고 시도한다는 것을 의미합니다 . 다른 쪽 끝이 처리 할 수있는 내용에 따라 일부는 실패 할 수 있습니다. 그뿐만 아니라 순서대로 실행된다는 보장이 없습니다. 실제로 거의 확실하지 않을 것이므로 실제로 결국 /tmp/me/dump.txt사람의 추측입니다.

출력이 올바른지 확인 했습니까?


2
예, 나는 도전을 해결했다. 올바른 코드가 제공된 경우 서버가 비밀번호로 응답했습니다. 'dump.txt': $ cat dump.txt | sort | uniq -u .. 를 확인하기 위해이 명령을 실행 했으며 올바른 비밀번호가 포함 된 줄이 나에게 공개되었습니다.
learnerX

16
@intellikid : 무례하다는 의미는 아니지만 순전히 운이 좋았습니다. 순서는 중요하지 않았을뿐만 아니라 서버의 응답은 nc의 쓰기 버퍼 보다 작습니다 . 그렇지 않은 경우 서버의 응답이 인터리브되었을 가능성이 높습니다. 즉, 1 바이트의 쓰기 버퍼가 있고 응답이 1111and 2222이면 11221212깔끔하게 분리 된 것이 아니라 비슷한 것을 보았을 것 1111 2222입니다.
marinus

그렇습니다. 그래서 나는이 전쟁 게임을하고 있습니다. 나는 각 수준에서 배웁니다. 그 학습을 도와 주셔서 감사합니다.
learnerX

2

nc (netcat) 명령은 시간이 많이 소요됩니다. 원격 서버에 연결하고 데이터를 보내고 응답을 기다렸다가 반환해야합니다.

&를 사용하면 기본적으로 백그라운드 프로세스에서 해당 명령을 포크합니다 ( "작업"이라고 함). 그 자체로는 더 빨리 실행되지 않습니다. 그러나 이것은 루프가 더 이상 차단되지 않았으며 다음 반복 (다음 nc로)을 이미 수행 할 수 있음을 의미합니다.

따라서 기본적으로 속도 향상은 이전의 연결이 완료되기를 기다려야하는 모든 원격 연결을 병렬로 만들어서 발생합니다.

Btw, 터미널에 따라 echo 명령도 루프 속도를 늦출 수 있습니다 (쓰기 버퍼에 공간이 생길 때까지 기다려야 할 수도 있습니다).

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.