asm_execve.s:
.section .data file_to_run: .ascii“ / bin / sh” .section .text .globl主 主要: Pushl%ebp move%esp,%ebp subl $ 0x8,%esp#两个指针组成的数组。数组[0] = file_to_run数组[1] = 0 movl file_to_run,%edi movl%edi,-0x4(%ebp) movl $ 0,-0x8(%ebp) movl $ 11,%eax#sys_execve movl file_to_run,%ebx#要执行的文件 leal -4(%ebp),%ecx#命令行参数 movl $ 0,%edx#环境块 整数$ 0x80 离开 退回
生成文件:
NAME = asm_execve $(NAME):$(NAME).s gcc -o $(NAME)$(NAME).s
程序已执行,但未调用sys_execve:
alex @ alex32:〜/ project $ make gcc -o asm_execve asm_execve.s alex @ alex32:〜/ project $ ./asm_execve alex @ alex32:〜/ project $
预期输出为:
alex @ alex32:〜/ project $ ./asm_execve $出口 alex @ alex32:〜/ project $
该Assembly程序应该像以下C代码一样工作:
char * data [2]; data [0] =“ / bin / sh”; 数据[1] = NULL; execve(数据[0],数据,NULL);
系统调用参数有问题吗?
该execve系统调用 时 被调用,但你确实传递错误参数。
execve
(您可以通过使用运行可执行文件来查看此内容strace。)
strace
存在三个问题:
.ascii不以0结尾的字符串。(您可能会很幸运,因为.data在此示例中的本节中没有任何内容,但是不能保证…)添加0或使用.asciz(或.string)代替。
.ascii
.data
.asciz
.string
movl file_to_run, %edi移动的值 指向 由所述file_to_run符号到%edi,即,第一个4个字节的字符串(0x6e69622f)。字符串的 地址 只是符号本身的值,因此您需要对$字面值使用前缀:movl $file_to_run, %edi。同样,您需要说movl $file_to_run, %ebx几行。(这是AT&T语法和Intel语法之间常见的混淆源!)
movl file_to_run, %edi
file_to_run
%edi
0x6e69622f
$
movl $file_to_run, %edi
movl $file_to_run, %ebx
参数以错误的顺序放在堆栈上:-0x8(%ebp)比的地址低-0x4(%ebp)。因此,应该将命令字符串的地址写入-0x8(%ebp),将0写入-0x4(%ebp),将leal指令写入leal -8(%ebp), %ecx。
-0x8(%ebp)
-0x4(%ebp)
leal
leal -8(%ebp), %ecx
固定代码:
.section .data file_to_run: .asciz "/bin/sh" .section .text .globl main main: pushl %ebp movl %esp, %ebp subl $0x8, %esp # array of two pointers. array[0] = file_to_run array[1] = 0 movl $file_to_run, %edi movl %edi, -0x8(%ebp) movl $0, -0x4(%ebp) movl $11, %eax # sys_execve movl $file_to_run, %ebx # file to execute leal -8(%ebp), %ecx # command line parameters movl $0, %edx # environment block int $0x80 leave ret