我是否可以通过gdb这样获得sys_call_table的地址?

问题描述

| 我正在这样做:
(gdb) info addr system_call
Symbol \"system_call\" is at 0xffffffff8100b920 in a file compiled without debugging.

(gdb) x/50i 0xffffffff8100b920
0xffffffff8100b920: swapgs 
0xffffffff8100b923: nopw   0x0(%rax,%rax,1)
0xffffffff8100b929: nopl   0x0(%rax)
0xffffffff8100b930: mov    %rsp,%gs:0xb008
0xffffffff8100b939: mov    %gs:0xb508,%rsp
0xffffffff8100b942: sti    
0xffffffff8100b943: sub    $0x50,%rsp
0xffffffff8100b947: mov    %rdi,0x40(%rsp)
0xffffffff8100b94c: mov    %rsi,0x38(%rsp)
0xffffffff8100b951: mov    %rdx,0x30(%rsp)
0xffffffff8100b956: mov    %rax,0x20(%rsp)
0xffffffff8100b95b: mov    %r8,0x18(%rsp)
0xffffffff8100b960: mov    %r9,0x10(%rsp)
0xffffffff8100b965: mov    %r10,0x8(%rsp)
0xffffffff8100b96a: mov    %r11,(%rsp)
0xffffffff8100b96e: mov    %rax,0x48(%rsp)
0xffffffff8100b973: mov    %rcx,0x50(%rsp)
0xffffffff8100b978: mov    %gs:0xb508,%rcx
0xffffffff8100b981: sub    $0x1fd8,%rcx
---Type <return> to continue,or q <return> to quit---
0xffffffff8100b988: testl  $0x100001d1,0x10(%rcx)
0xffffffff8100b98f: jne    0xffffffff8100bad0
0xffffffff8100b995: cmp    $0x12a,%rax
0xffffffff8100b99b: ja     0xffffffff8100ba5a
0xffffffff8100b9a1: mov    %r10,%rcx
0xffffffff8100b9a4: callq  *-0x7ec62ec0(,8)
那么
0x7ec62ec0
是sys_call_table的地址,对吗?     

解决方法

           我需要该表的地址来劫持0x80 int的处理程序。 停在那儿。您到底想做什么?劫持中断处理程序并不是您的目标,这是您认为要实现目标所需要采取的步骤。无论是什么,您都可能以错误的方式进行操作。 要劫持中断,您需要更改中断描述符表。我建议您查看英特尔参考手册以了解操作方法。这将是痛苦的编程。但是我怀疑您对系统调用更感兴趣。同样,在现代Linux系统上,“ 2”指令也不是调用系统调用的常用方法。当然,它仍然可以向后兼容,但是您会看到其他说明,例如
sysenter
(x86)或
syscall
(x86_64)。因此,如果您真的有兴趣对系统调用进行操作,请不要在中断处理程序中执行此操作。 无论如何,请创建一个新问题,以寻求实现最终目标的建议,这里的社区将为您提供帮助。如果您对某些特定部分有疑问,请提出更多问题,并在这些新问题中返回高级文章。 (顺便说一句,如果要确认地址,请尝试在gdb中运行
info addr sys_call_table
。或者,因为看起来好像您使用的是x86_64体系结构,请尝试
p &sys_call_table
。)     ,        是的,在转储中,
0x7ec62ec0
sys_call_table
的地址。要获取完整的“ 8”地址,您需要执行以下操作:
sys_call_table = 0xFFFFFFFF00000000 | *(unsigned int *)(0xffffffff8100b9a4 + 3);
这里,
0xffffffff8100b9a4
callq  *-0x7ec62ec0(,%rax,8)
指令的加法数,而3是大小。并且不要忘记同时存在多个系统调用表:
sys_call_table
ia32_sys_call_table
因此,您将需要处理所有可能的方式来进行系统调用:
int $0x80
syscall/sysenter
。