繁体   English   中英

NASM获取args并调用sys_execve

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM