【发布时间】:2011-02-09 01:38:13
【问题描述】:
如何反汇编系统调用,以便获得其中涉及的汇编指令
【问题讨论】:
标签: linux gdb system-calls disassembly
如何反汇编系统调用,以便获得其中涉及的汇编指令
【问题讨论】:
标签: linux gdb system-calls disassembly
嗯,你可以做这样的事情。假设我想获得“dup”的程序集转储:
这样写:
#include <stdio.h>
#include <sys/file.h>
int main() {
return dup(0)
}
编译:
gcc -o systest -g3 -O0 systest.c
转储它:
objdump -d systest
查看“主要”我看到了:
400478: 55 push %rbp
400479: 48 89 e5 mov %rsp,%rbp
40047c: bf 00 00 00 00 mov $0x0,%edi
400481: b8 00 00 00 00 mov $0x0,%eax
400486: e8 1d ff ff ff callq 4003a8 <dup@plt>
40048b: c9 leaveq
40048c: c3 retq
40048d: 90 nop
40048e: 90 nop
40048f: 90 nop
所以看着“dup@plt”我明白了:
00000000004003a8 <dup@plt>:
4003a8: ff 25 7a 04 20 00 jmpq *2098298(%rip) # 600828 <_GLOBAL_OFFSET_TABLE_+0x20>
4003ae: 68 01 00 00 00 pushq $0x1
4003b3: e9 d0 ff ff ff jmpq 400388 <_init+0x18>
所以它正在调用“全局偏移表”,我假设它具有所有系统调用向量。就像另一篇文章所说的那样,有关详细信息,请参阅内核源代码(或标准库源代码?)。
【讨论】:
dl_runtime_resolve() 的回退跳转。 GOT (Global Offset Table) 包含已解析函数的地址,或间接跳转后PLT中的指令,因此可以重定向到回退跳转。
我认为你不想这样做。系统调用处理很复杂(请参阅http://www.ibm.com/developerworks/linux/library/l-system-calls/)。由于您已经用“linux”标记了这个问题,您可以从kernel.org 下载源代码(这将比汇编代码更易于理解和提供更多信息)。
【讨论】:
要了解linux系统调用,请浏览代码。
重要文件有:
/include/linux/syscalls.h(linux中所有支持的系统调用)
/arch/arm/kernel/entry-common.S(寄存器级系统调用的实现)
/arch/arm/kernel/calls.S(系统调用号)
/arch/arm/include/asm/unistd.h(系统调用地址)
注意:系统调用表只能从 system.map 寻址。
【讨论】: