我正在尝试使用execve函数以及命令参数(即'/ bin / ls -l')执行Shellcode。我知道的是,如果shellcode中包含空字节,则无法正常工作。
但是当我将-l参数推入堆栈时,我的shellcode的字节为空,并且工作得很好。为什么?
08048060 <_start>:
;Pushing /x00
8048060: 31 c0 xor eax,eax
8048062: 50 push eax
8048063: 68 6e 2f 6c 73 push 0x736c2f6e ;Pushing //bin/ls
8048068: 68 2f 2f 62 69 push 0x69622f2f
804806d: 89 e3 mov ebx,esp
804806f: 50 push eax
8048070: 89 e2 mov edx,esp
8048072: 50 push eax
8048073: 68 2d 6c 00 00 push 0x6c2d ; Pushing '-l' which has null bytes
8048078: 89 e6 mov esi,esp
804807a: 50 push eax
804807b: 56 push esi
804807c: 53 push ebx
804807d: 89 e1 mov ecx,esp
804807f: b0 0b mov al,0xb
8048081: cd 80 int 0x80
答案 0 :(得分:3)
如果将Shellcode放入可执行缓冲区的向量允许,则Shellcode可以包含空字节。
最知名的向量是单字节以空值结尾的字符串副本(例如strcpy
),在这种情况下,空字节将表示源字符串的末尾,从而阻止了完整shellcode的复制。 >
但是,如果复制操作具有固定的长度(例如结构化协议),或者未使用单字节字符串(例如utf- *),则空字节可能不会提早终止复制。
当然,如果您运行的Shellcode是一个独立程序,那么您将完全跳过复制阶段,不需要特别注意。