일부 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 &
그리고 몇 초 안에 수백 가지의 조합을 시도했습니다. 나는 매우 놀랐다. 누군가 나에게 논리를 설명해 주시겠습니까? ‘&’는 무엇을 했습니까?
답변
추가 &
하면 백그라운드 프로세스가 생성됩니다.
을 쓰면 a; b
command 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
사람의 추측입니다.
출력이 올바른지 확인 했습니까?
답변
nc (netcat) 명령은 시간이 많이 소요됩니다. 원격 서버에 연결하고 데이터를 보내고 응답을 기다렸다가 반환해야합니다.
&를 사용하면 기본적으로 백그라운드 프로세스에서 해당 명령을 포크합니다 ( “작업”이라고 함). 그 자체로는 더 빨리 실행되지 않습니다. 그러나 이것은 루프가 더 이상 차단되지 않았으며 다음 반복 (다음 nc로)을 이미 수행 할 수 있음을 의미합니다.
따라서 기본적으로 속도 향상은 이전의 연결이 완료되기를 기다려야하는 모든 원격 연결을 병렬로 만들어서 발생합니다.
Btw, 터미널에 따라 echo 명령도 루프 속도를 늦출 수 있습니다 (쓰기 버퍼에 공간이 생길 때까지 기다려야 할 수도 있습니다).