操作数顺序是xcrun otool和capstone,IDA之间的区别

时间:2017-02-17 10:17:28

标签: assembly otool

所以我有一个简单的hello world程序:

#include <stdio.h>
int main(int argc, char *argv[])
{
    printf("Hello World!\n");
    return 0;
}

如果我们在x86_64上编译并获取二进制文件,并打印其asm代码和机器代码:

asm代码:

% xcrun otool -v -t a.out
a.out:
(__TEXT,__text) section
_main:
0000000100000f30    pushq   %rbp
0000000100000f31    movq    %rsp, %rbp
0000000100000f34    subq    $0x20, %rsp
0000000100000f38    leaq    0x4b(%rip), %rax
0000000100000f3f    movl    $0x0, 0xfffffffffffffffc(%rbp)
0000000100000f46    movl    %edi, 0xfffffffffffffff8(%rbp)
0000000100000f49    movq    %rsi, 0xfffffffffffffff0(%rbp)
0000000100000f4d    movq    %rax, %rdi
0000000100000f50    movb    $0x0, %al
0000000100000f52    callq   0x100000f68
0000000100000f57    movl    $0x0, %ecx
0000000100000f5c    movl    %eax, 0xffffffffffffffec(%rbp)
0000000100000f5f    movl    %ecx, %eax
0000000100000f61    addq    $0x20, %rsp
0000000100000f65    popq    %rbp
0000000100000f66    ret

和机器代码:

% xcrun otool -s __TEXT __text a.out 
a.out:
(__TEXT,__text) section
0000000100000f30 55 48 89 e5 48 83 ec 20 48 8d 05 4b 00 00 00 c7 
0000000100000f40 45 fc 00 00 00 00 89 7d f8 48 89 75 f0 48 89 c7 
0000000100000f50 b0 00 e8 11 00 00 00 b9 00 00 00 00 89 45 ec 89 
0000000100000f60 c8 48 83 c4 20 5d c3

如果我尝试使用keystone转换'mov rsp rbp',它会给我机器代码:

  

0x48 0x89 0xec

与otool的48 89 e5

不同

经过一番尝试和搜索,我发现otool的操作数顺序是左 - >&gt;但是,keystone或IDA对待订单是正确的 - &gt;左

有人可以帮助我,为什么otool打印相反的顺序?

我检查了英特尔的asm手册,订单也是对的 - &gt;剩下。所以我不明白为什么otool以其他方式打印操作数。

0 个答案:

没有答案