최신 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를 다시 찾을 수 있습니다: [root@arch-qemu ~]# objdump -d --start-address=0x00000b9c --stop-address=0x00000bac linux-gate.dso

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

관련 정보