Ubuntu 12.04 (64 ビット) を使用して、Linux のアクセス許可に関するいくつかの実験を行っています。
以下のプログラムを作成しました。
#include<stdio.h>
#include <unistd.h>
main(){
printf("euid=%4d uid=%4d egid=%4d gid=%4d\n", geteuid(), getuid(),getegid(),getgid());
system("id");
}
そして、その実行可能ファイルを setuid/setgid ファイルとして設定します。
-rws--s--x 1 root root 8638 Apr 28 02:00 pt*
特権のないユーザーから実行すると、次の出力が得られます。
euid= 0 uid=1001 egid= 0 gid=1001
uid=1001(test1) gid=1001(test1) euid=0(root) egid=0(root) groups=0(root),1001(test1)
system() syscall の使用後にルート権限が削除されることを期待します (これが、シェルコードが通常 system() の代わりに execv() を使用する理由です) が、そうではありません。
理由を説明していただけますか?
ありがとうございました。