• 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

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

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

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

  • 相关阅读:
    禅道开源版本安装
    NATAPP内网穿透实现
    nginx部署前端项目
    docker-compose部署微服务
    python编写猜数字游戏
    Linux命令(用户管理、组和时间管理)
    Linux命令(文本编辑器)
    Linux的简单命令(防火墙篇)
    什么是泛型
    spring bean 的作用域之间有什么区别
  • 原文地址:https://www.cnblogs.com/yoru/p/4696316.html
Copyright © 2020-2023  润新知