最近我在研究缓冲区溢出技术,并试图自己制作一个简单的示例,以便更好地了解如何利用这种漏洞。
我写了一个简单的c程序:

//bof.c
#include <stdio.h>
#include <string.h>

void
BOF() {
   printf("BOF");
}

void
foo1(char* argv){
  char buff[10];
  strcpy(buff, argv);
  printf("foo1");
}

int
main(int argc, char* argv[])
{

  if ( argc < 1 ) {
    return 0;
  }
  foo1(argv[1]);
  return 0;
}

我的目标是利用BOF漏洞,以便跳转到未调用的函数BOF(),从而打印消息。
为此,我有:
编译程序:gcc-ggdb-m64-o bof.o-fno stack protector-mprefered stack boundary=4 bof.c
发现了BOF()地址:objdump-d BOF.o | grep BOF(给我0000000000400544)
在gdb中执行程序以查看寄存器中发生了什么
在gdb内部,我会:
但什么也没发生程序正常结束所以我在strcpy函数后面放了一个断点来查看寄存器,我得到的是:
rax            0x7ffffffeca20   140737488276000
rbx            0x0  0
rcx            0x7ffff7ab1f00   140737348574976
rdx            0x400544 4195652
rsi            0x7fffffffb8cd   140737488337101
rdi            0x7ffffffeca20   140737488276000
rbp            0x7ffffffeca30   0x7ffffffeca30
rsp            0x7ffffffeca10   0x7ffffffeca10
r8             0x400660 4195936
r9             0x7ffff7de9740   140737351948096
r10            0x7ffffffec7a0   140737488275360
r11            0x7ffff7b8fec0   140737349484224
r12            0x400460 4195424
r13            0x7ffffffecb30   140737488276272
r14            0x0  0
r15            0x0  0
rip            0x40057b 0x40057b <foo1+31>
eflags         0x206    [ PF IF ]
cs             0x33 51
ss             0x2b 43
ds             0x0  0
es             0x0  0
fs             0x0  0
gs             0x0  0

为什么寄存器没有被覆盖我试图用更大的值修改1500参数,但没有改变我也尝试了一些小的值(比如50或更少),但我得到了相同的结果。
我还试图在堆栈中写入与地址不同的内容,只是想看看寄存器是否被覆盖例如,使用perl-e'print“A”x1500,我只能修改rbp寄存器,而不能修改rip但我通过阅读这个网站上的一个线程发现,在gdb上可能会发生这种情况,并尝试使用一个有效的地址所以我做了。
我做错什么了有没有可能BOF在现在的谷物中不太可行呢?
在忘记之前:我还删除了gdb limit元素以删除元素限制,使用:set print elements 0
最后,就像你可能已经找到看寄存器,我有一台64位的Ubuntu12.04机器(内核版本3.5.0-39-generic)。
提前谢谢。

最佳答案

内核中的安全性可以避免基本缓冲区溢出。
您可以尝试damn vulnerable linux来实现缓冲区溢出
或者你可以在你的电脑上禁用这些保护look atthat

08-19 17:59