나는 호출하는 프로그램을 작성 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 외부에서 프로그램을 시작하고 문제가있는 부분에 도달하기 전에 어떤 방식 으로든 일시 중지하고 attach
Gdb 내부의 프로세스 ( 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
하지만 처음부터 디버깅 할 수 있습니다.