私の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_vsyscall
gdbを使用して使用されているシステム呼び出し方法を確認できます。
(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_vsyscall
0x1000を追加して終了を取得しました。 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