[英]NASM getting args and calling sys_execve
我正在尝试编写一个带有两个参数的程序:可执行文件的路径和用于启动该可执行文件的参数。 例:
$ ./程序/ bin / ping 127.0.0.1
但是我编写的代码似乎没有执行任何操作,您能告诉我我做错了什么吗?
global main
section .text
main:
push ebp
mov ebp, esp
check_argc:
mov eax, [ebp + 8] ; eax <- argc
cmp eax, 1
jg do_execve
jmp done
do_execve:
mov eax,11 ; linux system call number (11) - sys_execve
mov ebx,[ebp+12] ; ebx <- argv[1]
lea ecx,[ebp+12] ; ebx <- &argv[1]
mov edx,0
int 0x80
done:
leave
ret
编辑:
对于编译,我使用了:
$ nasm -f elf32 program.asm
$ gcc -lc -m32 program.o -o program.exe
“ check_argc”部分似乎正常工作,我使用puts对其进行了检查。
您的问题出在这里:
mov ebx,[ebp+12] ; ebx <- argv[1]
lea ecx,[ebp+12] ; ebx <- &argv[1]
main的C原型是: int main(int argc, char** argv)
,所以实际上您正在做的是:
mov ebx,[ebp+12] ; ebx <- argv = &argv[0]
lea ecx,[ebp+12] ; ecx <- &argv
您要执行的操作类似于以下内容:
mov ecx, [ebp+12] ; ecx <- &argv[0]
add ecx, 4 ; ecx <- &argv[1]
mov ebx, [ecx] ; ebx <- argv[1]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.