【问题标题】:how to disassemble a system call?如何反汇编系统调用?
【发布时间】:2011-02-09 01:38:13
【问题描述】:

如何反汇编系统调用,以便获得其中涉及的汇编指令

【问题讨论】:

    标签: linux gdb system-calls disassembly


    【解决方案1】:

    嗯,你可以做这样的事情。假设我想获得“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>
    

    所以它正在调用“全局偏移表”,我假设它具有所有系统调用向量。就像另一篇文章所说的那样,有关详细信息,请参阅内核源代码(或标准库源代码?)。

    【讨论】:

    • PLT 和 GOT 是动态链接器结构。 PLT 或过程链接表包含(通过 GOT)到动态函数的间接跳转,以及到dl_runtime_resolve() 的回退跳转。 GOT (Global Offset Table) 包含已解析函数的地址,或间接跳转后PLT中的指令,因此可以重定向到回退跳转。
    【解决方案2】:

    我认为你不想这样做。系统调用处理很复杂(请参阅http://www.ibm.com/developerworks/linux/library/l-system-calls/)。由于您已经用“linux”标记了这个问题,您可以从kernel.org 下载源代码(这将比汇编代码更易于理解和提供更多信息)。

    【讨论】:

    • 是的,系统调用的实现肯定可以被代码理解。
    【解决方案3】:

    要了解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 寻址。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-01-16
      • 2010-12-18
      • 1970-01-01
      • 2018-11-06
      • 2012-01-20
      • 1970-01-01
      • 2020-08-28
      相关资源
      最近更新 更多