Macos 反向Mach-O 64位x86汇编分析

Macos 反向Mach-O 64位x86汇编分析,macos,assembly,x86-64,reverse-engineering,mach-o,Macos,Assembly,X86 64,Reverse Engineering,Mach O,此问题由英特尔x86汇编专家回答。提前感谢您的努力 问题说明 我正在分析一个二进制文件,它与Mach-O 64位x86汇编相匹配。我目前正在使用MacOS 64操作系统。程序集来自对象泵 问题是,当我学习汇编时,我可以看到变量名“$xxx”,可以看到ascii格式的字符串值,还可以看到被调用方的名称,如“call\u printf” 但在这次大会上,我无法得到任何东西: 无主要功能: Disassembly of section __TEXT,__text: __text: 100000c90:

此问题由英特尔x86汇编专家回答。提前感谢您的努力

问题说明 我正在分析一个二进制文件,它与Mach-O 64位x86汇编相匹配。我目前正在使用MacOS 64操作系统。程序集来自对象泵

问题是,当我学习汇编时,我可以看到变量名“$xxx”,可以看到ascii格式的字符串值,还可以看到被调用方的名称,如“call\u printf”

但在这次大会上,我无法得到任何东西:

  • 无主要功能:

    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  
    ...
    
    上面的代码框架将被执行,但我不知道它在哪里执行

  • 还有,我是AT&T组装的新手。因此,你能告诉我指导的含义是什么吗:

        0000000100000c90    pushq   %rbp
        0000000100000c98    leaq    0x2bf(%rip), %rdi       ## literal pool for: "xxxx\n"
        ...
        0000000100000cd0    callq   0x100000c90
    
    它是一个环吗?我不确定,但似乎是这样。以及为什么我们使用%rip和%rdi寄存器。在intel x86中,我知道EIP代表当前的呼叫方地址,但我不理解这里的含义

  • 调用整数: 无论他们使用什么调用约定,我从未见过像“call 616”这样的代码模式:

    太可笑了

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

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

  • 总体架构审查:

    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:
    
    ...
    
  • 因为它可能是病毒,我不能执行它。我应该如何分析它

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

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

    五月二十二日更新 我在VirtualBox中安装了一个MacOS,在获得chmod权限后,我执行了该程序,但除了两行输出之外,没有什么特别的事情发生。结果隐藏在二进制文件中

  • 如果不使用C,则不需要
    main
    。二进制头包含入口点地址
  • 调用616没有什么特别之处,只是您没有(所有)符号。有点奇怪,objdump没有为您计算地址,但它应该是
    0x100000ca6+616
  • 不知道你觉得那里有什么可笑。一个函数结束,另一个函数开始
  • 这不是问题。是的,您可以在运行时创建字符串,这样图像中就不会有字符串。可能是加密的
  • 如果不使用C,则不需要
    main
    。二进制头包含入口点地址
  • 调用616没有什么特别之处,只是您没有(所有)符号。有点奇怪,objdump没有为您计算地址,但它应该是
    0x100000ca6+616
  • 不知道你觉得那里有什么可笑。一个函数结束,另一个函数开始
  • 这不是问题。是的,您可以在运行时创建字符串,这样图像中就不会有字符串。可能是加密的

  • 你有没有试过
    otool-tV
    看看是否能更好地分解它?是的!这样比较好。我可以在汇编代码的右侧看到ascii注释!更重要的是,注释告诉我函数的地址,这样我就可以理解它们在调用什么!竖起大拇指!现在我正在学习AT&T语法来探索Assembly,而且这个命令只显示“Text”部分,正如您从“objdump”中看到的,我们还有全局变量的数据部分、helper函数等等。需要进一步的技巧来探索它。似乎在你已经收到答案后,你在问题中添加了一个新问题。这里不鼓励在堆栈溢出时这样做,因为它会使现有答案无效。简单地回答您的问题,
    LEA
    不是一个循环:它代表加载有效地址,在这里用于将
    0x2bf(%rip)
    的地址加载到寄存器
    %rdi
    。这里之所以使用
    %rip
    ,是因为代码是使用rip相对寻址编译的,这是一个易于搜索的术语。听起来你确实需要去读一本教x86-64汇编语言的书来理清基础知识!是的,我正在从大学学习RE4B和一些开放课程材料。但是一些高年级学生可以为我节省很多时间来回答这些问题(这可能就是为什么我们需要在大学学习而不是自学)。有三件事需要澄清。首先,感谢您告诉我,如果我们使用AT&T gramma,为什么需要%rip寄存器。第二,前面的问题没有完成。最后,循环I表示从0000000 100000CD0回调到0x100000c90。我想确定它是一个循环,因为我还没有看到索引寄存器。你是否尝试过
    otool-tV
    来看看是否能更好地分解它?是的!这样比较好。我可以在汇编代码的右侧看到ascii注释!更重要的是,注释告诉我函数的地址,这样我就可以理解它们在调用什么!竖起大拇指!现在我正在学习AT&T语法来探索Assembly,而且这个命令只显示“Text”部分,正如您从“objdump”中看到的,我们还有全局变量的数据部分、helper函数等等。需要进一步的技巧来探索它。似乎在你已经收到答案后,你在问题中添加了一个新问题。这里不鼓励在堆栈溢出时这样做,因为它会使现有答案无效。简单地回答您的问题,
    LEA
    不是一个循环:它代表加载有效地址,在这里用于将
    0x2bf(%rip)
    的地址加载到寄存器
    %rdi
    。这里之所以使用
    %rip
    ,是因为代码是使用rip相对寻址编译的,这是一个易于搜索的术语。当然,听起来你需要学习一本教x86-64汇编语言的书来理清基础知识
    100000cae:  c3  retq
    100000caf:  90  nop
    /* new function call */
    100000cb0:  55  pushq   %rbp
    ...
    
    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:
    
    ...