wKiom1b_sJ3TJk8DAAAfAvdABVs720.png

#include<stdio.h>
#include<stdlib.h>

void bug()
{
	system("reboot");
	exit(0);
}
int stack_test1(int a,int b)
{
    printf("before write : ox%x\n",b);
    int *p=&a;
    p++;
    *p=0xdddd;
    printf("after write :ox%x\n",b);
    int c=0xcccc;
    return c;
}
int stack_test2(int a,int b)
{
	int* p = &a;
	p --;
	*p = (int)bug;
	int c = 0xcccc;
	return c;
}
int main()
{
    int a=0xaaaa;
    int b=0xbbbb;
    //int ret=stack_test1(a,b);
    int ret=stack_test2(a,b);
    printf("you should run here\n");
    return 0;
}

分析:
stack_test1中实现的是通过指针改变临时变量的值,stack_test1()函数中a和b是临时变量,变量b先被压入栈,a后被压入,
由于栈是由高地址向低地址扩展,所以b的地址比a的地址高,指针p加一后由原来的指向a指向了b,此时通过修改p所指向的内容
即修改了b的值。

stack_test2中p只是一个普通你给的指针变量,当参数b和a先后被压入栈中,紧接着把返回地址压入栈中,图中ebp和esp所
指的是当前栈帧,函数stack_test2()中通过指针变量p把返回地址修改为函数bug的入口地址,所以stack_test2()执行完之后
会去执行bug这个函数,执行system("reboot")语句时会重启系统,进程结束。