2015-12-23 113 views
2

我是新裝配。我試圖通過參考一本名爲「編寫安全工具和漏洞利用」的書來學習。熟悉本書的人都知道彙編代碼是爲32位編寫的,但是我在64位系統上編譯。x86-64彙編代碼未運行

由於這個原因我重寫了在64位上運行的代碼。成功編譯代碼後,當我嘗試運行程序時,所需的輸出未完成。相反,我收到沒有輸出。

我在AMD64 Debian Linux系統上構建這個。這裏是我試圖從接收輸出代碼:

global _start 
_start: 
xor    rax,rax 

jmp short string 
code: 
pop    rsi 
push byte  15 
push   rsi 
push byte  1 
mov    al,4 
push   rax 
int    0x80 

xor    rax,rax 
push   rax 
push   rax 
mov    al,1 
int    0x80 

string: 
call code 
db 'Hello, world !',0x0a 

我編譯使用下面的命令

它$> NASM -f ELF64 hello.asm $> LD -s -o你好你好。

當我嘗試運行沒有輸出。

任何關於我哪裏出錯的建議?

+4

我從這段代碼假設你正試圖爲堆棧創建代碼基於緩衝區的利用。對於64位代碼,你應該真正使用'syscall'而不是'int 0x80',而64位調用約定傳遞寄存器中的大部分'syscall'參數,而不是堆棧。 –

+0

如果你在'strace'下運行你的代碼,你會得到它所做的系統調用的跟蹤,並帶有錯誤代碼。 –

回答

1

您的代碼中主要存在一個大問題,您似乎認爲通過int 0x80系統調用的調用約定(傳遞參數)通過將其推送到堆棧來傳遞。但事實上,您需要通過eaxebxecx(詳情請參閱here)寄存器。

所以,寫代碼的正確方法應該是:

global _start 
_start: 
xor    rax,rax 

jmp short string 
code: 
pop   rsi 
mov   rdx, 15 
mov    rcx, rsi 
mov    rbx, 1 
mov    al,4 
int    0x80 

xor    rax,rax 
mov    rbx, rax 
mov    al,1 
int    0x80 

string: 
call code 
db 'Hello, world !',0x0a 

然後,就這樣做:

$> nasm -f elf64 hello.asm 
$> gcc -nostdlib -o hello hello.o 
+0

感謝大家的所有反饋。 Perror你是對的。你能推薦任何與x64相關的書嗎?大會我可以跟進學習,因爲我的許多閱讀都來自過時的書籍。如果這些都是以安全爲中心的,那將會有很多幫助。 – PeterPaul