1.一段具有缓冲区溢出的代码
#include "stdio.h"
#include "string.h"
#include <windows.h>
char payload[] = "aaaaaaaabbbbbbbbbbbbxxxx";
void exp()
{
system("whoami");
}
void func()
{
char buffer[8];
strcpy(buffer,payload);
printf("%s",buffer);
}
int main(){
func();
getchar();
return 0;
}
2.原因是strcpy()函数没有检查copy的长度而导致的溢出
简单的说缓冲区溢出漏洞的原理就是因为输入了过长的字符,而缓冲区本身又没有有效的验证机制,导致过长的字符将返回地址覆盖掉,当函数需要返回的时候,由于此时的返回地址是一个无效地址,因此导致程序出错。
利用: 假设所覆盖的返回地址是一个有效地址,而在该地址处又包含着有效的指令,那么系统就会毫不犹豫地跳到该地址去执行指令。
3.调用func函数的压栈
4.编译代码,用Ollydbg进行加载分析,一开始的地址并不是main 函数,所以需要定位到 main 函数的地址