首页 文章

我怎么弄清楚osx上的movq%rax,%rdi的字节码? [重复]

提问于
浏览
-1

这个问题在这里已有答案:

我看了一下ref.x86asm.net手册,虽然它有很多信息,但我可以知道如何解释寄存器 .

我正在使用64位代码并有一个附近的行,lldb向我显示以下内容:

48 89 e5 movq%rsp,%rbp

我从上面的语句中得知89是move命令 . rsp是源码,rbp是目的地(我在osx上) .

在ref.86asm手册中,它表示“89”o有'r'而op1有r / m16 / 32/64 . op2有r16 / 32/64我查找了这些值,但实际上并不明白这一切是如何解决的 . 我在其他人的答案中看到了对REX的引用,但不知道这意味着什么 .

XX 89 XX movq %rax, %rdi ; how do I do this? What are the XX?

我正在编写自己的字节代码,并通过编写c,编译它然后在lldb中查看它来找出大部分内容 . 但是,如果我能更好地理解字节代码在引用寄存器时是如何工作的,那么我会节省很多时间 .

2 回答

  • 3

    手动确定比较困难,所以当我必须这样做时,我会在汇编文件中编写指令,汇编并检查输出 . 我个人使用nasm .

    您的文件看起来像这样(请注意,这是英特尔语法,而不是像您的示例中的AT&T):

    [BITS 64]
    main:
        mov rdi, rax
    

    在我脑海中,您使用 nasm file.asm -f bin -o output 进行编译,然后使用十六进制编辑器打开 output . ( -f bin 告诉nasm做一个平面二进制文件,这是一个只是原始机器代码的二进制文件 . )

    纳斯姆只是其中之一 . 单个指令测试可能更容易Keystone . 或者,您可以获得pwntools and use the asm module .

    基本思想是:使用汇编程序而不是试图手工弄清楚它 .

  • 0

    您可以使用汇编程序( as )来计算字节数,并使用 otool 来打印它们:

    :; echo 'movq %rax, %rdi' | as
    :; otool -tvj a.out
    a.out:
    (__TEXT,__text) section
    0000000000000000    4889c7              movq    %rax, %rdi
    

    请注意, as 默认情况下会写入文件 a.out .

相关问题