mcve을 게시하십시오. 당신이 묘사하는 것은 제 시스템에서 잘 작동합니다. 이 :
#!/bin/sh -e
cat > main.c <<EOF
#define _GNU_SOURCE
#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char** argv)
{
int fd;
uid_t ruid,euid,suid;
struct stat sb;
getresuid(&ruid,&euid,&suid);
printf("ruid=%ld euid=%ld suid=%ld\n", (long)ruid,(long)euid,(long)suid);
if(0>(fd = open(argv[1], O_CREAT|O_RDWR, 0660))){
perror(0);
exit(1);
}
fstat(fd,&sb);
printf("owner=%ld\n", (long)sb.st_uid);
close(fd);
seteuid(ruid);
getresuid(&ruid,&euid,&suid);
printf("ruid=%ld euid=%ld suid=%ld\n", (long)ruid,(long)euid,(long)suid);
if(0>(fd = open(argv[2], O_CREAT|O_RDWR, 0660))){
perror(0);
exit(1);
}
fstat(fd,&sb);
printf("owner=%ld\n", (long)sb.st_uid);
close(fd);
}
EOF
gcc main.c
sudo chown root a.out
sudo chmod u+s a.out
rm -f roots mine
./a.out roots mine
저를 가져옵니다
ruid=1008 euid=0 suid=0
owner=0
ruid=1008 euid=1008 suid=0
owner=1008
는, 즉 seteuid
호출이 성공적으로 내 UID를 재설정하고 두 번째 파일 루트에 의해 더 이상 소유자입니다.
"루트 사용자를 통해 컴파일했습니다."- 결코 그렇게하지 마십시오! 프로그래밍에 관한 것이 아니라 시스템 관리입니다. 그런 질문은 여기서 벗어난 것입니다. – Olaf
[mcve] 또는 결코 발생하지 않았습니다. –
"setuid() 및 setuid()"는 언제나 seteuid 중 하나입니까? 그 반환 값을 확인 했습니까? –