尝试将汇编程序字节流作为 C 本机函数执行

Trying to execute a assembler bytestream as a C native function

我试图用我在汇编中编写的 shellcode 地址覆盖 main() 的 return 地址。

我的汇编程序:

ExitShell.asm

SECTION .text
global _start

_start:

    jmp short shellOffset

    Shellcode:

        pop esi
        lea ecx, [esi]
        mov dl, 12
        mov bl, 1
        mov al, 4
        int 0x80
        mov bl, 20
        mov al, 1
        int 0x80    


    shellOffset:

        call Shellcode
        msg db "Hello World",0xa

我正在覆盖 return 地址的 .c 文件:

ShellCode.c

#include<stdio.h>

char shellcode[] = "\xeb\x11\x5e\x8d\x0e\xb2\x0c\xb3\x01\xb0\x04\xcd\x80"\
           "\xb3\x14\xb0\x01\xcd\x80\xe8\xea\xff\xff\xff"\
               "\x48\x65\x6c\x6c\x6f\x20\x57\x6f\x72\x6c\x64\x0a";

    void main()
    {

        int *ret;
        ret = (int *)&ret + 2;
        (*ret) = (int)shellcode;


    }

我使用以下命令编译程序:

gcc -O0 -o sh ShellCode.c -fno-stack-protector -zexec -fno-asynchronous-unwind-tables -g

当我执行程序时,收到分段错误错误。将程序加载到gdb中,我发现它在程序集

中的ret语句中给出了错误
Dump of assembler code for function main:
   0x080483b4 <+0>: push   %ebp
   0x080483b5 <+1>: mov    %esp,%ebp
   0x080483b7 <+3>: sub    [=13=]x10,%esp
   0x080483ba <+6>: lea    -0x4(%ebp),%eax
   0x080483bd <+9>: add    [=13=]x8,%eax
   0x080483c0 <+12>:    mov    %eax,-0x4(%ebp)
   0x080483c3 <+15>:    mov    -0x4(%ebp),%eax
   0x080483c6 <+18>:    mov    [=13=]x804a040,%edx
   0x080483cb <+23>:    mov    %edx,(%eax)
   0x080483cd <+25>:    leave  
=> 0x080483ce <+26>:    ret 

这是什么问题?我无法理解。请帮忙。我是新来的。

这可能有很多原因。您禁用了堆栈粉碎检测器,但这并不意味着 main 中的 ret 将在 return 地址之后立即分配。编译器和链接器在对齐变量地址以提高性能或满足 CPU 对齐要求方面有一些回旋余地。

另一个问题是,shellcode 将被放置在 .data 段中,该段可能被设置为不可执行,因此 main returning 到 shellcode 将触发该陷阱。