这个问题是针对英特尔x86汇编专家的回答。感谢你提前付出的努力!
我正在分析一个二进制文件,它匹配 Mach-O 64位x86程序集。我目前正在使用MacOS 64操作系统。该程序集来自 objdump 。
问题在于,当我学习汇编时,我可以看到变量名称" $ xxx",我可以看到ascii中的字符串值,我也可以看到被叫者名称,如"调用_printf& #34;
但是在这个集会中,我什么也得不到:
没有主要功能:
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代表当前的来电地址,但我不明白这里的含义。
调用整数: 无论他们使用什么电话会议,我都没见过类似#34;拨打616"
"100000cd0: e8 bb ff ff ff callq -69 <__mh_execute_header+C90>"
后退: 退入intel x86,意味着删除堆栈帧并将控制流返回给调用者。它应该是一个独立的功能。但是,在此之后,我们可以看到像
这样的代码100000cae: c3 retq
100000caf: 90 nop
/* new function call */
100000cb0: 55 pushq %rbp
...
太荒谬了!
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权限之后,我执行了该程序,但除了两行输出之外没什么特别的。并将结果隐藏在二进制文件中。
答案 0 :(得分:2)
main
。二进制标头包含入口点地址。call 616
没什么特别的,只是你没有(全部)符号。 objdump没有为你计算地址有点奇怪,但它应该是0x100000ca6+616
。