我正在尝试执行缓冲区溢出。我得到它几乎工作,因为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处的指令?
由于
答案 0 :(得分:1)
它产生了一个SIGSEGV,我不明白为什么。
最可能的原因是:您的堆栈不可执行。
默认情况下,大多数最新的Linux系统都试图通过将程序与-z noexecstack
链接器选项链接来防止堆栈上的可执行代码。
您可以通过运行以下方式检查您的程序是否以这种方式链接:
readelf -Wl conf160 | grep GNU_STACK
典型的输出看起来像这样(最后的RW
很重要):
GNU_STACK 0x0000000000000000 0x0000000000000000 0x0000000000000000 0x0000000000000000 0x0000000000000000 RW 8
另见document。