运行汇编程序和在shellcode.c中运行反汇编代码之间的区别

时间:2017-04-26 03:16:27

标签: c assembly shellcode

我目前正在研究Pentester Academy的Linux上的x86_64汇编语言和Shellcoding'课程(www.pentesteracademy.com/course?id=7)。我有一个简单的问题,我无法弄清楚:运行已组装并与NASMld相关联的汇编程序与运行相同的反汇编程序之间的确切区别是什么?经典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程序的工作方式。话虽如此,我仍然不完全理解这两种方法的确切方式。

1 个答案:

答案 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系统调用。