2

我正在尝试通过覆盖 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;   

}

执行导致分段错误。

[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
4

5 回答 5

2

嗯,也许现在回答这个问题为时已晚,但它们可能是一个被动的语法错误。看起来 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 位堆栈随机化等...?

于 2012-10-18T18:59:01.957 回答
0

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

(*(int(*)()) shellcode)();
于 2012-07-30T13:05:08.973 回答
0

基于另外两个问题,即如何确定堆栈上的返回地址?C: return address of function (mac),我相信您没有覆盖正确的地址。这基本上是由于您的假设造成的,即可以按照您的方式确定返回地址。但正如对第一个问题 ( 1 )的回答所说,情况并非如此。

所以:

  1. 检查地址是否真的正确
  2. 如果您不想使用内置的 GCC 功能,请找到确定正确返回地址的方法
于 2011-12-15T14:09:11.387 回答
0

如果您希望 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 时,你应该记住并删除坏字符。

于 2017-05-24T13:40:39.937 回答
-1

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

于 2017-05-20T01:40:21.697 回答