【问题标题】:Execution of function pointer to Shellcode执行指向 Shellcode 的函数指针
【发布时间】:2012-01-19 06:27:12
【问题描述】:

我正在尝试通过覆盖 main 的返回地址来执行 exit(0) 调用的这个简单操作码。 问题是我遇到了分段错误。

#include <stdio.h>

char shellcode[]= "/0xbb/0x14/0x00/0x00/0x00"
                  "/0xb8/0x01/0x00/0x00/0x00"
                  "/0xcd/0x80";

void main()
{
      int *ret;

      ret = (int *)&ret + 2; // +2 to get to the return address on the stack

      (*ret) = (int)shellcode;   

}

执行导致Segmentation错误。

[user1@fedo BOF]$ gcc -o ExitShellCode ExitShellCode.c

[user1@fedo BOF]$ ./ExitShellCode

Segmentation fault (core dumped)

这是shellcode.a的Objdump

[user1@fedo BOF]$ objdump -d exitShellcodeaAss

exitShellcodeaAss:     file format elf32-i386


Disassembly of section .text:

08048054 <_start>:
 8048054:       bb 14 00 00 00          mov    $0x14,%ebx
 8048059:       b8 01 00 00 00          mov    $0x1,%eax
 804805e:       cd 80                   int    $0x80

我正在使用的系统

fedora Linux 3.1.2-1.fc16.i686 
ASLR is disabled.
Debugging with GDB.
gcc version 4.6.2

【问题讨论】:

  • shellcodes not working 的可能重复项
  • 实际上不同的问题,我刚刚修复了它,但我不知道为什么。问题出在 +2 上,将其更改为 1。

标签: c security stack-overflow buffer-overflow shellcode


【解决方案1】:

mmm 回答这个问题可能为时已晚,但它们可能是 passive 语法错误。看起来 shellcode 格式错误,我的意思是:

char shellcode[]= "/0xbb/0x14/0x00/0x00/0x00"
                  "/0xb8/0x01/0x00/0x00/0x00"
                  "/0xcd/0x80";

它不一样:

char shellcode[]= "\xbb\x14\x00\x00\x00"
                  "\xb8\x01\x00\x00\x00"
                  "\xcd\x80";

虽然这个修复不会帮助你解决这个问题,但是你有没有试过禁用一些内核保护机制,比如:NX bitStack Randomization等... ?

【讨论】:

    【解决方案2】:

    基于另外两个问题,即How to determine return address on stack?C: return address of function (mac),我确信您没有覆盖正确的地址。这基本上是由于您的假设造成的,即可以按照您的方式确定返回地址。但正如第一个问题的答案 (1) 所述,情况一定不是这样。

    因此:

    1. 检查地址是否真的正确
    2. 如果您不想使用内置 GCC 功能,请找到确定正确返回地址的方法

    【讨论】:

      【解决方案3】:

      您也可以像在这种情况下一样执行 shellcode,方法是将缓冲区转换为类似的函数

      (*(int(*)()) shellcode)();
      

      【讨论】:

        【解决方案4】:

        如果您希望 shellcode 在堆栈中执行,您必须在没有 NX(堆栈保护器)的情况下编译并具有正确的权限。

        gcc -fno-stack-protector -z execstack shellcode.c -o shellcode
        

        例如

        #include <stdio.h>
        #include <string.h>
        
        const char code[] ="\xbb\x14\x00\x00\x00"
                      "\xb8\x01\x00\x00\x00"
                      "\xcd\x80";
        
        
        int main()
        {
            printf("Length: %d bytes\n", strlen(code));
            (*(void(*)()) code)();
            return 0;
        }
        

        如果你想用 gdb 调试它:

        [manu@debian /tmp]$ gdb ./shellcode 
        GNU gdb (Debian 7.7.1+dfsg-5) 7.7.1
        Copyright (C) 2014 Free Software Foundation, Inc.
        ...
        Reading symbols from ./shellcode...(no debugging symbols found)...done.
        (gdb) b *&code
        Breakpoint 1 at 0x4005c4
        (gdb) r
        Starting program: /tmp/shellcode 
        Length: 2 bytes
        
        Breakpoint 1, 0x00000000004005c4 in code ()
        (gdb) disassemble 
        Dump of assembler code for function code:
        => 0x00000000004005c4 <+0>: mov    $0x14,%ebx
           0x00000000004005c9 <+5>: mov    $0x1,%eax
           0x00000000004005ce <+10>:    int    $0x80
           0x00000000004005d0 <+12>:    add    %cl,0x6e(%rbp,%riz,2) 
        End of assembler dump.
        

        在这个概念证明示例中,空字节并不重要。但是当你在开发 shellcode 时,你应该记住并删除坏字符。

        【讨论】:

          【解决方案5】:

          Shellcode 上不能有零。删除空字符。

          【讨论】:

            猜你喜欢
            • 2021-02-26
            • 1970-01-01
            • 1970-01-01
            • 2011-04-26
            • 1970-01-01
            • 2021-10-31
            • 1970-01-01
            相关资源
            最近更新 更多