缓冲区溢出不按预期工作

时间:2017-03-20 22:39:29

标签: c gdb buffer-overflow

我正在尝试执行缓冲区溢出。我得到它几乎工作,因为EIP指向我的shellcode的第一条指令。但是,在GDB中执行此操作时会产生SIGSEGV,我不明白为什么。

以下是我的程序退出时的情况:

gdb$ run conf160

Program received signal SIGSEGV, Segmentation fault.
--------------------------------------------------------------------------[regs]
  EAX: 0x90909090  EBX: 0x62413961  ECX: 0x00000000  EDX: 0xBFFFFAB0  o d I t S z a P c 
  ESI: 0x31624130  EDI: 0x41326241  EBP: 0x62413362  ESP: 0xBFFFFAE4  EIP: 0xBFFFFB21
  CS: 0073  DS: 007B  ES: 007B  FS: 0000  GS: 0033  SS: 007B
--------------------------------------------------------------------------[code]
=> 0xbffffb21:  xor    eax,eax
   0xbffffb23:  push   eax
   0xbffffb24:  push   0x68732f2f
   0xbffffb29:  push   0x6141622f
   0xbffffb2e:  xor    BYTE PTR [ecx+0x61],al
   0xbffffb31:  xor    DWORD PTR [ecx+0x61],eax
   0xbffffb34:  xor    al,BYTE PTR [ecx+0x61]
   0xbffffb37:  xor    ebp,ecx
--------------------------------------------------------------------------------
0xbffffb21 in ?? ()

为什么程序不执行0xbffffb21处的指令?

由于

1 个答案:

答案 0 :(得分:1)

  

它产生了一个SIGSEGV,我不明白为什么。

最可能的原因是:您的堆栈不可执行。

默认情况下,大多数最新的Linux系统都试图通过将程序与-z noexecstack链接器选项链接来防止堆栈上的可执行代码。

您可以通过运行以下方式检查您的程序是否以这种方式链接:

readelf -Wl conf160 | grep GNU_STACK

典型的输出看起来像这样(最后的RW很重要):

GNU_STACK      0x0000000000000000 0x0000000000000000 0x0000000000000000  0x0000000000000000 0x0000000000000000  RW    8

另见document