赞
踩
本篇主要是自己学习笔记,快速读了下泉哥的《漏洞战争》的读书笔记。这里只涉及漏洞产生原理,即漏洞是怎么写出来。至于怎么分析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++非内存安全行语言,当输入的整数超出整数的取值范围时,编译器并不会报出错误,但是程序执行时,可能造成严重的安全后果。不过最终导致代码执行,还是归因到栈溢出或者堆溢出。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。