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

问题描述 投票:-1回答:1

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

我的装配程序:

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

我的.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    $0x10,%esp
   0x080483ba <+6>: lea    -0x4(%ebp),%eax
   0x080483bd <+9>: add    $0x8,%eax
   0x080483c0 <+12>:    mov    %eax,-0x4(%ebp)
   0x080483c3 <+15>:    mov    -0x4(%ebp),%eax
   0x080483c6 <+18>:    mov    $0x804a040,%edx
   0x080483cb <+23>:    mov    %edx,(%eax)
   0x080483cd <+25>:    leave  
=> 0x080483ce <+26>:    ret 

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

c segmentation-fault return memory-address
1个回答
3
投票

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

另一个问题是,shellcode将放置在.data段中,可能设置为不可执行,因此主要返回shellcode会触发该陷阱。

© www.soinside.com 2019 - 2024. All rights reserved.