zoukankan      html  css  js  c++  java
  • 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

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

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

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

  • 相关阅读:
    es6学习笔记
    vue.js项目目录结构说明
    js 数组操作总结
    js 数组去重方法
    HTTP协议三次握手过程
    MVC与MVVM模式对比
    谱面编辑器
    LL谱面分析和难度标定
    SLP的模块结构
    LL基本姿势
  • 原文地址:https://www.cnblogs.com/yoru/p/4696316.html
Copyright © 2011-2022 走看看