2016-05-06 44 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)字符结尾的方式类似 - 因此字符串的末尾可以在未被提前告知实际长度的情况下找到 –