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