どうぞ:
minix-exit.S
.section .text
.global _start
_始める:
/* _exit(17) */
および $0xfffffff0、%esp
サブ $0x40、%esp
movl $17, 0x18(%esp) /* 終了ステータス */
lea 0x10(%esp), %ebx
movl $1, 0x04(%ebx) /* include/minix/callnr.h で終了 */
movl $0, %eax /* include/minix/com.h 内の PM_PROC_NR */
movl $0x3, %ecx /* include/minix/ipcconst.h 内の SENDREC */
int $33 /* sys/arch/i386/include/asm.h 内の IPCVEC_ORIG */
ビルドして実行:
$ clang -nostdlib minix-exit.S -o minix-exit
$ ./minix-exit; エコー $?
17
Minix 3 の syscall 実装を理解する最も簡単な方法は、コードを読む前に少しリバース エンジニアリングを行うことです。
呼び出しシーケンス
マイクロ カーネルである Minix は、さまざまなマネージャーに送信できるメッセージとしてシステム コールを構造化することを主張します。exit()
に送信EXIT
することで実装されPM_PROC_NR
ます:
少しのリバースエンジニアリングでこれを理解する
単純な静的にリンクされた実行可能ファイルのようなものが Minixでどのように/bin/cat
実装されるかを見てください。_exit()
dis.gdb
ページネーションを0に設定
ファイル /bin/cat
ログオンの設定
逆アセンブル _exit
逆アセンブル _syscall
x/a 0x8072678
逆アセンブル_sendrec_orig
終了する
走る:
gdb -q -x dis.gdb
GDB 出力
関数 _exit のアセンブラー コードのダンプ:
0x0805b780 : %ebp をプッシュ
0x0805b781 : mov %esp,%ebp
0x0805b783 : および $0xfffffff0,%esp
0x0805b789 : サブ $0x40,%esp
0x0805b78c : mov 0x8(%ebp),%eax
0x0805b78f : mov %eax,0x18(%esp)
0x0805b793 : レア 0x10(%esp),%eax
0x0805b797 : mov %eax,0x8(%esp)
0x0805b79b : movl $0x1,0x4(%esp)
0x0805b7a3 : movl $0x0,(%esp)
0x0805b7aa : 0x805dfc0 を呼び出します
0x0805b7af : 0x805b7af を呼び出します
0x0805b7b4 : nopw %cs:0x0(%eax,%eax,1)
0x0805b7c0 : jmp 0x805b7c0
アセンブラー・ダンプの終わり。
関数 syscall のアセンブラー コードのダンプ:
0x0805dfc0 : %ebp をプッシュ
0x0805dfc1 : mov %esp,%ebp
0x0805dfc3 : プッシュ %esi
0x0805dfc4 : サブ $0xc,%esp
0x0805dfc7 : mov 0xc(%ebp),%eax
0x0805dfca : mov 0x10(%ebp),%esi
0x0805dfcd : mov %eax,0x4(%esi)
0x0805dfd0 : mov %esi,0x4(%esp)
0x0805dfd4 : mov 0x8(%ebp),%ecx
0x0805dfd7 : mov %ecx,(%esp)
0x0805dfda : コール *0x8072678
0x0805dfe0 : テスト %eax,%eax
0x0805dfe2 : ジェ 0x805dfe9
0x0805dfe4 : mov %eax,0x4(%esi)
0x0805dfe7 : jmp 0x805dfec
0x0805dfe9 : mov 0x4(%esi),%eax
0x0805dfec : テスト %eax,%eax
0x0805dfee : jns 0x805e000
0x0805dff0 : mov %eax,%esi
0x0805dff2 : 否定 %esi
0x0805dff4 : 0x805e010 を呼び出します
0x0805dff9 : mov %esi,(%eax)
0x0805dffb : mov $0xffffffff,%eax
0x0805e000 : $0xc,%esp を追加
0x0805e003 : ポップ %esi
0x0805e004 : ポップ %ebp
0x0805e005 : 戻る
アセンブラー・ダンプの終わり。
0x8072678 : 0x805e100
関数 _sendrec_orig のアセンブラー コードのダンプ:
0x0805e100 : %ebp をプッシュ
0x0805e101 : mov %esp,%ebp
0x0805e103 : %ebx をプッシュ
0x0805e104 : mov 0x8(%ebp),%eax
0x0805e107 : mov 0xc(%ebp),%ebx
0x0805e10a : mov $0x3,%ecx
0x0805e10f : 整数 $0x21
0x0805e111 : ポップ %ebx
0x0805e112 : ポップ %ebp
0x0805e113 : 戻る
0x0805e114 : レア 0x0(%esi),%esi
0x0805e11a : レア 0x0(%edi),%edi
アセンブラー・ダンプの終わり。