gpt4 book ai didi

linux - NASM 获取参数并调用 sys_execve

转载 作者:太空宇宙 更新时间:2023-11-04 10:45:43 26 4
gpt4 key购买 nike

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

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

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

最佳答案

你的问题出在这里:

  mov ebx,[ebp+12] ; ebx <- argv[1]
lea ecx,[ebp+12] ; ebx <- &argv[1]

main 的 C 原型(prototype)是: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]

关于linux - NASM 获取参数并调用 sys_execve,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33201648/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com