问题描述
|
我正在这样做:
(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
。