我正在尝试为execve(/ bin / sh)编写shellcode,但是在理解为什么它不起作用时遇到了一些麻烦。
这是我的.asm代码:
global _start
section .text
_start:
; PUSH 0x00000000 on the Stack
xor rax, rax
push rax
; PUSH //bin/sh in reverse i.e. hs/nib//
push 0x68732f6e
push 0x69622f2f
; Make RDI point to //bin/sh on the Stack using RSP
mov rdi, rsp
; PUSH 0x00000000 using RAX and point RDX to it using RSP
push rax
mov rdx, rsp
; PUSH Address of //bin/sh on the Stack and make RSI point to it using RSP
push rdi
mov rsi, rsp
; RAX = 0, Let's move 59 into AL to avoid nulls in the Shellcode
mov al, 0x3b ; SYS_execve
syscall
我使用“ strace -f -s 10000 -e execve ./shellcode”来查看我的execve命令是否编写正确,并且得到了这个信息:
execve("//bi", ["//bi"], [/* 0 vars */]) = -1 ENOENT (No such file or directory)
--- SIGSEGV {si_signo=SIGSEGV, si_code=SEGV_MAPERR, si_addr=0xfffffffffffffffe} ---
+++ killed by SIGSEGV +++
Segmentation fault
我不明白为什么我只有“ // bin”而不是整个字符串。 我尝试使用更长的字符串,但它仍然相同,仅显示4个字符,但无法正常工作。
顺便说一句,我使用nasm在x86_64上即时通讯,我不明白为什么我不能像pushq 0x0000000000000000
那样推送8个字节(pushq结果带有解析器错误,而使用push时会截断输入)