今天是个好日子!
我试图了解缓冲区溢出是如何工作的。现在,我正在确定函数返回地址的地址,我应该更改它以执行缓冲区溢出攻击。我根据我在互联网上阅读的示例编写了一个简单的程序。这个程序所做的是它创建一个整数指针来存储函数的返回地址在堆栈中的地址。为此,(假设我了解函数/程序变量如何在堆栈中组织),我将 8 添加到缓冲区变量的地址并将其设置为 ret 的值。我在这里没有做任何会改变包含在 func 的返回地址位置中的地址的事情。
更新:我对程序进行了一些修改,所以它打印了 func 的参数 a 的堆栈地址。正如你所看到的,a 和 buffer 之间的距离大约是 8 个字节,所以这可能意味着,根据堆栈布局,保存的 FP 和旧的 EIP(func 返回地址)介于两者之间。我对吗?
这是程序:
void func( int a){
char buffer[3];
int *ret;
ret = buffer + 11; // this is the configuratio which made the whole program works... This now points to the address containing func's return address
printf (" address of a is %d\n", &a);
printf ("address of buffer is %x\n", buffer);
printf ("address of ret is %x\n", ret);
printf ("value of ret is %x\n", (*ret));
}
void main(){
int num;
num = 0;
func(num);
num = 1;
printf("Num now is %d", num);
}
执行时程序的输出:
替代文字 http://img20.imageshack.us/img20/2034/72783404.png
如您所见,我正在打印变量缓冲区和 ret 的地址。我添加了一条额外的语句,打印 ret 变量的值(假设 func 返回地址的位置,所以这应该打印下一条指令的地址,该指令将在 func 从执行返回后执行)。
这是转储,它显示了 func 返回后要执行的指令的假定地址。(绿色下划线)如您所见,该值与变量 ret 中包含的打印值完全不同。
替代文字 http://img717.imageshack.us/img717/8273/assemblycodecopy.png
我的问题是,为什么它们不同?(当然假设我所做的都是正确的)。否则,我做错了什么?我对程序运行时堆栈的理解是错误的吗?请帮助我理解这一点。我的项目将于下周到期,但我几乎没有碰过它。如果我要求很高,我很抱歉,我非常需要你的帮助。