2016-08-11 16 views
-1

我看了一下ref.x86asm.net手冊,雖然它有很多信息,但我不能真正從它做出正面或反面,因爲我不知道如何解釋寄存器。如何找出movq%rax,%rdi on osx的字節碼?

我使用的是64位代碼,並有附近的線,使用LLDB顯示我以下:

48 89 E5 MOVQ%RSP,RBP%

我從上面的語句89知道的是移動命令。 rsp是源代碼,rbp是目的地(我在osx上)。

在ref.86asm手冊中,它聲明「89」o具有'r'且op1具有r/m16/32/64。 op2有r16/32/64 我擡頭看了一下數值,但真的不明白這一切應該如何解決。我在其他人的回答中看到了REX的參考資料,但不知道這意味着什麼。

XX 89 XX movq%rax,%rdi;我該怎麼做呢?什麼是XX?

我正在編寫自己的字節碼,並通過編寫c,編譯它,然後在lldb中查找它,找出了大部分的東西。不過,如果我能夠更好地理解字節代碼在引用寄存器時的工作方式,我會節省大量時間。

+0

鏈接問題說明了在英特爾手冊中查找編碼src和dst操作數的ModRM字節的文檔的位置。它實際上是在詢問有關使用/ r字段作爲額外操作碼位的指令,與「mov」不同,但重要的一點是您的第3個字節是ModR/M字節,而第一個字節是REX前綴。 –

+0

第一個「XX」是'48' =>這是「REX」前綴,表示該指令使用'%rax',而不是'%eax'。如果沒有REX'48'前綴,那麼'89 E5'將被解碼爲'movd%esp,%ebp'。 ..第二個「XX」是該ModR/M字節。 – Ped7g

+0

[這篇文章](http://wiki.osdev.org/X86-64_Instruction_Encoding)可能會幫助你。 – fuz

回答

3

手工確定相對困難,所以當我必須這樣做時,我會將指令寫入彙編文件中,然後彙編並檢查輸出。我個人使用nasm

你的文件應該是這樣的(注意,這是英特爾的語法,而不是在& t等在你的榜樣):

[BITS 64] 
main: 
    mov rdi, rax 

了我的頭,你nasm file.asm -f bin -o output編譯,然後打開output與十六進制編輯器。 (-f bin告訴nasm做一個平面二進制文件,這是一個二進制文件,只是原始的機器碼。)

Nasm只是其中之一。單指令測試可能更容易。或者,您可以獲得pwntools and use the asm module

其基本思想是:使用匯編程序,而不是試圖手工計算出來。

+0

我認爲OP不希望只是手工確定,他想理解*它是如何工作的,並編寫他自己的[有限]彙編器。無論出於何種原因(也許是教育)。在這種情況下,使用現成工具的捷徑並不能真正幫助您。而且他看起來好像已經知道如何獲得一些指令的真實字節碼,因爲他在這個問題中有'48 89 e5'。 – Ped7g

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

+1

我不認爲這對OP有用。他已經擁有這兩種工具可以給他的所有信息。 – fuz

相關問題