原理:因为c语言不会检测数组下标,所以如果我们给数组一个超出它大小的下标,就会照成数组越界。如果是想数组中写入数据的话,就会造成数据写入到不属于数组的地方,或者说如果读取数据的话,就会读取到别的地方的数据。
因为数组地址是自低往高增长,而栈的地址是自高向下降低,所以如果我们将数组下标根据栈内的空间的分布,设置为特定的值,就可以修改或者是查看我们想要查看的地址的值。比如将返回地址设置成我们想要调用函数的地址。
具体可以看一下这篇博客:https://blog.youkuaiyun.com/human_evolution/article/details/40752047
题目:homework (hackme.inndy.tw)
hint: Index out bound ,return address ,并且给了程序源码
题目防护机制:
开启了NX和Canary
源码为:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
char name[1024];
void call_me_maybe()
{
system("/bin/sh");
}
void unbuffer_io()
{
setvbuf(stdin, NULL, _IONBF, 0);
setvbuf(stdout, NULL, _IONBF, 0);
}
void set_timeout()
{
alarm(120);
}
void ask_name()
{
printf("What's your name? ");
gets(name);
}
void say_goodbye()
{
printf("Goodbye, %s\n", name);
}