setuid(0)
나는 and 를 호출하는 프로그램을 작성했습니다 execve("/bin/bash",NULL,NULL)
.
그럼 내가 그랬어chown root:root a.out && chmod +s a.out
실행하면 ./a.out
루트 쉘이 생성됩니다. 그러나 gdb a.out
이렇게 하면 일반 사용자로 프로세스가 시작되고 사용자 셸이 시작됩니다.
그럼...setuid 루트 프로그램을 디버깅할 수 있나요?
답변1
디버거가 루트로 실행 중인 경우 setuid 또는 setgid 프로그램만 디버그할 수 있습니다. 커널은 당신이 전화하는 것을 허용하지 않습니다ptrace
추가 권한으로 실행되는 프로그램. 만약 그렇다면, 당신은 당신의 프로그램이 무엇이든 하도록 할 수 있을 것입니다. 이는 본질적으로 당신이 단지 를 호출할 수 있다는 것을 의미합니다 /bin/su
.
Gdb를 루트로 실행하면 프로그램을 실행할 수 있지만 루트로 실행할 때만 프로그램의 동작을 관찰할 수 있습니다.
루트로 시작되지 않은 프로그램을 디버깅해야 하는 경우 Gdb 외부에서 프로그램을 시작하고 문제가 있는 부분에 도달하기 전에 어떻게든 일시 중지하고 attach
Gdb 내부 프로세스( at 1234
여기서 1234는 프로세스 ID)를 수행합니다.
답변2
원하는 경우 중지된 상태에서 프로세스를 시작하는 방법이 있습니다. Bash 스크립트를 사용하여 다음을 수행합니다.
echo $BASHPID; kill -STOP $BASHPID; exec sudo -u unpriviledged_user -g the_group_if_not_primary command
백그라운드에서 실행되도록 하세요.
그런 다음 을 시작 gdb
하고 인쇄된 pid에 추가합니다.
단계별 exec
명령을 사용해야 gdb
하지만 처음부터 디버깅할 수 있습니다.