【问题标题】:NASM getting args and calling sys_execveNASM 获取参数并调用 sys_execve
【发布时间】:2016-01-17 01:06:53
【问题描述】:

我正在尝试编写一个带有两个参数的程序:可执行文件的路径和启动该可执行文件的参数。 示例:

$ ./program /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 程序.o -o 程序.exe

“check_argc”部分似乎有效,我用 puts 进行了检查。

【问题讨论】:

  • 次要注意:每当您 jg 围绕 jmp 而没有其他内容时,您可以将 jle 替换为 jmp 的目标。不过,这不是你的问题。你在链接 libc 吗?
  • @Lorehead 是的,我使用了“extern puts”

标签: linux x86 nasm


【解决方案1】:

你的问题在这里:

  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]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-09
    • 2021-01-04
    • 2021-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多