【问题标题】:execve() argv in GAS AT&T assemblerGAS AT&T 汇编器中的 execve() argv
【发布时间】: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


【解决方案1】:

execve 系统调用有签名

execve(const char *path, char *const argv[], char *const envp[]);

参数向量是一个字符串数组,即指向字符数组的指针数组的指针。但是,您提供了一个指向字符数组的指针,这是不正确的并且不起作用。要解决此问题,请添加一个引用您的参数的指针数组:

        .section .data
name:   .string "/bin/sh"
arg1:   .string "-c"
arg2:   .string "ls"

args:   .quad name
        .quad arg1
        .quad arg2
        .quad 0

        .section .text
        .globl _start
_start: movq $59, %rax
        leaq name(%rip), %rdi
        leaq args(%rip), %rsi
        movq $0, %rdx

        syscall

看看args 现在是如何成为一个以NULL 结尾的指向参数的指针数组。另请注意,第一个参数(在索引 0 处)通常是程序名称本身。它不会像预期的那样在那里传递一个实际的选项。

我还通过使用lea 指令而不是您使用的迂回方式直接加载字符串的地址来简化代码。

【讨论】:

  • 这最终将成为 shellcode,因此他们试图在堆栈上构建参数是有原因的。我相信在这里更可取的答案是在堆栈上构建参数并将地址传递给堆栈数据到syscall
  • @MichaelPetch 我的回答旨在解释所需的数据结构。让它作为 shell 代码工作仍然是 OP 的问题。
  • @fuz 如何使它作为 shellcode 工作,我是新手,不明白为什么生成的 shellcode 调用非法指令错误。也许我应该在 NASM 中编写有效载荷,而不是 GAS。
  • @EntyAV 汇编程序的选择并不重要。有多种方法可以在 shell 代码中完成这项工作。作为初学者,这有点困难,并不是我推荐的真正任务。一般的想法是在堆栈上构建数组,而不是将它们放在数据部分中。
猜你喜欢
  • 2021-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-31
  • 2011-07-11
相关资源
最近更新 更多