//---------------------------------------------------------------- // myexec.s // // This program demonstrates the Linux kernel's 'sys_execve' // system-call. The kernel expects three arguments: // // int sys_execve( progname, argarray, envarray ); // // If unsuccessful, the function returns a negative integer. // // assemble using: $ as myexec.s -o myexec.o // then link with: $ ld myexec.o -o myexec // // programmer: ALLAN CRUSE // written on: 10 SEP 2004 //---------------------------------------------------------------- .equ sys_exit, 1 # system-call ID-number .equ sys_write, 4 # system-call ID-number .equ sys_execve, 11 # system-call ID-number .section .data progname: .asciz "showhost" arg1: .asciz "a" arg2: .asciz "bb" arg3: .asciz "ccc" argarray: .long progname, arg1, arg2, arg3, 0 var1: .asciz "SCHOOL=University of San Francisco" var2: .asciz "DEPT=Computer Science" var3: .asciz "HOSTNAME=privett" envarray: .long var1, var2, var3, 0 message: .ascii "sys_execve failed\n" msgsize: .long . - message .section .text _start: # invoke system-call: execve( progname, argarray, envarray ); movl $sys_execve, %eax # service ID-number leal progname, %ebx # argument #1 leal argarray, %ecx # argument #2 leal envarray, %edx # argument #3 int $0x80 # enter the kernel # we will return here only if 'execve' was NOT successful movl $sys_write, %eax # service ID-number movl $1, %ebx # device ID-number leal message, %ecx # address of message movl msgsize, %edx # length of message int $0x80 # enter the kernel # terminate this task and return to the shell movl $sys_exit, %eax # service ID-number movl $1, %ebx # status-code (error) int $0x80 # enter the kernel .globl _start # entry-point is public