Macos 反向Mach-O 64位x86汇编分析
此问题由英特尔x86汇编专家回答。提前感谢您的努力 问题说明 我正在分析一个二进制文件,它与Mach-O 64位x86汇编相匹配。我目前正在使用MacOS 64操作系统。程序集来自对象泵 问题是,当我学习汇编时,我可以看到变量名“$xxx”,可以看到ascii格式的字符串值,还可以看到被调用方的名称,如“call\u printf” 但在这次大会上,我无法得到任何东西: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:
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
...
上面的代码框架将被执行,但我不知道它在哪里执行 0000000100000c90 pushq %rbp
0000000100000c98 leaq 0x2bf(%rip), %rdi ## literal pool for: "xxxx\n"
...
0000000100000cd0 callq 0x100000c90
它是一个环吗?我不确定,但似乎是这样。以及为什么我们使用%rip和%rdi寄存器。在intel x86中,我知道EIP代表当前的呼叫方地址,但我不理解这里的含义
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:
...
main
。二进制头包含入口点地址0x100000ca6+616
main
。二进制头包含入口点地址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:
...