C/C++典型漏洞产生原理与Demo

本文探讨C/C++编程中的常见漏洞,如栈溢出、堆溢出、整数溢出等,解释了它们的产生原理和可能导致的安全后果。栈溢出通过覆盖函数返回地址实现控制流劫持,堆溢出更为复杂,整数溢出可能导致内存安全问题。此外,还提到了格式化字符串漏洞、UAF漏洞和Double Free漏洞,这些都是C/C++程序中的安全隐患。
摘要由CSDN通过智能技术生成

本篇主要是自己学习笔记,快速读了下泉哥的《漏洞战争》的读书笔记。这里只涉及漏洞产生原理,即漏洞是怎么写出来。至于怎么分析0Day,怎么写代码执行的exp,后续将做深入研究。

C/C++的代码执行漏洞,很多时候是劫持程序的控制流。具体来说:对于C程序,一般是控制函数的返回地址,让程序跳转到我们指定的地方执行。对于C++程序,除了覆盖函数返回地址外,还可以覆盖虚函数表,在调用虚函数的时候,程序将到指定内存处执行。

一、栈溢出漏洞

栈溢出漏洞原理十分简单,只需要了解C语言函数调用时程序的内存结构即可。一句话总结,可控的参数覆盖了函数的返回地址。

#include<stdio.h>
#include<string.h>
void vulfunc(char* str){
    char src[10];
    strcpy(src,str);
}
int main(){
    char* str="AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA";
    vulfunc(str);
    return;
}

执行程序,程序将crash,并触发Segmentation fault错误。

二、堆溢出漏洞

堆溢出漏洞和栈溢出漏洞原理类似,但是比栈溢出复杂得多,后面单独介绍原理。

#include<stdlib.h>
#include<string.h>
int main(int argc,char* argv[]){
    char* first,second;
    first = malloc(100);
    second = malloc(12);
    if(argc>1){
        strcpy(first,argv[1]);
    }
    free(fisrt);
    free(second);
    return 0;
}

同样程序执行时,触发Segmentation fault错误而crash掉。

三、整数溢出

C/C++非内存安全行语言,当输入的整数超出整数的取值范围时,编译器并不会报出错误,但是程序执行时,可能造成严重的安全后果。不过最终导致代码执行,还是归因到栈溢出或者堆溢出。


                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值