这个问题在这里已有答案:
我看了一下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 回答
手动确定比较困难,所以当我必须这样做时,我会在汇编文件中编写指令,汇编并检查输出 . 我个人使用nasm .
您的文件看起来像这样(请注意,这是英特尔语法,而不是像您的示例中的AT&T):
在我脑海中,您使用
nasm file.asm -f bin -o output
进行编译,然后使用十六进制编辑器打开output
. (-f bin
告诉nasm做一个平面二进制文件,这是一个只是原始机器代码的二进制文件 . )纳斯姆只是其中之一 . 单个指令测试可能更容易Keystone . 或者,您可以获得pwntools and use the asm module .
基本思想是:使用汇编程序而不是试图手工弄清楚它 .
您可以使用汇编程序(
as
)来计算字节数,并使用otool
来打印它们:请注意,
as
默认情况下会写入文件a.out
.