很抱歉,这个问题必须经过千次询问和解释,但我不知道为什么这段代码会给我一个分段错误。 使用nasm编译为elf 64并且喜欢使用ld。
BITS 64 ;
xor rax, rax ;
mov rax, 0x3b ; LinuxX64 exevce
push 0x68732f2f ;
push 0x6e690b2f ;
pop rbx ; Argv[0] /bin//sh
xor rcx, rcx ;
push rcx ;
push rbx ;
pop rcx ; Argv[1] /bin//sh0
xor rsi, rsi ; just need any GP register
push rsi ;
pop rdx ; Argv[2] 0
syscall ;
答案 0 :(得分:0)
实际上很多事情都是错误的,首先是64位,如果我们必须使用堆栈,则参数将作为 rdi,rsi,rdx,rcx,传递。
BITS 64 ;
xor rax, rax ;
mov al, 0x3b ; EXECVE -> al other wise we get null bytes
xor rcx, rcx ;
push rcx ; PUSH A NULL BYTE
mov rdi, 0x68732f2f6e69622f ; /*
push rdi ; use the stack to fill rdi '"/bin//sh"0'
mov rdi, rsp ; */
xor sil, sil ; Argv[2] -> sil otherwise we ge null bytes
syscall ;