反转Mach-O 64位x86汇编分析

时间:2017-05-20 13:31:21

标签: macos assembly x86-64 reverse-engineering mach-o

这个问题是针对英特尔x86汇编专家的回答。感谢你提前付出的努力!

问题规范

我正在分析一个二进制文件,它匹配 Mach-O 64位x86程序集。我目前正在使用MacOS 64操作系统。该程序集来自 objdump

问题在于,当我学习汇编时,我可以看到变量名称" $ xxx",我可以看到ascii中的字符串值,我也可以看到被叫者名称,如"调用_printf& #34;

但是在这个集会中,我什么也得不到:

  1. 没有主要功能:

    Disassembly of section __TEXT,__text:
    __text:
    100000c90:  55  pushq   %rbp
    100000c91:  48 89 e5    movq    %rsp, %rbp
    100000c94:  48 83 ec 10     subq    $16, %rsp
    100000c98:  48 8d 3d bf 02 00 00    leaq    703(%rip), %rdi
    100000c9f:  b0 00   movb    $0, %al
    100000ca1:  e8 68 02 00 00  callq   616
    100000ca6:  89 45 fc    movl    %eax, -4(%rbp)
    100000ca9:  48 83 c4 10     addq    $16, %rsp
    100000cad:  5d  popq    %rbp
    100000cae:  c3  retq
    100000caf:  90  nop
    100000cb0:  55  pushq   %rbp  
    ...
    

    以上是代码框架将被执行,但我不知道它在哪里被执行。

  2. 另外,我是AT& T新手组装的。因此,你能告诉我教学的含义是什么:

        0000000100000c90    pushq   %rbp
        0000000100000c98    leaq    0x2bf(%rip), %rdi       ## literal pool for: "xxxx\n"
        ...
        0000000100000cd0    callq   0x100000c90
    

    这是一个循环吗?我不确定,但似乎是。为什么我们使用%rip和%rdi寄存器。在intel x86中,我知道EIP代表当前的来电地址,但我不明白这里的含义。

    1. 调用整数: 无论他们使用什么电话会议,我都没见过类似#34;拨打616"

      "100000cd0: e8 bb ff ff ff  callq   -69 <__mh_execute_header+C90>"
      
    2. 后退: 退入intel x86,意味着删除堆栈帧并将控制流返回给调用者。它应该是一个独立的功能。但是,在此之后,我们可以看到像

      这样的代码
      100000cae:  c3  retq
      100000caf:  90  nop
      /* new function call */
      100000cb0:  55  pushq   %rbp
      ...
      

      太荒谬了!

    3. ASCII字符串丢失: 我已经以十六进制格式查看了二进制文件,并在将其反转为asm文件之前识别出一些ascii字符串。

    4. 但是,在此文件中没有出现ascii字符串!

      1. 总体架构审核:

        Disassembly of section __TEXT,__text:
        __text:
        from address 10000c90 to 100000ef6 of 145 lines
        
        Disassembly of section __TEXT,__stubs:
        __stubs:
        from address 100000efc to 100000f14 of 5 lines asm codes:
        100000efc:  ff 25 16 01 00 00   jmp qword ptr [rip + 278]
        100000f02:  ff 25 18 01 00 00   jmp qword ptr [rip + 280]
        100000f08:  ff 25 1a 01 00 00   jmp qword ptr [rip + 282]
        100000f0e:  ff 25 1c 01 00 00   jmp qword ptr [rip + 284]
        100000f14:  ff 25 1e 01 00 00   jmp qword ptr [rip + 286]
        
        Disassembly of section __TEXT,__stub_helper:
        __stub_helper:
        
        ...
        
        Disassembly of section __TEXT,__cstring:
        __cstring:
        
        ...
        
        Disassembly of section __TEXT,__unwind_info:
        __unwind_info:
        
        ...
        
        Disassembly of section __DATA,__nl_symbol_ptr:
        __nl_symbol_ptr:
        
        ...
        
        Disassembly of section __DATA,__got:
        __got:
        
        ...
        
        Disassembly of section __DATA,__la_symbol_ptr:
        __la_symbol_ptr:
        
        ...
        
        Disassembly of section __DATA,__data:
        __data:
        
        ...
        
      2. 由于它可能是病毒,我无法执行它。我该如何分析呢?

        5月21日更新

        我已经确定了输出的位置,如果我完全理解本程序中表示的数据流管道,我可能能够找出可能的解决方案。

        如果有人能给我详细解释,我将不胜感激。谢谢!

        5月22日更新

        我在VirtualBox中安装了一个MacOS,在chmod权限之后,我执行了该程序,但除了两行输出之外没什么特别的。并将结果隐藏在二进制文件中。

1 个答案:

答案 0 :(得分:2)

  1. 如果您不使用C,则不需要main。二进制标头包含入口点地址。
  2. call 616没什么特别的,只是你没有(全部)符号。 objdump没有为你计算地址有点奇怪,但它应该是0x100000ca6+616
  3. 不确定那里发现什么是荒谬的。一个功能结束,另一个功能开始。
  4. 这不是问题。是的,您可以在运行时创建字符串,这样您就不会在图像中显示它们。可能他们是加密的。