我的/ bin / ls -l Shellcode如何处理空字节?

时间:2019-03-17 12:01:33

标签: x86 nasm shellcode

我正在尝试使用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

1 个答案:

答案 0 :(得分:3)

如果将Shellcode放入可执行缓冲区的向量允许,则Shellcode可以包含空字节。
最知名的向量是单字节以空值结尾的字符串副本(例如strcpy),在这种情况下,空字节将表示源字符串的末尾,从而阻止了完整shellcode的复制。 > 但是,如果复制操作具有固定的长度(例如结构化协议),或者未使用单字节字符串(例如utf- *),则空字节可能不会提早终止复制。

当然,如果您运行的Shellcode是一个独立程序,那么您将完全跳过复制阶段,不需要特别注意。