通过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