【发布时间】:2021-02-01 07:32:00
【问题描述】:
我的代码:
.section .data
name: .string "/bin/sh"
args:
.string "-c"
.string "ls"
.section .text
.globl _start
_start:
pushq $0
pushq name
movq $59, %rax
movq %rsp, %rdi
pushq $0
pushq args
movq %rsp, %rsi
movq $0, %rdx
syscall
我知道execve 的第二个参数是字符数组。
如何在汇编中避免这种情况:
execve("./payload", ["./payload"], 0x7ffc291fd160 /* 40 vars */) = 0
execve("/bin/sh", [0x736c00632d], NULL) = -1 EFAULT (Bad address)
--- SIGSEGV {si_signo=SIGSEGV, si_code=SEGV_MAPERR, si_addr=0xfffffffffffffff2} ---
+++ killed by SIGSEGV +++
Segmentation fault
【问题讨论】:
-
execve的第二个参数是指向字符指针数组的指针,即字符串数组,而不是字符数组。这就是您的代码不起作用的原因。 -
如果我将 .asciz 更改为 .string 相同的输出
-
这最终是为了缓冲区利用吗?
-
这是我的第一个shellcode,我是CTF学生。
-
@EntyAV 这不会改变任何东西;
.asciz是.string的别名。您需要一个字符串数组,而不是字符数组。也就是说,一个指向字符数组的指针数组。最后一个指针必须是NULL并且每个字符数组中的最后一个字符必须是 NUL 字符(.asciz确保为您提供)。
标签: assembly x86-64 system-calls shellcode execve