如何解决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
指令而不是您使用的回旋方式直接加载字符串的地址来简化了代码。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。