请解释我的程序集Shellcode的缺失行。什么是EXECVE参数?

问题描述:

我知道它做了什么,但我真的很喜欢解释为什么?请解释我的程序集Shellcode的缺失行。什么是EXECVE参数?

SECTION .data 
     global _start 
_start: 
     jmp j ;jump to 'j' label 
r: 
     pop ebx ;Pop the address of 'shell' into EBX. Parameter is Filename 
     xor eax, eax ; clear EAX register 
     mov BYTE[ebx+7], al ;push one NUL byte to end any string reading 
     mov DWORD[ebx+8], ebx ;mov address of EBX into the content EBX (offset of 8) 
     mov DWORD[ebx+12], eax ;mov 4 NUL bytes at EBX (offset of 12) 
     mov al, 11d ;execve system call 
     lea ecx, [ebx+8] ; HELP 
     lea edx, [ebx+12] ; HELP 
     int 80h ;Kernel call 
j:  call r ;call r... pushes 'shell' address onto the stack 
shell: db "/bin/sh" ;file name 

具体来说,我想知道:
1)什么是execve的的3个参数(我已经看过了man 2 execve并没有帮助)
2)究竟是什么LEA做这个案例?

您对mov DWORD[ebx+8], ebxmov DWORD[ebx+12], eax的意见是错误的或至少是误导性的。

标签'shell'处的字节是'/ bin/sh',它使得7个字节,并且mov BYTE[ebx+7], al终止这个字符串以空字节。

下一条语句mov DWORD[ebx+8], ebx将ebx(它是指向shell的指针)的内容移动到shell后面的4个字节。

之后,mov DWORD[ebx+12], eax将零移动到下4个字节。因此,我们有以下的存储器布局,其中bxbxbxbx是这个存储器块的开始地址:

bx         value=bx, points to /bin/sh 
    |        ___________ 
    v        /   \ 
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+ 
|/| b | i | n |/| s | h |\0 |bx |bx |bx |bx | 0 | 0 | 0 | 0 | 
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+ 

两个LEA指令移动(BX + 8)和(BX + 12)的地址,以CX和dx,分别。你可以用MOV CX, BX; ADD CX, 8; MOV DX, BX; ADD DX,12替换它们。

bx 
    | 
    v 
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+ 
|/| b | i | n |/| s | h |\0 |bx |bx |bx |bx | 0 | 0 | 0 | 0 | 
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+ 
           ^   ^
            cx    dx 

现在,如果你看一下execvp:

第一个参数,在BX,是一个指向包含要执行的文件的名称的字符串。那是/bin/sh。 cx中的第二个参数是一个指向要传递给程序以作为argv执行的字符串数组的指针。在这里,它由一个指向“/ bin/sh”的指针和一个NULL指针组成。 NULL指针用作数组终结符(参见execve docs),因为没有明确的数组长度。 dx中的第三个参数是指向新进程环境的指针 - 因为它是一个指向NULL指针的指针,新进程不会从您那里继承任何环境变量。

+0

美丽的解释。 Upvoted和接受。 – Goodies