Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/114.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过x86程序集从argv读取文件名_X86_Nasm_Argv - Fatal编程技术网

通过x86程序集从argv读取文件名

通过x86程序集从argv读取文件名,x86,nasm,argv,X86,Nasm,Argv,我正在尝试读取传递给可执行文件的文件名,并使用汇编语言写入该文件。它编译时没有错误,但执行时失败。我的代码到底出了什么问题 BITS 32 segment .data text db "text" segment .text global main main: pop ebx pop ebx pop ebx ; pop pointer to filename into ebx mov eax,0x5 ;syscall open mov ecx,0x2 ;flag read/w

我正在尝试读取传递给可执行文件的文件名,并使用汇编语言写入该文件。它编译时没有错误,但执行时失败。我的代码到底出了什么问题

BITS 32
segment .data
text db "text"

segment .text

global main

main:
pop ebx 
pop ebx
pop ebx    ; pop pointer to filename into ebx
mov eax,0x5  ;syscall open
mov ecx,0x2   ;flag read/write
int 0x80   ;call kernel
mov ebx,eax   ;save returned file descriptor
mov eax,0x4 ; write syscall
mov ecx,text ;mov pointer to text into ecx
mov edx,0x4 ;string length
int 0x80  ;exit syscall
mov eax,0x1
int 0x80

由于您是从libc打来的,所以您还必须记住您有回信地址,以便您可以返回那里。这不同于如果你只是有一个简单的组装程序(就像很多教程一样!)。考虑到这一点:

pop ebx    ;; pops return address to libc caller (_start usually)
pop ebx    ;; pops argc
pop ebx    ;; pops argv !!WAS!!: ; pop pointer to filename into ebx
下面是打印第一个参数的方法。你应该能够从那里开始(注意:我可能会犯错误):


进入main时:堆栈具有以下内容:

...
*envp[]
*argv[]
argc
return address
当您三次
弹出ebx
时,您最终访问的是
argv
,而不是
argv[1]


argv
是指向以NULL结尾的
char*
数组的指针,因此您必须按照@user786653所示的间接方式操作。

首先,您要从一个4字节的字符串中写入5个字节(字符串在汇编中不会自动以零结尾)。在发布代码之前,我忘了更改该位。我已经更改了我的文本字符串。另一件事:您不是在使用C等价的
argv[0]
作为文件名吗?谢谢。非常感谢你的回答。
...
*envp[]
*argv[]
argc
return address