ウォーゲームチャレンジの実行中に権限の問題が発生しました。提供された情報は、/proc/PID/status
プロセスに付与する必要がある権限と一致しません。
私はuser1ユーザーです。 SETUIDプログラムを使用する必要があります。
-r-sr-x--- 1 user2 user1 6297 Jun 20 2013 program
したがって、user2の有効なUIDで実行する必要があります。
プログラムが終了しないように、プログラムを起動して一時停止します。
~/program "test" &
PID=$!
kill -SIGSTOP $PID
echo $PID
それから私はcat /proc/$PID/status
次を見ました。
Uid: 1003 1003 1003 1003
Gid: 1003 1003 1003 1003
IDは次のとおりです
$ id user1
uid=1003(user1) gid=1003(user1) groups=1003(user1)
$ id user2
uid=1035(user2) gid=1035(user2) groups=1035(user2),1003(user1)
マニュアル( man 5 proc
)が与えられたとき、/proc/$PID/status
与えられなければならないUid, Gid: Real, effective, saved set, and filesystem UIDs (GIDs).
ただし、ここでプロセスの有効IDはuser1であり、user2の有効なIDが必要です。。
プログラムがあまりにも早く中断したからかもしれないと思って、実際に関数のコードがgdb
実行されるまで接続して実行し続けてみましたが(提供されたソース)、有効なUIDはまだuser2ではなくuser1でした。main
program
/proc/$PID/status
私は何を逃したことがありませんか?
編集:チャレンジのソースを削除しました。投稿する権限がないようです。
ベストアンサー1
早すぎるため、UIDが変更されるのを待つとプロセスは終了しますuser2
。
./program "test" &
PID=$!
sleep 0.0005
kill -SIGSTOP $PID
grep ^Uid /proc/$PID/status
別の試みは、遅延を追加し、usleep()
睡眠中に後者を送信することです。SIGSTOP
その後、プログラムはuser2
有効なuidで実行されます。gdb
またはを追加せずに確認できますstrace
。プロセスがUIDを変更するのに時間がかかるLinuxカーネル内の問題である可能性が高いです。
execve()
マンページの端末でプロセスを実行すると、システムコールが呼び出されます。
filename[...] が指すプログラムファイルに set-user-ID ビットが設定されていて、呼び出しプロセスが追跡されない場合、呼び出しプロセスの実効ユーザー ID がプログラム所有者のユーザー ID に変更されます。プログラムファイル。
プロセスに接続すると、上記のマニュアルページに記載されているようにプロセスが実行されるため、gdb
uidは表示されません。あるいは、プロセスに接続してroot権限を取得することもできます。user2
ptrace
sudo
SIGSEGV
ただし、このプログラムはを使用しない限り、分割エラー()を生成しませんkill -SIGSEGV $PID
。もしあなたのプログラムにはSIGSEGV
ルーチンlaunch_debugger()
と呼ばれるルーチンがあります。これは引数なしでバイナリgdb
のみを引数として呼び出し、現在実行中のプロセスを置き換えます。program
したがって、デバッガには権限があるので、そこでuser2
必要な操作を実行してuser2
権限を持つことができます。
たとえば、内部的には次のことができますgdb
。
(gdb) file bash
Reading symbols from /bin/bash...(no debugging symbols found)...done.
(gdb) run
Starting program: /bin/bash
user2@host:~$ id
uid=1035(user2) gid=1003(user1) groups=1035(user2),1003(user1)
さて、setuidビットを持ち、所有者がルートである同じバイナリを考えてみましょう。