2016-05-06 42 views
0

我試圖在64位Asm中模擬安全管execve教程(http://hackoftheday.securitytube.net/2013/04/demystifying-execve-shellcode-stack.html)。我不確定巴士錯誤來自哪裏。我在GDB中通過應用程序,但是直到我失去框架後才發生錯誤。如果有人知道發生了什麼,我很樂意聽取您的意見。Execve調用中OS X x86_64中的總線錯誤

.section __DATA,__data 
.section __TEXT,__text 
.globl _start 
_start: 
    xor %rax, %rax 
    push %rax 
    movabsq $0x68732f6e69622f2f, %rdi 
    push %rax 
    mov %rsp, %rsi 
    push %rdi 
    mov %rsp, %rdx 
    mov $0x2000059, %rax 
    syscall 
+0

一方面,'push'是64位在64位模式,有32位符號擴展立即。所以你最終會在堆疊中使用'2f 2f 62 69 00 00 00 00 6e 2f 73 68 00 00 00 00'。相反,你可以嘗試'movabsq $ 0x68732f6e69622f2f,%rax;推%rax' – Jester

+0

謝謝@Jester。仍然收到巴士錯誤。將更新我的代碼以反映您的指示。 – JLegendre

+1

你加載了'rdi',但是推了'rax'? – Jester

回答

2

下應該更好地工作,但我沒有OSX測試:

.globl _start 
_start: 
    xor %edx, %edx     ; NULL for env 
    movabsq $0x0068732f6e69622f, %rax ; /bin/sh<0> 
    push %rax 
    mov %rsp, %rdi     ; filename 
    push %rdx       ; NULL for argv terminator 
    push %rdi       ; argv[0] = filename 
    mov %rsp, %rsi     ; argv 
    mov $0x200003b, %eax    ; I think 59 is decimal 
    syscall 
+0

這工作!謝謝! – JLegendre

+0

我正在玩弄代碼來縮小我做錯了的部分。我注意到你在推行%rdx(第7行)。這種推動的目的是什麼?我注意到,如果我發表評論,那麼總線錯誤會回來。 – JLegendre

+3

@JLegendre:因爲'sys_execve'需要argv []和/或envp []爲空終止的字符指針數組。沒有NULL指針終止,內核不知道數組的末尾在哪裏。數組的長度不作爲參數傳遞,因此NuLL終止符是一種在處理時識別數組末尾的方法。它的性質與爲什麼一個字符數組以NUL(0)字符結尾的方式類似 - 因此字符串的末尾可以在未被提前告知實際長度的情況下找到 –