ユーザーが何かにアクセスする権限を持っていると仮定すると、どのようにgeteuid()などのシステムコールを直接実行できますか? bashから有効なユーザーIDを取得します(これは単なる例です)。どうすればいいですか?
答え1
システムコールによるユーザ空間カーネル空間通信は、メモリ位置とマシンレジスタに基づいて行われます。これは主に、テキスト文字列として機能するシェルの抽象化レベルよりはるかに低いです。
つまり、bashでは次のことができます。https://github.com/taviso/ctypes.shCレベルの粒度でテキスト文字列を抽象化するプラグイン:
$ . ctypes.sh
$ dlcall -r long geteuid
long:1001
ただし、この特定の操作では、bashのマジック変数を使用する方が簡単で慣用的で効率的です$UID
。
$ echo "$EUID" #effectively a cached geteuid call
1001
答え2
uidを取得するには、独自のCプログラム(またはシェルがそれを許可する場合はいくつかのシェルプラグイン、注)を作成してください。扱いにくいというプラグインがあるかもしれません。基準寸法.) またはより簡単に実行番号(1)注文する。
他のシステムコールの場合(次にリストされています)システムコール(2))、同じです。一部のプログラム(または一部の組み込みまたは一部のプラグイン)を使用して実行します。プログラムはアセンブラで直接コーディングすることができ、SYSCALL
マシンSYSENTER
命令を使用してシステムコールを実行する(より一般的に)C標準ライブラリそして、対応するシステムコールを実行する関数を使用してくださいlibc
。実行可能ファイルはCソースコードから取得する必要はありません(例:忙しい箱アセンブラ、プログラムコーディング骨コンパイラはlibcを使用しません。)しかし、あなたlibc
は礎石ですあなたのシステム。
プロセスの特定の変更可能で継承可能な属性を変更するシステムコールは、シェルに組み込まれている必要があります(cd
例:目次(2)、ulimit
のための制限設定(2)など...)は、シェルプロセス自体の属性を変更しようとする可能性があるためです(そして、シェルによって開始される将来のコマンドプロセスによって継承されます)。したがってcd
、プログラムの場合は、そのプログラムを実行するシェルサブプロセスにのみ適用されます。
さて、システムコール誰かが完了しなければ意味がありません。プロセス。プロセスはシェルプロセスでも、シェルによって開始された子(または子)プロセスでもかまいません。
参考にしてくださいUnixシェルすべて一般的な手順です。それらの多くがあります(例:扱いにくい、魚、西、英語など...)...自分のシェルを作成するのは興味深い練習です(簡単に実行できます。参照)。ウエストバンドたとえば、次のようになります。これワイルドカードのヒント)。 ~について読むLinuxプログラミング。他のシェルを使用することが満足できない場合bash
(おそらく次のようにログインシェルを変更してください)chsh(1))または自分で書いてみてください。返品、GNU バッシュ他のほとんどの殻と同様にフリーソフトウェア。必要に応じてソースコードを研究して改善できます。