C 可变长参数

前面说到可变长参数:

最后重要的是:第一个参数为后面的参数的形式,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]!='';i++){
        switch(format[i]){
            case 's':
              printf("%s
",va_arg(ap,char*));
              break;
            case 'd':
                printf("%d
",va_arg(ap,int));
                break;
            default:
                printf("format over.
");
                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;
}
C code

在这个代码中,我想做的:在子函数(或者说函数栈上方的函数)去读取函数栈下面函数的数据。

在可变长参数的函数的写法中,一个参数是后面参数的形式,所以如果我们在第一个参数后面提供的参数数量,和第一个参数要求的数量不同。那么就应该读取到函数栈下面的数据

既然可以读到函数栈下面的函数的数据,那么自然可以获得下面函数的返回地址等信息,那么可以伪装返回?有待测试……

原文地址:https://www.cnblogs.com/yoru/p/4696316.html