我现在正在这样做:
(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的地址,对吧?
答案 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)
是的,在转储中,0x7ec62ec0
是sys_call_table
的地址。要获取完整的sys_call_table
地址,您需要执行以下操作:
sys_call_table = 0xFFFFFFFF00000000 | *(unsigned int *)(0xffffffff8100b9a4 + 3);
此处,0xffffffff8100b9a4
是callq *-0x7ec62ec0(,%rax,8)
指令的地址,3是大小。并且不要忘记可能同时存在多个系统调用表:sys_call_table
和ia32_sys_call_table
因此,您需要处理所有可能的方法来进行系统调用:{{ 1}},int $0x80
。