缓冲区溢出漏洞:

    1. #include <stdio.h>
    2. #include <stdlib.h>
    3. void Printf()
    4. {
    5. printf("hello world");
    6. system("pause");
    7. }
    8. void Magic()
    9. {
    10. int nNum[5] = { 0 };
    11. nNum[7] = (int)Printf; //函数调用的c语言语法:函数名(),没有括号不是调用
    12. } //那Printf没有括号咋调用的?
    13. int main()
    14. {
    15. Magic();
    16. return 0;
    17. }
    18. 结果:hello world
    19. 典型的缓冲区溢出漏洞
    20. DEP(数据保护模式):所有可写的地方都不可执行,所有可执行的地方都不可写
    21. 黑客怎么绕过dep呢?aslr(动态随机机制)
    22. 没有depalsr的时代:06年、07

    image.png
    int nNum[15];指针数组
    数组指针:
    int Num[15];
    int (
    nNum)[15];数组指针,指向15个int型的数组 nNum=Num
    指针函数:int Fun(int nNum,char c)
    函数指针:int (
    Fun)(int nNum,char c); //int (Fun)(int ,char );
    int Abc(int nNum,char c);
    Fun=Abc;
    int nRet=Fun(111,’A’);
    ==================================
    如果参数类型不一样,又要用函数指针指向它,就要强转
    int Add(float fNum);
    Fun=(int (
    )(int,char))Add;
    ==================================
    怎么让强转类型变得简单一点?
    typedef int (PFUN)(int ,char); 继续写可以写全一点:PFUN=Fun;
    Fun=(int (
    )(int,char))Add; //一样
    Fun=(PFUN))Add; //一样

    指针的本质:指针的类型,指针指向数据的类型
    二级指针:指向一级指针的指针
    写程序遵循一条原则:写给人看的,附带给机器运行

    命令行参数:

    1. int main(int argc,char* argv[]) //获取命令参数用的 接受命令的个数,以空格为分隔
    2. //一个个指向字符串的指针,分别指向所给字符串的首地址
    3. // 一个参数传进去实际有两个,
    4. {
    5. printf("%d",argc);
    6. for(i=1;i<argc;i++)
    7. {
    8. printf("%s,argv[i])
    9. }
    10. printf("\n");
    11. system("pause");
    12. return 0;
    13. }

    静态数据区
    已初始化区
    未初始化区
    常量数据区
    代码区
    栈区
    堆区 CPU寄存器组
    为了加快速度常用寄存器变量(register),但是如果使用不频繁也会当初普通变量,不定义register如果使用频繁也会被当成寄存器变量
    系统空间(3环的系统) 0x7000以上
    0x0000~0x1000 空指针区域
    系统内核
    变量的生存期:
    静态生存期
    动态生存期
    。。。
    栈:给函数的局部变量 参数 栈帧 函数的返回地址 不需要自己申请和维护
    堆:除了0x7000以上的地址都可以整成堆,存储数据最主要的一个手段,效率低(cpu都要参与申请操作,能少用就少用,能申请就多申请,违反了高内聚低耦合())
    信息安全有建树:
    1.思想适应社会,脑子跟上(多读书,哪件事傻干哪个)
    2.文字能力(会写文章)
    3.代码简洁 :
    一个函数最多50行
    注释:代码=2:1
    先写注释、空函数
    高内聚低耦合(函数单独拎出来可以运行)
    头文件 里边只放调用其他cpp的

    内存空间的动态分配“坑”
    1.刚刚分配的动态内存的初始值是不确定的
    2.不能对同一指针(地址)连续两次进行free操作
    3.不能对指向静态内存区(全局变量)或站内内存区(局部变量)的指针应用free(但可以对空指针NULL应用free)
    4.对一个指针应用free之后,它的值不会改变,但它指向了一个无效的内存区,这时称该指针为“悬空指针”
    5.执行malloc、new都有一定代价,cpu都要参与申请操作,能少用就少用,能申请就多申请,违反了高内聚低耦合
    6.内存分配未成功,却使用了它
    7.内存分配虽然成功,但是尚未初始化就引用它(误认为初始值为0)
    8.内存分配成功并且已经初始但操作越过了内存的边界
    9.忘记了释放内存,造成内存泄漏
    10.释放了内存却继续使用它
    内存拷贝函数、内存初始化函数:

    1. #include <stdio.h>
    2. #include <stdlib.h>
    3. #include <string.h>
    4. #
    5. int main()
    6. {
    7. int flag = 0;
    8. char buf[8] = { 0 };
    9. char pass[12] = { 0 };
    10. while (true)
    11. {
    12. scanf_s("%s", pass);
    13. flag = strcmp(PASSWORD, pass);
    14. strcpy(buf, pass);
    15. if (!flag)
    16. {
    17. printf("hello");
    18. system("pause");
    19. }
    20. }
    21. }
    1. #include <stdio.h>
    2. #include <stdlib.h>
    3. #include <string.h>
    4. #include <cstdarg>
    5. void myArg(int nTag, ...)
    6. {
    7. void* argpointer; //定义变参指针
    8. argpointer = (void*)&nTag;
    9. int nCount = 0;
    10. while (true)
    11. {
    12. argpointer = (char*)(((int)argpointer) * sizeof(int));
    13. char argData = *(argpointer);
    14. if (argData == 0) break;
    15. printf("param %d is: $d\n", nCount++, argData);
    16. }
    17. argpointer = nullptr; //结束变参指针
    18. }
    19. void funArg(int nTag, ...)
    20. {
    21. va_list argpointer;
    22. va_start(argpointer, nTag);
    23. int nCount = 0;
    24. while (true)
    25. {
    26. char argData = va_arg(argpointer, int);
    27. if (argData == 0) break;
    28. printf("param %d is: $d\n", nCount++, argData);
    29. }
    30. va_end(argpointer);
    31. }
    32. int main()
    33. {
    34. funArg(1, 2, 3, 4, 56, 7, 0);
    35. return 0;
    36. }

    文件访问的基本模式————-文件指针
    c语言提供的:库函数
    windows提供的:api
    typedef struct
    {
    short level 缓冲区满或空的程度
    unsigned flags 文件状态标志
    char fd 文件描述符
    unsigned char hold 如无缓冲区不读字符
    short bsize 缓冲区的大小
    unsigned char buffer 数据缓冲区的位置
    unsigned char
    curp 指针当前的指向
    unsigned istemp 临时文件指示器
    short token 用于有效性检查
    }FILE;