繁体   English   中英

逆向Mach-O 64位x86汇编分析

[英]Reversed Mach-O 64-bit x86 Assembly analysis

该问题供英特尔x86组装专家解答。 感谢您的预先努力!

问题规格

我正在分析一个二进制文件,该文件与Mach-O 64位x86 Assembly相匹配。 我目前正在使用MacOS 64 OS。 该程序集来自objdump

问题是,当我学习汇编时,可以看到变量名“ $ xxx”,可以看到ascii中的字符串值,还可以看到被叫者名称,如“ call _printf”

但是在这个程序集中,我什么都没得到:

  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 ... 

    以上是将要执行的代码帧,但是我不知道它在哪里执行。

另外,我是AT&T的新手。 因此,您能告诉我指令的含义是什么:

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

是循环吗? 我不确定,但事实似乎如此。 以及为什么我们使用%rip和%rdi寄存器。 在Intel x86中,我知道EIP代表当前的呼叫者地址,但是我不明白这里的含义。

  1. 调用整数:无论他们使用哪种调用约定,我都从未见过像“调用616”这样的代码模式:

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

     100000cae: c3 retq 100000caf: 90 nop /* new function call */ 100000cb0: 55 pushq %rbp ... 

    太荒谬了!

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

但是,此文件中没有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: ... 

由于它可能是病毒,因此我无法执行它。 我应该如何分析?

5月21日更新

我已经确定了输出在哪里,如果我完全理解该程序中表示的数据流管道,我也许能够找出可能的解决方案。

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

5月22日更新

我在VirtualBox中安装了MacOS,并在获得chmod特权后执行了该程序,但除了两行输出外,没有其他特别的事情。 并将结果隐藏在二进制文件中。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM