GAS AT&T汇编程序中的execveargv

问题描述

我的代码:

.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系统调用具有签名

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指令而不是您使用的回旋方式直接加载字符串的地址来简化了代码。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...