Para ler /proc/[pid]/mem
, um processo deve agora PTRACE_ATTACH
para ele. Um utilitário comumente disponível que faz isso é gdb
Escolha um processo em execução (no meu caso, acabei de abrir cat
em outra janela) e, em seguida, anexe o gdb a esse processo:
[root@qemu ~]# gdb --pid 423
#MORE OUTPUT
0xb771dbac in __kernel_vsyscall ()
Como parte de sua saída ao carregar símbolos, o gdb deve exibir a linha que incluí acima. Se não, você pode procurar na tabela de símbolos:
(gdb) info functions vsyscall
All functions matching regular expression "vsyscall":
Non-debugging symbols:
0xb771db9c __kernel_vsyscall
Agora que temos o endereço __kernel_vsyscall
, podemos usar o gdb para inspecionar o método de chamada do sistema usado:
(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.
ou podemos copiar o linux-gate.dso conforme solicitado originalmente:
(gdb) dump memory ./linux-gate.dso 0xb771d000 0xb771e000
Basicamente, sabemos que o linux-gate.dso leva uma página inteira. Como esse sistema tem um tamanho de página de 4K = 0x1000, acabei de arredondar o endereço de __kernel_vsyscall
e adicionei 0x1000 para obter o final. Fora do gdb, podemos ver que o arquivo é reconhecido como uma biblioteca compartilhada:
[root@qemu ~]# objdump -T ./linux-gate.dso |grep syscall
00000b9c g DF .text 00000014 LINUX_2.5 __kernel_vsyscall
e podemos encontrar o sysenter novamente: [root @ arch-qemu ~] # objdump -d --start-address = 0x00000b9c --stop-address = 0x00000bac linux-gate.dso
linux-gate.dso: formato de arquivo elf32-i386
Desmontagem da seção .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