最新のLinuxシステムでlinux-gate.dsoを取得するには?

最新のLinuxシステムでlinux-gate.dsoを取得するには?

私の32ビットQEMUゲストがシステムコールにどのような方法を使用しているかを知りたいです。 linux-gate.dsoを説明する素晴らしい記事があります(http://www.trilithium.com/johan/2005/08/linux-gate/)。しかし、新しいシステムではどのコマンドも使用できないようです。

現在のセキュリティ機能では、仮想DSOダンプを許可していないようです。

[root@qemu ~]# dd if=/proc/self/mem of=linux-gate.dso bs=4096 skip=1048574 count=1
dd: ‘/proc/self/mem’: cannot skip to specified offset
dd: error reading ‘/proc/self/mem’: Input/output error
0+0 records in
0+0 records out
0 bytes (0 B) copied, 0.0332587 s, 0.0 kB/s

答え1

読むためには今/proc/[pid]/memプロセスが必要です。PTRACE_ATTACHこれを行う一般的なユーティリティは次のとおりです。gdb

実行中のプロセスを選択し(私の場合はcat別のウィンドウで開きました)、gdbをプロセスに接続します。

[root@qemu ~]# gdb --pid 423
#MORE OUTPUT
0xb771dbac in __kernel_vsyscall ()

シンボルをロードするとき、出力の一部としてgdbは上記の行を出力する必要があります。そうでない場合は、シンボルテーブルから検索できます。

(gdb) info functions vsyscall
All functions matching regular expression "vsyscall":

Non-debugging symbols:
0xb771db9c  __kernel_vsyscall

これでアドレスがあるので、__kernel_vsyscallgdbを使用して使用されているシステム呼び出し方法を確認できます。

(gdb) disassemble 0xb771db9c
Dump of assembler code for function __kernel_vsyscall:
   0xb771db9c <+0>:     push   %ecx
   0xb771db9d <+1>:     push   %edx
   0xb771db9e <+2>:     push   %ebp
   0xb771db9f <+3>:     mov    %esp,%ebp
   0xb771dba1 <+5>:     sysenter 
   0xb771dba3 <+7>:     nop
   0xb771dba4 <+8>:     nop
   0xb771dba5 <+9>:     nop
   0xb771dba6 <+10>:    nop
   0xb771dba7 <+11>:    nop
   0xb771dba8 <+12>:    nop
   0xb771dba9 <+13>:    nop
   0xb771dbaa <+14>:    int    $0x80
=> 0xb771dbac <+16>:    pop    %ebp
   0xb771dbad <+17>:    pop    %edx
   0xb771dbae <+18>:    pop    %ecx
   0xb771dbaf <+19>:    ret    
End of assembler dump.

あるいは、元の要求に従ってlinux-gate.dsoをダンプすることもできます。

(gdb) dump memory ./linux-gate.dso 0xb771d000 0xb771e000

基本的に私たちはlinux-gate.dsoがページ全体を占めていることを知っています。このシステムのページサイズは4K = 0x1000なので、アドレスから四捨五入し、__kernel_vsyscall0x1000を追加して終了を取得しました。 gdbの外では、ファイルが共有ライブラリとして認識されていることがわかります。

[root@qemu ~]# objdump -T ./linux-gate.dso |grep syscall
00000b9c g    DF .text  00000014  LINUX_2.5   __kernel_vsyscall

sysenterをもう一度見つけることができます。

linux-gate.dso: ファイル形式 elf32-i386

.textセクションの分解:

00000b9c <__kernel_vsyscall>:
 b9c:   51                      push   %ecx
 b9d:   52                      push   %edx
 b9e:   55                      push   %ebp
 b9f:   89 e5                   mov    %esp,%ebp
 ba1:   0f 34                   sysenter 
 ba3:   90                      nop
 ba4:   90                      nop
 ba5:   90                      nop
 ba6:   90                      nop
 ba7:   90                      nop
 ba8:   90                      nop
 ba9:   90                      nop
 baa:   cd 80                   int    $0x80

関連情報