标签:
前面说到可变长参数:
最后重要的是:第一个参数为后面的参数的形式,format.i.e. printf
在这篇中想说的是不安全的问题 -.-!其实就是我瞎搞
先上代码
#include <stdio.h> #include <stdlib.h> #include <stdarg.h> void subfunc(char *format,...){ int i; va_list ap; va_start(ap,format); for(i=0;format[i]!=‘\0‘;i++){ switch(format[i]){ case ‘s‘: printf("%s\n",va_arg(ap,char*)); break; case ‘d‘: printf("%d\n",va_arg(ap,int)); break; default: printf("format over.\n"); break; } } va_end(ap); return; } void func(){ int a[100]; int i=0; for(i=0;i<100;i++) a[i]=-1; subfunc("ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd",1); return; }; int main(void) { int pause; func(); scanf("%d",&pause); return 0; }
在这个代码中,我想做的:在子函数(或者说函数栈上方的函数)去读取函数栈下面函数的数据。
在可变长参数的函数的写法中,一个参数是后面参数的形式,所以如果我们在第一个参数后面提供的参数数量,和第一个参数要求的数量不同。那么就应该读取到函数栈下面的数据。
既然可以读到函数栈下面的函数的数据,那么自然可以获得下面函数的返回地址等信息,那么可以伪装返回?有待测试……
标签:
原文地址:http://www.cnblogs.com/yoru/p/4696316.html