我是否正确使用gdb以这种方式获取sys_call_table的地址?

时间:2011-03-24 05:26:12

标签: gdb linux-kernel

我现在正在这样做:

(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(,%rax,8)

然后0x7ec62ec0是sys_call_table的地址,对吧?

2 个答案:

答案 0 :(得分:1)

  

我需要该表的地址来劫持0x80 int的处理程序。

停在那儿。你真的试图做什么?劫持中断处理程序不是你的目标,这是你认为需要采取的一步来实现某些目标。不管是什么,你可能会以错误的方式解决这个问题。

要劫持中断,您需要更改interrupt descriptor table。我建议你看Intel reference manuals来弄清楚如何。这将是痛苦的编程。但我怀疑你对系统调用更感兴趣。此外,在现代Linux系统上,int 0x80指令不是调用系统调用的常用方法。这当然仍然适用于向后兼容性,但您会看到其他指令,如sysenter(x86)或syscall(x86_64)。因此,如果您真的对系统调用做一些事情感兴趣,请不要在中断处理程序中执行此操作。

无论如何,创建一个新问题,询问建议,以实现您的最终目标,这里的社区将帮助您完成它。如果您对特定部分有疑问,请提出更多问题,并在这些新问题中回顾您的高级职位。

(顺便说一句,如果你想要确认地址,请尝试在gdb中运行info addr sys_call_table。或者,因为看起来你在x86_64架构上,请尝试p &sys_call_table。)

答案 1 :(得分:0)

是的,在转储中,0x7ec62ec0sys_call_table的地址。要获取完整的sys_call_table地址,您需要执行以下操作:

sys_call_table = 0xFFFFFFFF00000000 | *(unsigned int *)(0xffffffff8100b9a4 + 3);

此处,0xffffffff8100b9a4callq *-0x7ec62ec0(,%rax,8)指令的地址,3是大小。并且不要忘记可能同时存在多个系统调用表:sys_call_tableia32_sys_call_table因此,您需要处理所有可能的方法来进行系统调用:{{ 1}},int $0x80