gdb는 suid 루트 프로그램을 디버깅 할 수 있습니까? ./a.out루트 쉘을 얻는다. 그러나 내가하면 gdb a.out일반

나는 호출하는 프로그램을 작성 setuid(0)하고 execve("/bin/bash",NULL,NULL).

그런 다음 chown root:root a.out && chmod +s a.out

내가 실행할 때 나는 ./a.out루트 쉘을 얻는다. 그러나 내가하면 gdb a.out일반 사용자로 프로세스를 시작하고 사용자 셸을 시작합니다.

그러면 … setuid 루트 프로그램을 디버깅 할 수 있습니까?



답변

디버거가 루트로 실행중인 경우 setuid 또는 setgid 프로그램 만 디버그 할 수 있습니다. 커널은 ptrace추가 권한으로 실행되는 프로그램 을 호출 할 수 없습니다 . 만약 그렇다면 프로그램이 무엇이든 실행하도록 만들 수있다. 이것은 사실상 디버거를 호출하여 루트 쉘을 실행할 수 있음을 의미한다 /bin/su.

루트로 Gdb를 실행하면 프로그램을 실행할 수 있지만 루트로 실행할 때만 동작을 관찰하게됩니다.

루트로 시작하지 않았을 때 프로그램을 디버깅해야하는 경우 Gdb 외부에서 프로그램을 시작하고 문제가있는 부분에 도달하기 전에 어떤 방식 으로든 일시 중지하고 attachGdb 내부의 프로세스 ( at 1234여기서 1234는 프로세스 ID)를 사용하십시오.


답변

원한다면 프로세스를 중지 된 상태로 시작하는 방법이 있습니다. bash 스크립트를 사용하십시오.

echo $BASHPID; kill -STOP $BASHPID; exec sudo -u unpriviledged_user -g the_group_if_not_primary command

백그라운드에서 실행하십시오.

그런 다음 시작 gdb하고 인쇄 된 pid에 첨부하십시오.

을 사용하여 exec명령 을 단계별로 수행해야 gdb하지만 처음부터 디버깅 할 수 있습니다.


답변